- {pinnedChain.length > 0 ? (
-
(
+
- {pinnedChain.map((crumb, index) => (
-
- {index > 0 ? → : null}
-
-
- ))}
+ {index > 0 ? → : null}
-
- ) : null}
-
+ ))}
+
+ ) : null}
+ {effectiveViewMode === 'outline' ? (
+
+ setPinnedGameId((current) =>
+ current === gameId ? '' : gameId,
+ )
+ }
+ onOpenDetail={onOpenDetail}
+ onOpenFork={launchForkFromNode}
+ />
+ ) : (
+
+
- {layout.edges.map((edge) => (
-
+ {layout.edges.map((edge) => (
+
+ ))}
+
+ {layout.nodes.map((layoutNode) => (
+ setActiveGameId('')}
+ onOpenFork={launchForkFromNode}
/>
))}
-
- {layout.nodes.map((layoutNode) => (
- setActiveGameId('')}
- onOpenFork={launchForkFromNode}
- />
- ))}
-
- {/*
+
+ {/*
代际轴是**固定层**:在 transform 之外,位置按视口换算,字号不随缩放变小,
因此放大或平移后轴标签始终在画布左侧可读,而不会被内容层带出去裁掉。
*/}
-
- {layout.axis.map((entry, index) => (
-
-
- {entry.label}
+
+ {layout.axis.map((entry, index) => (
+
+
+ {entry.label}
+
+
+ {entry.count}
+
-
- {entry.count}
-
-
- ))}
-
- {/*
+ ))}
+
+ {/*
画布内悬浮控件:放在**右下角**——左侧是代际轴、顶部是路径面包屑,
右下角是地图/画布类应用的习惯位置,也最不容易遮住根节点与主干。
*/}
- event.stopPropagation()}
- >
-
+ {/*
右侧信息面板:只在**选中节点**时出现,浮动叠加(不推挤画布)。
简介 / 授权类型只为选中的这一个节点请求一次公开详情;
「核心改动说明」是后端待补字段,缺失时整行不渲染。
*/}
- {selectedLayoutNode ? (
-
+ {selectedLayoutNode ? (
+ setPinnedGameId('')}
+ onOpenDetail={onOpenDetail}
+ onOpenFork={launchForkFromNode}
+ />
) : null}
-
+
+ )}
+ {/* 大纲模式下的 bottom sheet(桌面形态的面板在画布内,见上一分支)。 */}
+ {effectiveViewMode === 'outline' && selectedLayoutNode ? (
+