Skip to content

Releases: charmbracelet/bubbletea

v0.26.2

08 May 20:23
v0.26.2
Compare
Choose a tag to compare

This fixes a small regression that was introduced in v0.26.0 related to the first line on the first render not being displayed correctly. Thank you @mistakenelf for pointing this out in #1000!

What's Changed

Full Changelog: v0.26.1...v0.26.2


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.26.1

02 May 19:16
v0.26.1
f946f1a
Compare
Choose a tag to compare

This is a quick one to fix a Windows shortcoming in the last release acutely identified by our pal @jon4hz. Thank you!

What's Changed

  • fix: support more shift and ctrl modifiers on windows by @jon4hz in #995

Full Changelog: v0.26.0...v0.26.1


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.26.0

02 May 14:53
v0.26.0
21881ab
Compare
Choose a tag to compare

Bracketed Paste, Windows Improvements, Mainframes, and more

What do tapioca balls, IBM mainframes, and the Microsoft Windows Console API have in common? Bubble Tea v0.26.0, that’s what. Let’s get to it.

⚑️ Windows Input Improvements

A few years ago @erikgeiser, a penetration tester and ex-particle physicist, wrote this awesome library called coninput to majorly improve Bubble Tea input on Windows. @aymanbagabas has implemented the library in Bubble Tea and input on Windows is roughly 1000 times better now. In the short term, this means that for Windows users inputting non-Latin characters (like Greek, Cyrillic, Korean, Chinese and so on) stuff will β€œjust work.”

The bigger news, however, is that this paves the way for Windows parity with our forthcoming support for super high fidelity input via Kitty Keyboard and Fixterms.

🍳 Hot Windows Resize Events

Terminal emulators on Windows don’t support the SIGWINCH signal, which is sent when the terminal is resized. It’s been a huge bummer for a really long time. Thanks (again) to @erikgeiser and @aymanbagabas, we’re now able to reach deep into Windows’ underpinnings, detect window resizes, and send tea.WindowSizeMsgs accordingly! This is a glorious moment for Bubble Tea on Windows indeed.

🫠 Bracketed Paste

While building a query editor for a CockroachDB client, @knz noticed that Bubble Tea didn't support Bracketed Paste. Performance-wise, that sucks because it means pasting large bodies of text (like SQL queries) will normally be seen as a bunch of little successive keypresses. That’s where Bracketed Paste comes in. When enabled at the terminal-level Bracketed Paste lets you slam down a bunch of text with one big, fat input event.

Bubble Tea enables bracketed paste by default, however you can opt out of it with the WithoutBracketedPaste() program option:

p := tea.NewProgram(myCuteModel, tea.WithoutBracketedPaste())

You can also enable and disable it on demand with the EnableBracketedPaste() and DisableBracketedPaste() commands.

🌿 Multiline tea.Println

In case you forgot, tea.Println (and it’s brother tea.Printf) is a Cmd that lets you print unmanaged output above a Bubble Tea program, similar to what you see with package managers like apt-get. Thanks to @Adjective-Object (who also implemented tea.Println in the first place) now you can send multi-line output, too. For a tea.Println refresher see the package manager example.

πŸ“€ Hello, z/OS

Don’t you think it’s about time we all ran Bubble Tea apps on our mainframes? Thanks to @dustin-ward that dream is now a reality, so long as you have a z/OS mainframe. We're thrilled to announce that Bubble Tea is now fully supported on z/OS.

🌹 Bug fixes

Bugfixes are the unsung heroes that sometimes get buried below the feature listings. This release has them and they’re good ones; see the changelog below for details.

Changelog

New!

Changed

Fixed

New Contributors

Full Changelog: v0.25.0...v0.25.1


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.25.0

12 Dec 20:42
v0.25.0
e671b84
Compare
Choose a tag to compare

Major mouse improvements, better input parsing, and lots more!

We hope you’re ready for winter. Unless you’re in the southern hemisphere (like @caarlos0) in which case, we hope you’re ready for summer. In either case, we hope you have a happy new year if the Julian calendar is something you’re into.

There are a bunch of good features in this release and a ton of input-related improvements. Read on for more!

Extended Mouse Mode

Bubble Tea now supports Extended Mouse Mode (aka SGR mode) which makes now mouse support in Bubble Tea way, way better.

Prior to this release Bubble Tea used the X10 mouse protocol. X10 was last released in 1986: a time when screen resolutions were smaller, memory limits were low, and a terminal sizes were tiny. For terminals and mice this meant that the mouse tracking stopped after the 127th horizontal cell. Well, thanks to the elite abilities of @aymanbagabas Bubble Tea can now track mouse movements across the entire terminal window, no matter how enormous.

And that's not all: Bubble Tea now has higher fidelity access to mouse operations such as shift, ctrl, and alt modifiers, mouse button release events, and a big range of mouse button and mouse wheel events.

For details see the docs for the new and improved MouseEvent.

Setting the Window Title

@aymanbagabas also wanted to be able to set the terminal window title with Bubble Tea, so he added the SetWindowTitle Cmd. Now setting the window title is as simple as:

func (m Model) Update(msg tea.Msg) (tea.Model. tea.Cmd) {
    return m, tea.SetWindowTitle("oh my")
}

FPS Control

Have you ever thought β€œBubble Tea is too fast and I just can’t handle it?” Or perhaps 60fps is too slow and you want to go full 120fps. Now, thanks to @tomfeigin’s WithFPS ProgramOption you can:

// Let’s go with the classic soap opera frame rate
p := tea.NewProgram(model, tea.WithMaxFPS(45))

Better Input, Better Living

