mock: バリアントのバッジをノードより後に描き、キーの下に隠れないようにする

バッジは NodeSvg の再帰の中で各バリアントグループの <g> に描いていたため、
後から描かれる兄弟のキーに隠れていた。選択の描画層の後に PhyBadgeLayer を置き、
位置は純粋関数 variantBadges でワールド座標に直して正立で描く。
フォーカス中、フォーカス外のバッジは薄く描き、クリックを受けない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NznQtmVPoQAnietqwr1auL
This commit is contained in:
2026-10-22 14:24:49 +09:00
co-authored by Claude Opus 5.5
parent 812e2edfc2
commit 0697e7a3b4
6 changed files with 157 additions and 85 deletions
+15 -9
View File
@@ -8,6 +8,7 @@ import { listDeleteReferences } from "../../domain/deleteCascade";
import PhyTree from "./PhyTree.vue";
import NodeSvg from "./NodeSvg.vue";
import PhySelectionLayer from "./PhySelectionLayer.vue";
import PhyBadgeLayer from "./PhyBadgeLayer.vue";
import PhyToolbar from "./PhyToolbar.vue";
import PhyProperties from "./PhyProperties.vue";
import { normalizeSelection, nextGrid, insertionContainer, structuralNodes, visibleNodeIds } from "./logic";
@@ -118,7 +119,6 @@ const {
focusGridLines,
moveTargets,
parentMatrix: focusParentMatrix,
focusAngle,
affineText,
focusCrumbs,
propertyNode: prop,
@@ -360,8 +360,6 @@ function onFocus(_id: string) {
:variants="variants"
:cut="cut"
:dim="true"
:zoom="zoom"
:angle="0"
/>
<g v-if="focus" :transform="affineText(focusParentMatrix(focus))">
<g
@@ -375,10 +373,7 @@ function onFocus(_id: string) {
:variants="variants"
:cut="cut"
:dim="false"
:zoom="zoom"
:angle="focusAngle(focus)"
@down="down"
@badge="openBadge"
@focus="onFocus"
/>
</g>
@@ -389,10 +384,7 @@ function onFocus(_id: string) {
:variants="variants"
:cut="cut"
:dim="false"
:zoom="zoom"
:angle="0"
@down="down"
@badge="openBadge"
@focus="onFocus"
/>
<PhySelectionLayer
@@ -403,6 +395,20 @@ function onFocus(_id: string) {
:candidate="longLabel ? (holdCandidates[holdIndex] ?? null) : null"
:parent="focus ? focusParentMatrix(focus) : undefined"
/>
<PhyBadgeLayer
v-if="focus && outsideNodes.length"
:nodes="outsideNodes"
:variants="variants"
:zoom="zoom"
:dim="true"
/>
<PhyBadgeLayer
:nodes="focus ? [node(focus)!] : project.phy.root"
:variants="variants"
:zoom="zoom"
:parent="focus ? focusParentMatrix(focus) : undefined"
@badge="openBadge"
/>
</g>
<rect
v-if="rangeBox"