Skip to content

feat: tree bubble - #893

Merged
andrinoff merged 4 commits into
charmbracelet:mainfrom
dlvhdr:dlvhdr/tree-bubble
Aug 21, 2026
Merged

andrinoff merged 4 commits into
charmbracelet:mainfrom
dlvhdr:dlvhdr/tree-bubble

Conversation

@dlvhdr

@dlvhdr dlvhdr commented Feb 27, 2026 •

Copy link
Copy Markdown
Contributor
  • I have read CONTRIBUTING.md.
  • I have created a discussion that was approved by a maintainer (for new features).

@dlvhdr
dlvhdr requested a review from meowgorithm as a code owner February 27, 2026 11:36
@dlvhdr
dlvhdr changed the base branch from main to master February 27, 2026 11:37
@dlvhdr
dlvhdr force-pushed the dlvhdr/tree-bubble branch from 34a0a7b to ba6f094 Compare February 27, 2026 11:40
@dlvhdr dlvhdr mentioned this pull request Feb 27, 2026
@dlvhdr

dlvhdr commented Mar 28, 2026

Copy link
Copy Markdown
Contributor Author

@andreynering I see 2.1 was released. Just checking, is this planned for 2.2?

@dlvhdr

dlvhdr commented May 4, 2026

Copy link
Copy Markdown
Contributor Author

Anything else needed here @andreynering ?

@dlvhdr
dlvhdr force-pushed the dlvhdr/tree-bubble branch from ba6f094 to 8519a5d Compare June 19, 2026 13:45
@dlvhdr
dlvhdr changed the base branch from master to main June 19, 2026 13:50

@andrinoff andrinoff left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your contribution!

On top of the comments below, there's no bubble tree added in README!

