feat(dialogs): redesign confirmation popup#2391
Conversation
Adds a dedicated title above each prompt and softens the destructive CTA to a theme-aware pastel red (coral on dark, more saturated on light) so warnings read intentional rather than alarming. Cancel and the affirmative confirm share a sunken fill that sits a step deeper than the modal background; both buttons match width via an inline-grid mirror so the layout stays balanced regardless of label length. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces a comprehensive redesign of the application's confirmation dialogs. The changes focus on improving user clarity and visual hierarchy by adding explicit titles, refining typography, and adjusting button styling to better distinguish between destructive and standard actions. The implementation also includes structural improvements to the modal footer and ensures consistent button sizing, enhancing the overall polish and usability of the confirmation flow. Highlights
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. Footnotes
|
|
|
Overall Grade |
Security Reliability Complexity Hygiene |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| JavaScript | May 22, 2026 9:14a.m. | Review ↗ | |
| Code coverage | May 22, 2026 9:14a.m. | Review ↗ |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
There was a problem hiding this comment.
Code Review
This pull request introduces a title field to the confirmation dialog system, updating the ConfirmationDialog component, its associated types, and the mapping logic. It also adds several new i18n strings for dialog titles, calendar views, and list progress. Feedback highlights inconsistent casing in new i18n labels and an abstraction leak in the ConfirmationDialog styles that overrides internal Button properties, violating encapsulation rules. A redundant CSS rule for mobile button width was also identified for removal.
| ] | ||
| }, | ||
| "calendar_day_item_count_one": { | ||
| "default": "{count} Item", |
There was a problem hiding this comment.
The casing for "Item" is inconsistent with other media count labels in the project, which typically use lowercase (e.g., tag_text_number_of_items on line 11336 uses "items", and tag_text_plays on line 677 uses "plays"). Consider using lowercase for consistency.
| "default": "{count} Item", | |
| "default": "{count} item", |
| ] | ||
| }, | ||
| "calendar_day_item_count_other": { | ||
| "default": "{count} Items", |
| .trakt-confirmation-actions :global(.trakt-button) { | ||
| padding-inline: var(--ni-10); | ||
| justify-content: center; | ||
| } | ||
|
|
||
| /* Quiet buttons (Cancel + affirmative confirm) — sit on a fill that's a step | ||
| deeper than the modal background, no stroke. Override the ghost style's | ||
| scale/margin/transparent-bg so they read as solid buttons. */ | ||
| .trakt-confirmation-actions :global(.trakt-button[data-style="ghost"]) { | ||
| transform: none; | ||
| margin: 0; | ||
| color: var(--color-text-secondary); | ||
| border-radius: calc(var(--border-radius-m) * 0.8); | ||
| background: var(--trakt-cancel-bg); | ||
| } | ||
|
|
||
| .trakt-confirmation-actions | ||
| :global(.trakt-button[data-style="ghost"]:hover:not([disabled])), | ||
| .trakt-confirmation-actions | ||
| :global(.trakt-button[data-style="ghost"]:focus-visible:not([disabled])) { | ||
| background: var(--trakt-cancel-bg-hover); | ||
| color: var(--color-text-primary); | ||
| } | ||
|
|
||
| .trakt-confirmation-actions | ||
| :global(.trakt-button[data-style="ghost"]:active:not([disabled])) { | ||
| transform: scale(0.97); | ||
| } |
There was a problem hiding this comment.
Overriding the internal styles of the Button component using :global(.trakt-button) and :global(.trakt-button[data-style="ghost"]) is an abstraction leak. This couples the ConfirmationDialog to the internal implementation details of the Button component, violating the principle of encapsulation. It would be more maintainable to expose these styling options as props or variants on the Button component itself, or to use CSS variables that the Button component explicitly supports for theme overrides.
| @include for-mobile { | ||
| .trakt-confirmation-actions :global(.trakt-button) { | ||
| width: 100%; | ||
| } | ||
| } |
There was a problem hiding this comment.
The width: 100% rule for buttons on mobile is redundant. The parent .trakt-modal-footer in Modal.svelte already sets align-items: stretch in its mobile media query. Since .trakt-confirmation-actions uses display: contents, the buttons are direct flex items of the footer and will stretch to full width automatically.
Summary
<h2>title above the message inConfirmationDialog(sourced from newconfirmation_title_*i18n keys, one perConfirmationType).--color-text-secondarybody copy beneath the title.--red-500destructive button with a soft pastel red (--red-200on dark /--red-300on light, near-black--red-1000foreground) so removing/deleting reads intentional rather than alarming.--shade-60on light,--shade-950on dark) — no stroke.max-content), with the visible label centered in the cell.--ni-18(one increment below the previous version), letter-spacing tightened.Test plan
Restore show) — both buttons should look identical except for label.--red-300in light theme and stays as--red-200in dark theme.🤖 Generated with Claude Code