@knz is just incredible. He took a look at Bubble Tea’s input parser and whipped it into shape with what felt like a flick of the wrist. Keyboard input is now more efficient than ever and very large amounts of input can be parsed with the greatest of ease. It's hard to overstate how impactful his contributions areβ€”and there are more in the pipe.

Changelog

New!

Fixed

  • Invert the key parsing control loop by @knz in #569
  • Simplify the key input analysis code by @knz in #568
  • Support very long buffered input in key parsing by @knz in #570
  • Make ReleaseTerminal/RestoreTerminal thread safe by @caarlos0 in #791

Full Changelog: v0.24.2...v0.25.0

New Contributors


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.24.2

06 Jun 09:02
Compare
Choose a tag to compare

This point release fixes a race condition that could occur when stopping the default renderer:

  • fix: stop renderer before acquiring mutex by @muesli in #757

Full Changelog: v0.24.1...v0.24.2


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.24.1

24 May 16:45
v0.24.1
c267762
Compare
Choose a tag to compare

You can pipe again

This point release fixes a regression introduced in v0.24.0 in which keyboard and mouse input would be lost when piping and redirecting into a program with default inputs. Special thanks to @pomdtr for…piping up about the regression.

  • fix: auto-open a TTY when stdin is not a TTY (regression) by @meowgorithm in #746

Full Changelog: v0.24.0...v0.24.1


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.24.0

08 May 17:44
v0.24.0
Compare
Choose a tag to compare

It is finally time for another Bubble Tea release!

This release contains 31 commits by 14 contributors. Thank you everyone! πŸ’•

Without further ado, here's a list of the most important changes:

Message handling and filtering

The tea.QuitMsg is now exported and you can use tea.WithFilter to filter which messages your model will receive:

func filter(m tea.Model, msg tea.Msg) tea.Msg {
  if _, ok := msg.(tea.QuitMsg); !ok {
      return msg
  }

  model := m.(myModel)
  if model.hasChanges {
      return nil
  }

  return msg
}

p := tea.NewProgram(Model{}, tea.WithFilter(filter));

if _,err := p.Run(); err != nil {
  fmt.Println("Error running program:", err)
  os.Exit(1)
}

Testing

We are introducing an our very own /x package, which contains the teatest package.

With teatest, you can easily run a tea.Program, assert its final model and/or output.

This package required a couple of new methods on Bubble Tea, namely Program.Wait(), WithoutSignals.

You can see an example usage in the simple example.

Bug fixing

We try hard to not let any of them pass, but we know, sometimes a few of them do. This release also gets rid of a bunch of them.

What's Changed

New Contributors

Full Changelog: v0.23.2...v0.24.0


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.23.2

08 Feb 15:23
Compare
Choose a tag to compare

Hello Bugfixes

This is a small maintenance release with two small but acute fixes from our wonderful community. Thanks for the support! πŸ’˜

Fixed

  • Ensure Msg Cmd is not nil before invoking (to avoid a nil pointer exception) by @nderjung in #640
  • Add support for BatchMsg to Sequence by @stoffeastrom in #581

The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.23.1

15 Nov 15:14
94d6f50
Compare
Choose a tag to compare

This bugfix release addresses an issue that was introduced by v0.23.0 and prevented programs from re-using stdin after a tea.Program had finished execution.


Changelog

Fixed!


The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.

v0.23.0

09 Nov 17:24
Compare
Choose a tag to compare

If you are closely following Bubble Tea's development, you may have already noticed that we have been really busy fixing a lot of issues and merged more than just a couple of feature requests in recent weeks. This v0.23.0 release is in fact our biggest update since the initial release of the package: in the last 3 months over 100 commits have reached us by more than 30 individual contributors! Thank you everyone! πŸ’•

Here's a quick overview of what has changed:

Custom Outputs

Don't want to render your beautiful TUI to stdout? A buffer or an alternative file descriptor like stderr seems more
appropriate? We got you covered now:

Render to stderr

p := tea.NewProgram(model, tea.WithOutput(os.Stderr))

Render to a Buffer

var buf bytes.Buffer
p := tea.NewProgram(model, tea.WithOutput(&buf))

Run Like the Wind

We've introduced the aptly named method Program.Run which replaces and deprecates the existing Program.Start and
Program.StartReturningModel methods. This unifies and clarifies the blocking behavior of the Bubble Tea program execution.

The old methods will continue to work for now, but please update your programs accordingly:

p := tea.NewProgram(model, tea.WithOutput(os.Stderr))
model, err := p.Run() // instead of p.Start or p.StartReturningModel
...

Bug Fix Galore!

The initialization and tear-down methods of tea.Program have been revised and some long-standing problems have been resolved. We couldn't list every single fix in the release notes, so please check out the full changelog below!

πŸ€— Thanks

We would like to particularly thank @knz who is the sole author of more than a dozen PRs since the last release. Outstanding work!


Changelog

New

  • Render to custom outputs, io.Writers and buffers (tea.WithOutput)
  • Support for new keys: Ctrl(+Alt) - Page, Home, End, and Insert keys
  • Signal handler is optional with program option tea.WithoutSignalHandler
  • tea.ClearScreen, tea.ShowCursor commands
  • Exported BatchMsg

Fixed!

  • Race conditions in console renderer
  • Issues restoring terminal state on shutdown
  • Kill not resulting in an error returned by Program.Run
  • Repaint behavior
  • Skip over unrecognized CSI sequences
  • Function keys on urxvt
  • Function keys on Linux console
  • Rendering issues with overflowing output buffers
  • Ensure final render on clean shutdown
  • Cursor visibility on altscreen state switch
  • Deadlock in Program.Send on shutdown

Deprecated

  • Program.Start, Program.StartReturningModel: please use Program.Run

The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or Discord.