Skip to content

🎨 Palette: μ™ΈλΆ€ 링크 툴팁 λ‹€κ΅­μ–΄ 지원 μΆ”κ°€ - #197

Open
seonghobae wants to merge 5 commits into
mainfrom
feat/external-link-tooltips-12589893808415607769
Open

🎨 Palette: μ™ΈλΆ€ 링크 툴팁 λ‹€κ΅­μ–΄ 지원 μΆ”κ°€#197
seonghobae wants to merge 5 commits into
mainfrom
feat/external-link-tooltips-12589893808415607769

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

πŸ’‘ What: target="_blank" 속성을 κ°€μ§„ μ™ΈλΆ€ 링크에 λŒ€ν•΄ 마우슀 μ˜€λ²„ μ‹œ λ‚˜νƒ€λ‚˜λŠ” λ‹€κ΅­μ–΄ 지원 툴팁(title 속성)을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
🎯 Why: μƒˆ νƒ­μ—μ„œ μ—΄λ¦¬λŠ” λ§ν¬μž„μ„ μ‚¬μš©μžμ—κ²Œ λͺ…ν™•νžˆ μ•ˆλ‚΄ν•˜μ—¬ ν˜Όλž€μ„ λ°©μ§€ν•˜κ³  예츑 κ°€λŠ₯ν•œ λΈŒλΌμš°μ§• κ²½ν—˜μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄μ„œμž…λ‹ˆλ‹€.
πŸ“Έ Before/After: μ™ΈλΆ€ 링크 마우슀 μ˜€λ²„ μ‹œ 아무 μ•ˆλ‚΄κ°€ μ—†μ—ˆμœΌλ‚˜, 이제 "μƒˆ μ°½μ—μ„œ μ—΄κΈ°"(EN: "Opens in new tab") 툴팁이 ν‘œμ‹œλ©λ‹ˆλ‹€.
β™Ώ Accessibility: 슀크린 리더 μ‚¬μš©μžμ—κ²Œ 링크 λ™μž‘μ— λŒ€ν•œ μΆ”κ°€ μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜λ©°, μ‹œκ° μž₯애인 및 인지 μž₯μ• λ₯Ό κ°€μ§„ μ‚¬μš©μžλ“€μ˜ 탐색 κ²½ν—˜μ„ λ•μŠ΅λ‹ˆλ‹€.


PR created automatically by Jules for task 12589893808415607769 started by @seonghobae


Devin Review

Summary by CodeRabbit

  • μ ‘κ·Όμ„± κ°œμ„ 

    • μƒˆ νƒ­μ—μ„œ μ—΄λ¦¬λŠ” μ™ΈλΆ€ 링크에 μ•ˆλ‚΄ νˆ΄νŒμ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
    • ν•œκ΅­μ–΄μ™€ μ˜μ–΄ ν™˜κ²½μ— 맞좰 툴팁 문ꡬ가 μžλ™μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.
  • λ¬Έμ„œ

    • μ™ΈλΆ€ 링크 μ ‘κ·Όμ„± 및 λ‹€κ΅­μ–΄ 지원 κ΄€λ ¨ ν•™μŠ΅ 기둝을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

@google-labs-jules

Copy link
Copy Markdown

πŸ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a πŸ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. πŸŽ‰

ℹ️ Recent review info
βš™οΈ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 87d76074-c371-495f-bcba-8a823fa647ac

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 8103aad and ba75619.

πŸ“’ Files selected for processing (3)
  • .Jules/palette.md
  • i18n.js
  • index.html

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


πŸ“ Walkthrough

Walkthrough

μ™ΈλΆ€ 링크에 μƒˆ νƒ­ μ•ˆλ‚΄ νˆ΄νŒμ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. ν•œκ΅­μ–΄μ™€ μ˜μ–΄ λ²ˆμ—­μ„ λ“±λ‘ν–ˆμŠ΅λ‹ˆλ‹€. μ–Έμ–΄ λ³€κ²½ μ‹œ 링크의 title 속성을 κ°±μ‹ ν•©λ‹ˆλ‹€.

Changes

μƒˆ νƒ­ μ•ˆλ‚΄ ν˜„μ§€ν™”

Layer / File(s) Summary
title 속성 λ²ˆμ—­ λŸ°νƒ€μž„
i18n.js
ν•œκ΅­μ–΄μ™€ μ˜μ–΄ 사전에 common.newTab λ²ˆμ—­μ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. setLanguageκ°€ data-i18n-title 속성을 μ‚¬μš©ν•΄ title을 κ°±μ‹ ν•©λ‹ˆλ‹€.
μ™ΈλΆ€ 링크 μ•ˆλ‚΄ 속성 적용
index.html, .Jules/palette.md
헀더, CTA, μ°Έκ³ λ¬Έν—Œ, ν”„λ‘œμ νŠΈ, ν‘Έν„°μ˜ μ™ΈλΆ€ 링크에 title 및 data-i18n-title 속성을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. κ΄€λ ¨ ν•™μŠ΅ 기둝을 λ¬Έμ„œν™”ν–ˆμŠ΅λ‹ˆλ‹€.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: βšͺ Minimal Β· up to ba756

