diff --git a/src/view/components/elements/TreeView.test.tsx b/src/view/components/elements/TreeView.test.tsx
index 306802a4..da44ced6 100644
--- a/src/view/components/elements/TreeView.test.tsx
+++ b/src/view/components/elements/TreeView.test.tsx
@@ -1,6 +1,6 @@
import { h } from "preact";
import { render } from "@testing-library/preact";
-import { TreeItem } from "./TreeView";
+import { HocLabels, TreeItem } from "./TreeView";
import { expect } from "vitest";
import { AppCtx } from "../../store/react-bindings";
import { createStore } from "../../store";
@@ -39,4 +39,54 @@ describe("TreeItem", () => {
expect(container.textContent).to.equal('foo key="foobar",');
});
+
+ it("should collapse overflowing HOC labels behind a count badge", () => {
+ const { container } = render(
+ ,
+ );
+
+ const labels = container.querySelectorAll('[data-hoc-kind="label"]');
+ expect(labels).to.have.length(2);
+ expect(labels[0].textContent).to.equal("withFoo");
+ expect(labels[1].textContent).to.equal("withBar");
+ expect(
+ container.querySelector('[data-hoc-kind="overflow"]')?.textContent,
+ ).to.equal("+2");
+ });
+
+ it("should show only the HOC count badge when maxVisible is 0", () => {
+ const { container } = render(
+ ,
+ );
+
+ expect(
+ container.querySelectorAll('[data-hoc-kind="label"]'),
+ ).to.have.length(0);
+ expect(
+ container.querySelector('[data-hoc-kind="overflow"]')?.textContent,
+ ).to.equal("+3");
+ });
+
+ it("should show all HOC labels when maxVisible is not set", () => {
+ const { container } = render(
+ ,
+ );
+
+ expect(
+ container.querySelectorAll('[data-hoc-kind="label"]'),
+ ).to.have.length(2);
+ expect(container.querySelector('[data-hoc-kind="overflow"]')).to.equal(
+ null,
+ );
+ });
});
diff --git a/src/view/components/elements/TreeView.tsx b/src/view/components/elements/TreeView.tsx
index f90bef27..0a1334b8 100644
--- a/src/view/components/elements/TreeView.tsx
+++ b/src/view/components/elements/TreeView.tsx
@@ -58,8 +58,16 @@ export function TreeView() {
const search = useSearch();
const [updateCount, setUpdateCount] = useState(0);
+ const [hocLimits, setHocLimits] = useState