diff --git a/app/game-frontend/e2e/directoryLists.spec.ts b/app/game-frontend/e2e/directoryLists.spec.ts index bcd7b16b..06edbb51 100644 --- a/app/game-frontend/e2e/directoryLists.spec.ts +++ b/app/game-frontend/e2e/directoryLists.spec.ts @@ -629,6 +629,10 @@ test('nation directory reuses only the public general-directory row on hover and await expect(preview.locator('[data-general-card-id="10"]')).toContainText('대담'); await expect(preview.locator('[data-directory-tooltip="card-special-domestic-10"]')).toContainText('상재'); await expect(preview.locator('[data-directory-tooltip="card-special-war-10"]')).toContainText('귀모'); + await expect(preview.locator('[data-directory-tooltip="card-special-domestic-10"]')).toHaveCSS( + 'text-decoration-line', + 'none' + ); await expect(preview).not.toContainText('user-'); await expect(preview).not.toContainText('secret'); diff --git a/app/game-frontend/e2e/inGameMenus.spec.ts b/app/game-frontend/e2e/inGameMenus.spec.ts index cb5265b8..4172e7c6 100644 --- a/app/game-frontend/e2e/inGameMenus.spec.ts +++ b/app/game-frontend/e2e/inGameMenus.spec.ts @@ -1429,6 +1429,7 @@ test('내 정보 항목과 국가 성향은 HTML 리치 툴팁을 마우스와 const showWithMouse = async (testId: string, expectedTexts: readonly string[]) => { const trigger = page.locator(`[data-rich-tooltip="${testId}"]`); await expect(trigger).toHaveAttribute('tabindex', '0'); + await expect(trigger).toHaveCSS('text-decoration-line', 'none'); await trigger.hover(); await expect(visibleTooltip).toHaveCount(1); await expect(visibleTooltip).toHaveAttribute('role', 'tooltip'); diff --git a/app/game-frontend/e2e/mainNavigation.spec.ts b/app/game-frontend/e2e/mainNavigation.spec.ts index 2114ca10..33de76ef 100644 --- a/app/game-frontend/e2e/mainNavigation.spec.ts +++ b/app/game-frontend/e2e/mainNavigation.spec.ts @@ -2106,6 +2106,7 @@ test('main cards and command input stay inside their Ref-sized grid slots', asyn expect(Math.max(...nationRowHeights) - Math.min(...nationRowHeights)).toBeLessThanOrEqual(0.01); const strategicCell = nationCard.locator('.strategic'); const strategicTooltip = strategicCell.getByRole('tooltip'); + await expect(strategicCell).toHaveCSS('text-decoration-line', 'none'); await expect(strategicTooltip).toBeHidden(); await strategicCell.hover(); await expect(strategicTooltip).toBeVisible(); diff --git a/app/game-frontend/e2e/npcPossession.spec.ts b/app/game-frontend/e2e/npcPossession.spec.ts index 8a035639..975e93a7 100644 --- a/app/game-frontend/e2e/npcPossession.spec.ts +++ b/app/game-frontend/e2e/npcPossession.spec.ts @@ -266,6 +266,7 @@ test('renders Ref-shaped token cards, preserves keep cooldown and retries posses }); const tooltip = page.locator('.npc-tooltip').first(); const tooltipPopup = tooltip.getByRole('tooltip'); + await expect(tooltip).toHaveCSS('text-decoration-line', 'none'); await expect(tooltipPopup).toBeHidden(); await tooltip.hover(); await expect(tooltipPopup).toBeVisible(); diff --git a/app/game-frontend/src/components/directory/DirectoryTooltip.vue b/app/game-frontend/src/components/directory/DirectoryTooltip.vue index 9106f8e3..9110bbc4 100644 --- a/app/game-frontend/src/components/directory/DirectoryTooltip.vue +++ b/app/game-frontend/src/components/directory/DirectoryTooltip.vue @@ -29,8 +29,6 @@ defineProps<{ } .directory-tooltip--enabled { cursor: help; - text-decoration: underline dotted rgb(150 210 255 / 85%); - text-underline-offset: 2px; } .directory-tooltip--enabled:focus-visible { border-radius: 2px; diff --git a/app/game-frontend/src/components/main/NationBasicCard.vue b/app/game-frontend/src/components/main/NationBasicCard.vue index 478df508..8435b3b5 100644 --- a/app/game-frontend/src/components/main/NationBasicCard.vue +++ b/app/game-frontend/src/components/main/NationBasicCard.vue @@ -284,7 +284,6 @@ const displayChiefName = (chief: NationChief | undefined): string => { .strategic.has-tooltip { overflow: visible; - text-decoration: underline dashed red; } .cooldown-tooltip { diff --git a/app/game-frontend/src/components/ui/RichTooltip.vue b/app/game-frontend/src/components/ui/RichTooltip.vue index 96edc160..c3d8901f 100644 --- a/app/game-frontend/src/components/ui/RichTooltip.vue +++ b/app/game-frontend/src/components/ui/RichTooltip.vue @@ -97,8 +97,6 @@ watch( .rich-tooltip-trigger--enabled { cursor: help; - text-decoration: underline dotted rgb(150 210 255 / 85%); - text-underline-offset: 2px; } .rich-tooltip-trigger--enabled:focus-visible { diff --git a/app/game-frontend/src/views/JoinView.vue b/app/game-frontend/src/views/JoinView.vue index e3b3b64e..2045c02d 100644 --- a/app/game-frontend/src/views/JoinView.vue +++ b/app/game-frontend/src/views/JoinView.vue @@ -1733,7 +1733,6 @@ onUnmounted(() => { .npc-tooltip { position: relative; cursor: help; - text-decoration: underline dotted; } .npc-tooltip [role='tooltip'] { diff --git a/docs/frontend-css-architecture.md b/docs/frontend-css-architecture.md index ef33e083..3a76918b 100644 --- a/docs/frontend-css-architecture.md +++ b/docs/frontend-css-architecture.md @@ -36,7 +36,10 @@ available sort keys and placement. NPC·암행부·세력도시는 Ref의 고정 `내림차순 → 오름차순 → 해제`를 순환하고, 여러 열의 방향과 우선순위를 scoped SFC indicator로 표시합니다. 장수 일람의 성격·특기·부상 설명은 많은 행에서 eager popup instance를 만들지 않는 `DirectoryTooltip.vue` scoped CSS가 소유하며, -mobile에서는 viewport 가장자리 8px 안의 고정 설명판으로 전환합니다. +mobile에서는 viewport 가장자리 8px 안의 고정 설명판으로 전환합니다. 게임 내 +tooltip trigger는 hover/focus 동작과 `cursor: help`를 유지하되, tooltip이 있는 모든 +텍스트에 점선 밑줄을 반복하지 않습니다. keyboard `focus-visible` outline은 별도의 +접근성 상태로 유지합니다. ## Button composition