@@ -70,8 +109,8 @@ export function LineageRelationLists({
这部作品是母版,没有父代(它的后代都在上面的树里)。
) : (
-
- {ancestors.map((node) => renderRow(node, 'ancestor'))}
+
+ {ancestors.map((node) => renderCard(node, 'ancestor'))}
)}
@@ -85,7 +124,7 @@ export function LineageRelationLists({
这部作品还没有直接子代。
) : (
- {children.map((node) => renderRow(node, 'descendant'))}
+ {children.map((node) => renderCard(node, 'descendant'))}
)}
diff --git a/src/components/game-distribution/gameDistribution.css b/src/components/game-distribution/gameDistribution.css
index d721174d9..f6f31a2d4 100644
--- a/src/components/game-distribution/gameDistribution.css
+++ b/src/components/game-distribution/gameDistribution.css
@@ -2933,3 +2933,43 @@
text-decoration: underline;
cursor: pointer;
}
+
+/*
+ * 图谱里的卡**就是**广场作品卡的同一个组件(`GameCard`):这里只做「放进画布/清单」所需的尺寸适配,
+ * 不改卡内视觉(标题/游玩数/作者等仍由该组件自己的样式决定)。
+ * 封面继续遵守 16:9 + 铺满(`.game-cover` 的 min-height 共享样式在卡里归零)。
+ */
+.game-lineage-node > .game-card--lineage {
+ width: 100%;
+ min-height: 100%;
+}
+.game-card--lineage .game-cover {
+ width: 100%;
+ aspect-ratio: 16 / 9;
+ min-height: 0;
+ border-radius: 0;
+}
+.game-card--lineage .game-cover__image,
+.game-card--lineage .game-cover img {
+ display: block;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ object-position: center;
+}
+/* 图下方「父代 / 子代」清单:与广场一致的卡片网格。 */
+.lineage-relation__grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
+ gap: 0.75rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+.lineage-relation__item {
+ display: flex;
+ min-width: 0;
+}
+.lineage-relation__item > .game-card--lineage {
+ width: 100%;
+}
diff --git a/src/components/platform-entry/PlatformEntryActiveFlowShell.test.tsx b/src/components/platform-entry/PlatformEntryActiveFlowShell.test.tsx
index 7e6604618..d4c52e66f 100644
--- a/src/components/platform-entry/PlatformEntryActiveFlowShell.test.tsx
+++ b/src/components/platform-entry/PlatformEntryActiveFlowShell.test.tsx
@@ -1434,10 +1434,17 @@ describe('创作族谱', () => {
expect(gameDistributionMock.getGameLineage).toHaveBeenCalledWith(
'game-root',
);
- // 图下方的「父代/子代」块里也有同名节点,所以这里精确到**树里**的那一个。
- const treeNode = screen
- .getAllByRole('button', { name: /《母版》/u })
- .find((button) => button.closest('.lineage-relations') === null);
+ // 图下方的「父代/子代」块里也有同名节点,所以这里精确到**树里**的那一个:
+ // 树节点卡就是广场卡(卡内标题文本 = 作品标题,整卡一个 button)。
+ const treeNode = [
+ ...document.querySelectorAll('.game-lineage-canvas .game-lineage-node'),
+ ]
+ .find(
+ (node) =>
+ node.querySelector('.game-card__title-row > strong')?.textContent ===
+ '母版',
+ )
+ ?.querySelector('.game-card');
expect(treeNode).toBeTruthy();
fireEvent.click(treeNode as HTMLElement);
expect(setSelectionStage).toHaveBeenCalledWith('game-detail', {