Comment thread tree/styles.go Outdated
Comment thread tree/tree.go Outdated
Comment thread tree/node.go
Comment thread tree/tree.go
Comment thread tree/tree.go
Comment thread tree/styles.go Outdated
Comment thread tree/styles.go Outdated
Comment thread tree/styles.go Outdated
Comment thread tree/styles.go
Comment on lines +58 to +61
s.nodeFunc = func(_ Nodes, _ int) lipgloss.Style {
return s.NodeStyle
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dead code due to SetStyles overriding either way? (unsure)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this will be overwritten only when the user calls SetStyles with styles.NodeStyleFunc, which the default don't set.

Comment thread tree/node.go
Comment thread go.mod Outdated

@andrinoff andrinoff left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a little more!

p.s. lint fails

Comment thread list/keys.go Outdated
Comment thread tree/tree.go
Comment on lines +562 to +569
func (m Model) cursorView() string {
if m.cursorCharacter == "" {
return ""
}
cursor := strings.Split(strings.Repeat(" ", m.root.Size()), "")
cursor[m.yOffset] = m.cursorCharacter
return m.styles.CursorStyle.Render(lipgloss.JoinVertical(lipgloss.Left, cursor...))
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

draws one cursor row per node, but the tree renders one row per line. those are the same number only if every node is exactly one line tall.

@dlvhdr dlvhdr Aug 18, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm I haven't tested multi line nodes. I can try and support that, but I never tested that. Is that something you're interested in?
A lot of the implementation assumes this, so it will probably not be straightforward, but it is a cool idea.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2026-08-19.12-22-21.mp4

this is a nit, but at the same time i can imagine a user creating a multi-line node, or even having word-wrapping.

It shouldn't be that hard to fix, from what i've seen

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, I'll give it a shot.
Do note that it will make the yOffset calculation for each node more taxing though, since we'll need to call lipgloss.Height on each node.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've had at it for a couple of hours but couldn't find an elegant solution for multiline items.
When going "up" (to the previous item, not necessarily the parent) the tree, I would need to know the height of the previous item. I can maintain a bunch of pointers and maintain them and on every interaction update them. I couldn't manage to hack this.

I also tried modifying the current slow implementation of maintaning the yOffsets.
I faced an issue with scrolling the viewport. By how much should I scroll it when a line is 50 lines long? The user would probably want to scroll it independently of the tree. We'd then have to add more keybinds if we want.

Maybe there's some intuitive solution to this that I'm too tired to think of.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did end up hacking this with the existing yOffset implementation.
Not sure how I feel about the up/down not going to the previous/next item, but maybe it makes sense?

Screen.Recording.2026-08-19.at.22.52.40.mov

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hm, it seems like a clanky hack, where it does not go to the next/previous item... I'll try something out

Comment thread tree/tree.go Outdated
Comment thread tree/node.go
Comment thread tree/tree.go Outdated
@dlvhdr

dlvhdr commented Aug 18, 2026 •

Copy link
Copy Markdown
Contributor Author

@andrinoff I've fixed the small comments. For the two big comment, let me know how you want to proceed.

  • We can always test the perf on a big tree to see how important it is. For my use cases in diffnav it works great but I admit I haven't put it to a large data set test.
  • For the multi line case

@andrinoff

Copy link
Copy Markdown
Member

let's fix multi-lines. we can leave performance as is for now, i'll still be improving performance across elements

@andrinoff

Copy link
Copy Markdown
Member

@dlvhdr got it working!

@dlvhdr

dlvhdr commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@andrinoff just tested it on diffnav and it works great!

Dolev Hadar and others added 4 commits August 21, 2026 11:19
refactor

test: add basic tests
Signed-off-by: drew <me@andrinoff.com>
@andrinoff
andrinoff merged commit e97af08 into charmbracelet:main Aug 21, 2026
11 checks passed
dgalanberasaluce pushed a commit to dgalanberasaluce/maximus-cli that referenced this pull request Sep 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [charm.land/bubbles/v2](https://github.com/charmbracelet/bubbles) | `v2.1.1` → `v2.2.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/charm.land%2fbubbles%2fv2/v2.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/charm.land%2fbubbles%2fv2/v2.1.1/v2.2.1?slim=true) |
| [charm.land/bubbletea/v2](https://github.com/charmbracelet/bubbletea) | `v2.0.8` → `v2.0.9` | ![age](https://developer.mend.io/api/mc/badges/age/go/charm.land%2fbubbletea%2fv2/v2.0.9?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/charm.land%2fbubbletea%2fv2/v2.0.8/v2.0.9?slim=true) |
| [charm.land/lipgloss/v2](https://github.com/charmbracelet/lipgloss) | `v2.0.5` → `v2.0.6` | ![age](https://developer.mend.io/api/mc/badges/age/go/charm.land%2flipgloss%2fv2/v2.0.6?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/charm.land%2flipgloss%2fv2/v2.0.5/v2.0.6?slim=true) |
| [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) | `v1.14.49` → `v1.14.52` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fmattn%2fgo-sqlite3/v1.14.52?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fmattn%2fgo-sqlite3/v1.14.49/v1.14.52?slim=true) |

---

### Release Notes

<details>
<summary>charmbracelet/bubbles (charm.land/bubbles/v2)</summary>

### [`v2.2.1`](https://github.com/charmbracelet/bubbles/releases/tag/v2.2.1)

[Compare Source](charmbracelet/bubbles@v2.2.0...v2.2.1)

### Tiny Monday bugfix

Textarea element had a bug, where you used to be able to go 1 word backwards, even if there was nothing, which resulted in the whole TUI freezing. It was now fixed by [@&#8203;OxQuasar](https://github.com/OxQuasar)!

#### Changelog

##### Fixed

- [`f613411`](charmbracelet/bubbles@f613411): fix(textarea): stop word-left at input boundary ([#&#8203;1036](charmbracelet/bubbles#1036)) ([@&#8203;OxQuasar](https://github.com/OxQuasar))

##### Docs

- [`87d4458`](charmbracelet/bubbles@87d4458): docs: update godoc link in readme to new package ([@&#8203;meowgorithm](https://github.com/meowgorithm))

##### Other stuff

- [`10489b5`](charmbracelet/bubbles@10489b5): readme: drop tree section for now ([@&#8203;meowgorithm](https://github.com/meowgorithm))
- [`4909481`](charmbracelet/bubbles@4909481): v2.2.1 ([@&#8203;andrinoff](https://github.com/andrinoff))

***

<a href="https://charm.land/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-next.jpg" width="400"></a>

Thoughts? Questions? We love hearing from you. Feel free to reach out on [X](https://x.com/charmcli), [Discord](https://charm.land/discord), [Slack](https://charm.land/slack), [The Fediverse](https://mastodon.social/@&#8203;charmcli), [Bluesky](https://bsky.app/profile/charm.land).

### [`v2.2.0`](https://github.com/charmbracelet/bubbles/releases/tag/v2.2.0)

[Compare Source](charmbracelet/bubbles@v2.1.1...v2.2.0)

### A new Bubble and some new Textarea stuff

There are a couple nice features in today's release. Let's check em out!

#### If a tree falls in the forest…

At last, the tree Bubble from all star contributor [@&#8203;dlvhdr](https://github.com/dlvhdr)’s is here! He built it for [DiffNav](https://github.com/dlvhdr/diffnav) and graciously contributed to Bubbles. We've been working with Dolev for a long time and were totally stoked when he offerd to contribute.

<p><img width="500" src="https://github.com/user-attachments/assets/10f36c36-4669-45ef-b957-f214ca27c34f" /></p>

#### Select all, ctrl+c, ctrl+v…done!

Our own [@&#8203;andrinoff](https://github.com/andrinoff) added a bunch of awesome stuff to Textarea, including the long awaited *text selection*. Select, copy, and cut your way into mini text editing.

<p><img width="600" src="https://github.com/user-attachments/assets/49b241cb-468a-483a-8ace-5d0742869cd9" /></p>

For more info see [the docs](https://pkg.go.dev/charm.land/bubbles/v2@&#8203;v2.2.0/textarea).

And special thanks to [@&#8203;zoriya](https://github.com/zoriya) for adding <kbd>ctrl+left/right</kbd> bindings.

xoxo,
Charm! 💌

#### Changelog

##### New!

- [`8cea431`](charmbracelet/bubbles@8cea431): feat(textarea): support ctrl + left/right/backspace ([#&#8203;1020](charmbracelet/bubbles#1020)) ([@&#8203;zoriya](https://github.com/zoriya))
- [`037ad37`](charmbracelet/bubbles@037ad37): feat: textarea selection ([#&#8203;1029](charmbracelet/bubbles#1029)) ([@&#8203;andrinoff](https://github.com/andrinoff))
- [`e97af08`](charmbracelet/bubbles@e97af08): feat: tree bubble ([#&#8203;893](charmbracelet/bubbles#893)) ([@&#8203;dlvhdr](https://github.com/dlvhdr))

##### Fixed

- [`6484e49`](charmbracelet/bubbles@6484e49): fix(filepicker): don't blank the view when height is unset ([#&#8203;1026](charmbracelet/bubbles#1026)) ([@&#8203;andrinoff](https://github.com/andrinoff))

##### Other stuff

- [`355f960`](charmbracelet/bubbles@355f960): ci: sync dependabot config ([#&#8203;896](charmbracelet/bubbles#896)) ([@&#8203;charmcli](https://github.com/charmcli))
- [`ef8af03`](charmbracelet/bubbles@ef8af03): v2.2.0 ([@&#8203;andrinoff](https://github.com/andrinoff))

***

<a href="https://charm.land/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-next.jpg" width="400"></a>

Thoughts? Questions? We love hearing from you. Feel free to reach out on [X](https://x.com/charmcli), [Discord](https://charm.land/discord), [Slack](https://charm.land/slack), [The Fediverse](https://mastodon.social/@&#8203;charmcli), [Bluesky](https://bsky.app/profile/charm.land).

</details>

<details>
<summary>charmbracelet/bubbletea (charm.land/bubbletea/v2)</summary>

### [`v2.0.9`](https://github.com/charmbracelet/bubbletea/releases/tag/v2.0.9)

[Compare Source](charmbracelet/bubbletea@v2.0.8...v2.0.9)

### Small patches 🩹

#### Keybinds missing!

MouseButton11 and media record buttons were improperly handled, now fixed! (thanks to [@&#8203;Ricardo-M-L](https://github.com/Ricardo-M-L) and [@&#8203;bunlongheng](https://github.com/bunlongheng))

#### Weird UI artifacts with some terminals 👽

Sometimes, when switching between tabs in your terminal for example, the screen would not clear, now fixed!

... And some small corrections to docs!

Happy coding 🤖

#### Changelog

##### Fixed

- [`dc4b017`](charmbracelet/bubbletea@dc4b017): fix(key): map media record to ultraviolet code ([#&#8203;1757](charmbracelet/bubbletea#1757)) ([@&#8203;Ricardo-M-L](https://github.com/Ricardo-M-L))
- [`1862dfb`](charmbracelet/bubbletea@1862dfb): fix: assign MouseButton11 = uv.MouseButton11 ([#&#8203;1754](charmbracelet/bubbletea#1754)) ([@&#8203;bunlongheng](https://github.com/bunlongheng))
- [`930e18c`](charmbracelet/bubbletea@930e18c): fix: don't panic in ProgressBarState.String() for out-of-range values ([#&#8203;1748](charmbracelet/bubbletea#1748)) ([@&#8203;ankit090701](https://github.com/ankit090701))
- [`faf4dcf`](charmbracelet/bubbletea@faf4dcf): fix: pendingErase in cursedRenderer ([#&#8203;1755](charmbracelet/bubbletea#1755)) ([@&#8203;andrinoff](https://github.com/andrinoff))
- [`0d3e281`](charmbracelet/bubbletea@0d3e281): fix: restore kitty keyboard stack on exit ([#&#8203;1750](charmbracelet/bubbletea#1750)) ([@&#8203;deepakganesh78](https://github.com/deepakganesh78))
- [`0ef9fc9`](charmbracelet/bubbletea@0ef9fc9): fix: typo in doc ([#&#8203;1756](charmbracelet/bubbletea#1756)) ([@&#8203;andrinoff](https://github.com/andrinoff))

##### Docs

- [`d40db14`](charmbracelet/bubbletea@d40db14): docs: fix background color detection example in doc comment ([@&#8203;meowgorithm](https://github.com/meowgorithm))
- [`882727b`](charmbracelet/bubbletea@882727b): docs: fix links to tutorials & examples ([#&#8203;1645](charmbracelet/bubbletea#1645)) ([@&#8203;mhdna](https://github.com/mhdna))

##### Other stuff

- [`708ee75`](charmbracelet/bubbletea@708ee75): ci: fix examples workflow ([#&#8203;1734](charmbracelet/bubbletea#1734)) ([@&#8203;kobihikri](https://github.com/kobihikri))
- [`351d215`](charmbracelet/bubbletea@351d215): ci: sync dependabot config ([#&#8203;1763](charmbracelet/bubbletea#1763)) ([@&#8203;charmcli](https://github.com/charmcli))
- [`6fb1f47`](charmbracelet/bubbletea@6fb1f47): examples/sequence: fix milisecond typo in SleepPrintln ([@&#8203;makoto-developer](https://github.com/makoto-developer))
- [`73b6d91`](charmbracelet/bubbletea@73b6d91): v2.0.9 ([@&#8203;andrinoff](https://github.com/andrinoff))

***

<a href="https://charm.land/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-next.jpg" width="400"></a>

Thoughts? Questions? We love hearing from you. Feel free to reach out on [X](https://x.com/charmcli), [Discord](https://charm.land/discord), [Slack](https://charm.land/slack), [The Fediverse](https://mastodon.social/@&#8203;charmcli), [Bluesky](https://bsky.app/profile/charm.land).

</details>

<details>
<summary>charmbracelet/lipgloss (charm.land/lipgloss/v2)</summary>

### [`v2.0.6`](https://github.com/charmbracelet/lipgloss/releases/tag/v2.0.6)

[Compare Source](charmbracelet/lipgloss@v2.0.5...v2.0.6)

### Devanagari, auto-grapheme mode, and more

Hi! The big news in this release is that Lip Gloss now properly renders Devanagari (Hindi)! Beyond that—or perhaps as a result—Lip Gloss will now switch to mode 2027 for grapheme support when possible.

There's other good stuff too. Let's go!

#### क्या हाल है?

Hindi speakers, it's about time! Lip Gloss and Ultraviolet now properly renders Devanagari. That means Bubble Tea will as well.

<img width="434" height="198" alt="Screenshot 2026-08-12 at 10 12 14" src="https://github.com/user-attachments/assets/9d7e58be-baf6-425c-ae4e-9aafde1d9a89" />

This brings us to…

#### Cyberpunk 2027

Lip Gloss (and Ultraviolet) now asks the terminal at startup whether it supports Unicode core mode (DEC mode 2027), and when it does, measures widths the same way the terminal does. We did this for Devanagari but it also means Emojis and things render better now too. Let's go!

#### Shrinky tables: not anymore

Columns no longer shrink to zero width. Thanks, [@&#8203;taciturnaxolotl](https://github.com/taciturnaxolotl)!

***

#### Changelog

##### Fixed

- [`d231906`](charmbracelet/lipgloss@d231906): fix(table): prevent columns from shrinking to zero width ([#&#8203;671](charmbracelet/lipgloss#671)) ([@&#8203;taciturnaxolotl](https://github.com/taciturnaxolotl))

***

<a href="https://charm.land/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-next.jpg" width="400"></a>

Thoughts? Questions? We love hearing from you. Feel free to reach out on [X](https://x.com/charmcli), [Discord](https://charm.land/discord), [Slack](https://charm.land/slack), [The Fediverse](https://mastodon.social/@&#8203;charmcli), [Bluesky](https://bsky.app/profile/charm.land).

</details>

<details>
<summary>mattn/go-sqlite3 (github.com/mattn/go-sqlite3)</summary>

### [`v1.14.52`](https://github.com/mattn/go-sqlite3/releases/tag/v1.14.52): 1.14.52

[Compare Source](mattn/go-sqlite3@v1.14.51...v1.14.52)

#### What's Changed

- Replace schema probe with eager first step for cached statements by [@&#8203;mattn](https://github.com/mattn) in [#&#8203;1454](mattn/go-sqlite3#1454)

**Full Changelog**: <mattn/go-sqlite3@v1.14.51...v1.14.52>

### [`v1.14.51`](https://github.com/mattn/go-sqlite3/releases/tag/v1.14.51): 1.14.51

[Compare Source](mattn/go-sqlite3@v1.14.50...v1.14.51)

#### What's Changed

- fix: Exec returns wrong arg count in "not enough args" error by [@&#8203;semihbkgr](https://github.com/semihbkgr) in [#&#8203;1396](mattn/go-sqlite3#1396)
- refactor: Clean up deprecated // +build legacy build tags by [@&#8203;zxysilent](https://github.com/zxysilent) in [#&#8203;1428](mattn/go-sqlite3#1428)
- Fixed som typos and wrappings in sqlite3\_func\_crypt.go documentation. by [@&#8203;kberov](https://github.com/kberov) in [#&#8203;1367](mattn/go-sqlite3#1367)
- Replace copy-on-write handle map with sync.Map by [@&#8203;mattn](https://github.com/mattn) in [#&#8203;1453](mattn/go-sqlite3#1453)
- Avoid per-row goroutines for query cancellation by [@&#8203;bradengroom](https://github.com/bradengroom) in [#&#8203;1444](mattn/go-sqlite3#1444)
- Flush statement cache when the schema changes by [@&#8203;mattn](https://github.com/mattn) in [#&#8203;1452](mattn/go-sqlite3#1452)

#### New Contributors

- [@&#8203;semihbkgr](https://github.com/semihbkgr) made their first contribution in [#&#8203;1396](mattn/go-sqlite3#1396)
- [@&#8203;zxysilent](https://github.com/zxysilent) made their first contribution in [#&#8203;1428](mattn/go-sqlite3#1428)
- [@&#8203;kberov](https://github.com/kberov) made their first contribution in [#&#8203;1367](mattn/go-sqlite3#1367)
- [@&#8203;bradengroom](https://github.com/bradengroom) made their first contribution in [#&#8203;1444](mattn/go-sqlite3#1444)

**Full Changelog**: <mattn/go-sqlite3@v1.14.50...v1.14.51>

### [`v1.14.50`](https://github.com/mattn/go-sqlite3/releases/tag/v1.14.50): 1.14.50

[Compare Source](mattn/go-sqlite3@v1.14.49...v1.14.50)

#### What's Changed

- Handle NULL and BLOB values in json example Scan by [@&#8203;mattn](https://github.com/mattn) in [#&#8203;1441](mattn/go-sqlite3#1441)
- Add workflow to create releases on tag push by [@&#8203;mattn](https://github.com/mattn) in [#&#8203;1443](mattn/go-sqlite3#1443)
- fix: keep vtab handle registered when xDestroy fails by [@&#8203;canesin](https://github.com/canesin) in [#&#8203;1446](mattn/go-sqlite3#1446)

#### New Contributors

- [@&#8203;canesin](https://github.com/canesin) made their first contribution in [#&#8203;1446](mattn/go-sqlite3#1446)

**Full Changelog**: <mattn/go-sqlite3@v1.14.49...v1.14.50>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My43My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: https://forgejo.internal/forgejo_admin/maximus/pulls/22
GianmariaZorzetto pushed a commit to GianmariaZorzetto/bubbles that referenced this pull request Sep 7, 2026
Co-authored-by: Dolev Hadar <dolev@komodor.io>
Co-authored-by: drew <me@andrinoff.com>
Signed-off-by: drew <me@andrinoff.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature request: Tree model

4 participants