diff --git a/library/components/legends/LegendCollapseCaret.vue b/library/components/legends/LegendCollapseCaret.vue
new file mode 100644
index 000000000..84b602710
--- /dev/null
+++ b/library/components/legends/LegendCollapseCaret.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
diff --git a/library/components/legends/LegendDesktop.vue b/library/components/legends/LegendDesktop.vue
index 1c8ee13f1..3db1899fb 100644
--- a/library/components/legends/LegendDesktop.vue
+++ b/library/components/legends/LegendDesktop.vue
@@ -13,6 +13,7 @@ import { retryableAsyncComponent } from '../../composables/retryableAsyncCompone
import LegendRows from './LegendRows.vue'
import PeopleGroupDetail from '../PeopleGroupDetail.vue'
import ApproxPinNote from './ApproxPinNote.vue'
+import LegendCollapseCaret from './LegendCollapseCaret.vue'
import { buildColocationIndex, colocatedWith } from '../../utils/colocation.js'
// Async-import the heavier branches so the boot bundle stays lean.
const LegendMobile = retryableAsyncComponent(() => import('./LegendMobile.vue'))
@@ -68,11 +69,6 @@ useShadowStyles(`
LegendRows. Matches SemanticTreeLegend's .stl-collapse-btn look:
22x20px, rounded-rect, subtle dark bg + border, right-chevron SVG
that rotates 180deg when expanded. */
-.legend-collapse-caret{background:rgba(110,118,129,0.15);border:1px solid #30363d;border-radius:5px;color:#8b949e;cursor:pointer;width:22px;height:20px;flex-shrink:0;display:flex;align-items:center;justify-content:center;transition:color 0.1s,background 0.1s,transform 0.18s;outline:none;-webkit-tap-highlight-color:transparent;padding:0;}
-.legend-collapse-caret:focus{outline:none;}
-.legend-collapse-caret:hover{color:#c9d1d9;background:rgba(59,70,61,0.18);border-color:#73A17F;}
-.legend-collapse-caret svg{transition:transform 0.18s;transform:rotate(180deg);}
-.legend-collapse-caret.rotated svg{transform:rotate(0deg);}
/* Light mode caret — mirrors STL's [data-theme="light"] .stl-collapse-btn */
.legend-container:not(.legend-dark) .legend-collapse-caret{background:rgba(208,215,222,0.4);border-color:#d0d7de;color:#57606a;}
.legend-container:not(.legend-dark) .legend-collapse-caret:hover{background:rgba(59,70,61,0.12);border-color:#3b463d;color:#3b463d;}
@@ -86,8 +82,14 @@ useShadowStyles(`
above the PeopleGroupDetail sticky header (.detail-header z-index:10) so
it is always tappable even when the detail panel scrolls. The button is
only rendered in the detail-mode template branch (see below). */
-.detail-collapse-btn{position:absolute;top:10px;inset-inline-start:10px;z-index:20;background:transparent;border:none;color:transparent;cursor:pointer;width:28px;height:28px;padding:0;outline:none;-webkit-tap-highlight-color:transparent;}
-.detail-collapse-btn:focus{outline:none;}
+/* The detail-mode collapse control was an INVISIBLE 28x28 hit target (transparent fill, no
+ border, transparent colour) sitting over the panel's own corner. Keeping it invisible is
+ deliberate: making it suddenly visible is a look change nobody asked for. The slot keeps the
+ position and the 28x28 target; the shared caret inside it supplies the semantics the old
+ bare