Skip to content

Commit 132527c

Browse files
fix(library): drop the pinned-grip centre dot; keep a plain white handle
The filled centre dot marking a pinned end read as cluttered. Pinned and auto ends now render the same clean white-with-outline grip; the fill still differs from the solid bend handle, so a pinned end never merges into an overlapping handle. Pinned state is surfaced by the edge toolbar's reset affordance, not by restyling the grip. The `--pinned` class and its count (edge-auto-reset) are unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent dd1dd51 commit 132527c

3 files changed

Lines changed: 8 additions & 42 deletions

File tree

library/lib/edges/GenericEdge.tsx

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,8 @@ export const EdgeEndpointMarkers = ({
293293
// this end's terminal bend handle instead of painting over it.
294294
bendHandles?: BendHandle[]
295295
// Whether each end is USER-PINNED (a custom anchor) rather than auto-anchored.
296-
// A pinned grip gets a filled centre dot when the edge is selected, so the user
297-
// can see at a glance which ends the router still owns and which they have fixed.
296+
// Kept as a prop/class for the reset affordance and tests; the grip itself looks the
297+
// same either way (a clean white handle), so nothing clutters the endpoint.
298298
sourcePinned?: boolean
299299
targetPinned?: boolean
300300
}) => {
@@ -467,27 +467,6 @@ export const EdgeEndpointMarkers = ({
467467
transform={`rotate(${targetGrip.rotationDeg} ${targetGrip.centerX} ${targetGrip.centerY})`}
468468
pointerEvents="none"
469469
/>
470-
{/* A USER-PINNED end keeps the white "handle" look (so it never merges with a
471-
solid bend handle it may overlap) and marks itself with a filled centre dot
472-
— "you fixed this end" — rather than a solid fill. */}
473-
{sourcePinned && (
474-
<circle
475-
className="edge-endpoint-grip-dot"
476-
cx={sourceGrip.centerX}
477-
cy={sourceGrip.centerY}
478-
r={FREEFORM_ENDPOINT_GRIP_RADIUS * screenScale}
479-
pointerEvents="none"
480-
/>
481-
)}
482-
{targetPinned && (
483-
<circle
484-
className="edge-endpoint-grip-dot"
485-
cx={targetGrip.centerX}
486-
cy={targetGrip.centerY}
487-
r={FREEFORM_ENDPOINT_GRIP_RADIUS * screenScale}
488-
pointerEvents="none"
489-
/>
490-
)}
491470
</>
492471
)}
493472
<rect

library/lib/styles/app.css

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -963,21 +963,10 @@
963963
);
964964
}
965965

966-
/* A USER-PINNED end (custom anchor) keeps the same white "handle" look as an
967-
auto grip — so it never disappears into a solid bend handle it overlaps — and
968-
is marked instead by a filled centre dot ("you fixed this end"). The dot rides
969-
the same hover/selected visibility gate as the grip. */
970-
.edge-endpoint-grip-dot {
971-
opacity: 0;
972-
fill: var(--apollon-primary, #3e8acc);
973-
stroke: none;
974-
transition: opacity 120ms ease;
975-
vector-effect: non-scaling-stroke;
976-
}
977-
.react-flow__edge:hover .edge-endpoint-grip-dot,
978-
.react-flow__edge.selected .edge-endpoint-grip-dot {
979-
opacity: 1;
980-
}
966+
/* A USER-PINNED end (custom anchor) keeps the same clean white "handle" look as an
967+
auto grip — a hollow pill with a blue outline — so it never disappears into a solid
968+
bend handle it overlaps. The pinned state is surfaced through the reset affordance in
969+
the edge toolbar rather than by restyling the grip. */
981970

982971
.react-flow__edge:hover .edge-bend-handle:hover,
983972
.react-flow__edge.selected .edge-bend-handle:hover {

standalone/webapp/tests/e2e/short-edge-endpoint-handles.spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ test("a short pinned S-jog edge keeps usable endpoint grips and still shows its
8484
}
8585
return {
8686
bendHandles: document.querySelectorAll(".edge-bend-handle").length,
87-
pinnedDots: document.querySelectorAll(".edge-endpoint-grip-dot").length,
8887
sg: m(".edge-endpoint-grip--source"),
8988
tg: m(".edge-endpoint-grip--target"),
9089
gripFill: fillOf(".edge-endpoint-grip--source"),
@@ -98,8 +97,7 @@ test("a short pinned S-jog edge keeps usable endpoint grips and still shows its
9897
expect(Math.max(grip!.w, grip!.h)).toBeGreaterThanOrEqual(10)
9998
}
10099
expect(info.bendHandles).toBeGreaterThan(0)
101-
// The pinned grips read as WHITE-with-outline handles marked by a centre dot — NOT a
102-
// solid blue fill that would merge into the (solid blue) bend handle they overlap.
103-
expect(info.pinnedDots).toBe(2)
100+
// The grips read as WHITE-with-outline handles — a fill distinct from the (solid blue)
101+
// bend handle they overlap, so a pinned end never merges into it.
104102
expect(info.gripFill).not.toBe(info.bendFill)
105103
})

0 commit comments

Comments
 (0)