This change adds localized tooltips to external links that open in a new tab without affecting application data, permissions, or runtime dependencies. No actionable merge-blocking risk remains after normal checks and review.

πŸš₯ Pre-merge checks | βœ… 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (2 skipped: 2 … Write docstrings for the functions missing them to satisfy the coverage threshold.
βœ… Passed checks (4 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed 제λͺ©μ€ μ™ΈλΆ€ 링크의 λ‹€κ΅­μ–΄ 툴팁 μ§€μ›μ΄λΌλŠ” μ£Όμš” λ³€κ²½ 사항을 μ •ν™•ν•˜κ³  κ°„κ²°ν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€.
Linked Issues check βœ… Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check βœ… Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches πŸ’‘ 2
πŸ“ Generate docstrings πŸ’‘
  • Create stacked PR
  • Commit on current branch
πŸ› οΈ Fix failing CI checks πŸ’‘
  • Create stacked PR
  • Commit on current branch
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/external-link-tooltips-12589893808415607769

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 3 potential issues.

Devin Review

Comment thread i18n.js
metaDescription: "λ§₯λ½μ§€ν˜œ 연ꡬ싀은 흩어진 κΈ°μ—… 자료λ₯Ό λ§₯락 μ•ˆμ—μ„œ νŒλ‹¨ κ°€λŠ₯ν•œ ꡬ쑰둜 λ°”κΎΈλŠ” AI μ˜μ‚¬κ²°μ • 지원 μ‹œμŠ€ν…œμ„ μ—°κ΅¬ν•˜κ³  λ§Œλ“­λ‹ˆλ‹€.",
logoSrc: "assets/context-wisdom-lab-logo.svg",
logoAlt: "λ§₯λ½μ§€ν˜œ 연ꡬ싀 Β· Contextual Wisdom Lab",
"common.newTab": "μƒˆ μ°½μ—μ„œ μ—΄κΈ°",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟑 User-facing change missing CHANGELOG entry

This PR adds a user-facing feature (translated title tooltips on external links) via the new common.newTab key but leaves CHANGELOG.md untouched. The repository convention requires a Korean entry under [Unreleased] for every user-facing change.

Prompt for agents
The repository convention (CLAUDE.md) requires CHANGELOG.md to be updated in Korean under the [Unreleased] section for any user-facing change. This PR introduces user-visible translated tooltips (title attribute) on external links via the new common.newTab i18n key, but CHANGELOG.md was not updated. Add a Korean [Unreleased] entry to CHANGELOG.md describing the addition of multilingual external-link tooltips.
Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

Comment thread i18n.js
Comment on lines 367 to 388

if (!isInitialDefault) {
if (!i18nNodes) {
i18nNodes = document.querySelectorAll("[data-i18n]");
i18nNodes = document.querySelectorAll("[data-i18n], [data-i18n-title]");
}

// Only update textContent if it actually changed to avoid layout recalculations
i18nNodes.forEach((node) => {
const newText = dict[node.dataset.i18n];
if (newText && node.textContent !== newText) {
node.textContent = newText;
if (node.hasAttribute("data-i18n")) {
const newText = dict[node.dataset.i18n];
if (newText && node.textContent !== newText) {
node.textContent = newText;
}
}
if (node.hasAttribute("data-i18n-title")) {
const newTitle = dict[node.dataset.i18nTitle];
if (newTitle && node.getAttribute("title") !== newTitle) {
node.setAttribute("title", newTitle);
}
}
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ“ Info: Korean-default skip relies on inlined titles matching the dictionary

The initial-load fast path skips all data-i18n-title nodes when the resolved language is Korean, so inlined title="μƒˆ μ°½μ—μ„œ μ—΄κΈ°" values are trusted to match messages.ko['common.newTab']. They currently match; any future drift would silently go uncorrected on first load.

(Refers to this code)

Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

Comment thread i18n.js
metaDescription: "λ§₯λ½μ§€ν˜œ 연ꡬ싀은 흩어진 κΈ°μ—… 자료λ₯Ό λ§₯락 μ•ˆμ—μ„œ νŒλ‹¨ κ°€λŠ₯ν•œ ꡬ쑰둜 λ°”κΎΈλŠ” AI μ˜μ‚¬κ²°μ • 지원 μ‹œμŠ€ν…œμ„ μ—°κ΅¬ν•˜κ³  λ§Œλ“­λ‹ˆλ‹€.",
logoSrc: "assets/context-wisdom-lab-logo.svg",
logoAlt: "λ§₯λ½μ§€ν˜œ 연ꡬ싀 Β· Contextual Wisdom Lab",
"common.newTab": "μƒˆ μ°½μ—μ„œ μ—΄κΈ°",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ“ Info: Tooltip wording: window vs tab

The Korean common.newTab reads 'μƒˆ μ°½μ—μ„œ μ—΄κΈ°' (new window) while the English reads 'Opens in new tab'. Harmless wording mismatch between locales.

Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant