Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@steven-tey
Copy link
Collaborator

@steven-tey steven-tey commented Nov 9, 2025

Summary by CodeRabbit

  • New Features

    • Tooltips now support Markdown formatting for enhanced text display with inline links and styled code blocks.
  • Style

    • Improved visual styling of code elements in tooltips and related interface elements.

@vercel
Copy link
Contributor

vercel bot commented Nov 9, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Updated (UTC)
dub Ready Ready Preview Nov 9, 2025 4:19am

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 9, 2025

Warning

Rate limit exceeded

@steven-tey has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 7 minutes and 12 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 252bfd1 and cb6d876.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (107)
  • apps/web/app/(ee)/api/cron/links/[linkId]/complete-tests/route.ts (1 hunks)
  • apps/web/app/(ee)/api/mock/rewardful/campaigns/[campaignId]/route.ts (1 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/add-edit-link.tsx (2 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/page.tsx (1 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/utils.ts (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(dashboard)/messages/layout.tsx (2 hunks)
  • apps/web/app/(ee)/partners.dub.co/(dashboard)/payouts/partner-payout-settings-sheet.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(dashboard)/payouts/payout-table.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/links/partner-link-card.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx (1 hunks)
  • apps/web/app/[domain]/not-found/page.tsx (1 hunks)
  • apps/web/app/[domain]/page.tsx (1 hunks)
  • apps/web/app/[domain]/stats/[key]/page.tsx (1 hunks)
  • apps/web/app/api/links/route.ts (1 hunks)
  • apps/web/app/api/og/avatar/[[...seed]]/route.tsx (1 hunks)
  • apps/web/app/app.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/campaigns/campaign-type-icon.tsx (0 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/commissions/commission-stats.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/links/add-edit-group-default-link-sheet.tsx (2 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/links/group-additional-links.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/links/group-default-links.tsx (2 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/groups/[groupSlug]/links/group-link-settings.tsx (2 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/messages/layout.tsx (2 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/invite-partner-sheet.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/links/folders/[folderId]/members/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/manage/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/enabled/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/new/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/edit/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/layout.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(deeplink)/deeplink/[domain]/[key]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/analytics/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/links/[key]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx (3 hunks)
  • apps/web/app/cloaked/[url]/page.tsx (2 hunks)
  • apps/web/app/inspect/[domain]/[key]/page.tsx (2 hunks)
  • apps/web/app/password/[linkId]/page.tsx (2 hunks)
  • apps/web/app/proxy/[domain]/[key]/page.tsx (2 hunks)
  • apps/web/app/wellknown/[domain]/[file]/route.ts (1 hunks)
  • apps/web/lib/actions/partners/create-reward.ts (1 hunks)
  • apps/web/lib/actions/partners/online-presence-providers.ts (1 hunks)
  • apps/web/lib/actions/partners/update-reward.ts (1 hunks)
  • apps/web/lib/api/domains/get-email-domain-or-throw.ts (0 hunks)
  • apps/web/lib/api/links/bulk-delete-links.ts (1 hunks)
  • apps/web/lib/api/workflows/render-campaign-email-markdown.ts (1 hunks)
  • apps/web/lib/rewardful/api.ts (1 hunks)
  • apps/web/lib/zod/schemas/analytics-response.ts (1 hunks)
  • apps/web/lib/zod/schemas/program-application-form.ts (6 hunks)
  • apps/web/scripts/testimonial/update-commissions.ts (1 hunks)
  • apps/web/ui/analytics/bar-list.tsx (2 hunks)
  • apps/web/ui/domains/add-edit-domain-form.tsx (1 hunks)
  • apps/web/ui/domains/register-domain-form.tsx (2 hunks)
  • apps/web/ui/layout/page-content/page-content-header.tsx (2 hunks)
  • apps/web/ui/layout/sidebar/payout-stats.tsx (1 hunks)
  • apps/web/ui/links/destination-url-input.tsx (2 hunks)
  • apps/web/ui/links/link-builder/controls/link-builder-folder-selector.tsx (2 hunks)
  • apps/web/ui/links/link-builder/controls/link-comments-input.tsx (2 hunks)
  • apps/web/ui/links/link-builder/conversion-tracking-toggle.tsx (1 hunks)
  • apps/web/ui/links/link-builder/link-preview.tsx (1 hunks)
  • apps/web/ui/links/link-builder/more-dropdown.tsx (2 hunks)
  • apps/web/ui/links/link-builder/options-list.tsx (2 hunks)
  • apps/web/ui/links/link-builder/qr-code-preview.tsx (1 hunks)
  • apps/web/ui/links/link-builder/tag-select.tsx (1 hunks)
  • apps/web/ui/links/link-controls.tsx (1 hunks)
  • apps/web/ui/modals/add-edit-token-modal.tsx (2 hunks)
  • apps/web/ui/modals/add-partner-link-modal.tsx (2 hunks)
  • apps/web/ui/modals/import-rebrandly-modal.tsx (1 hunks)
  • apps/web/ui/modals/import-short-modal.tsx (1 hunks)
  • apps/web/ui/modals/link-builder/ab-testing-modal.tsx (3 hunks)
  • apps/web/ui/modals/link-builder/ab-testing/ab-testing-modal.tsx (3 hunks)
  • apps/web/ui/modals/link-builder/advanced-modal.tsx (2 hunks)
  • apps/web/ui/modals/link-builder/expiration-modal.tsx (2 hunks)
  • apps/web/ui/modals/link-builder/og-modal.tsx (1 hunks)
  • apps/web/ui/modals/link-builder/password-modal.tsx (2 hunks)
  • apps/web/ui/modals/link-builder/targeting-modal.tsx (4 hunks)
  • apps/web/ui/modals/link-builder/utm-modal.tsx (1 hunks)
  • apps/web/ui/modals/link-qr-modal.tsx (3 hunks)
  • apps/web/ui/modals/partner-link-modal.tsx (4 hunks)
  • apps/web/ui/modals/partner-link-qr-modal.tsx (2 hunks)
  • apps/web/ui/modals/saml-modal.tsx (3 hunks)
  • apps/web/ui/modals/scim-modal.tsx (3 hunks)
  • apps/web/ui/partners/commission-status-badges.tsx (2 hunks)
  • apps/web/ui/partners/confirm-payouts-sheet.tsx (2 hunks)
  • apps/web/ui/partners/discounts/add-edit-discount-sheet.tsx (2 hunks)
  • apps/web/ui/partners/groups/design/application-form/fields/max-character-count.tsx (1 hunks)
  • apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx (4 hunks)
  • apps/web/ui/partners/merge-accounts/merge-partner-accounts-modal.tsx (2 hunks)
  • apps/web/ui/partners/partners-upgrade-modal.tsx (1 hunks)
  • apps/web/ui/partners/program-link-configuration.tsx (2 hunks)
  • apps/web/ui/workspaces/plan-features.tsx (1 hunks)
  • packages/email/src/templates/partner-user-invited.tsx (1 hunks)
  • packages/embeds/react/src/example/app.tsx (1 hunks)
  • packages/ui/package.json (1 hunks)
  • packages/ui/src/hooks/use-enter-submit.ts (1 hunks)
  • packages/ui/src/scroll-container.tsx (1 hunks)
  • packages/ui/src/tooltip.tsx (4 hunks)

Walkthrough

The PR refactors tooltip content rendering across multiple UI components from JSX elements to Markdown strings. A new TooltipMarkdown component was introduced in packages/ui to handle Markdown rendering with custom styling. Dependencies were updated to support this, and previously exported utility components were removed from the public API.

Changes

Cohort / File(s) Change Summary
Tooltip Infrastructure
packages/ui/src/tooltip.tsx, packages/tailwind-config/tailwind.config.ts
Added TooltipMarkdown internal component for Markdown rendering via ReactMarkdown. Changed TooltipContent title type from ReactNode to string. Removed exported LinkifyTooltipContent and NumberTooltip components. Added Tailwind CSS rules for code element pseudo-elements.
Dependencies
packages/ui/package.json
Added react-markdown and remove as new runtime dependencies.
Web UI Component Updates
apps/web/ui/analytics/bar-list.tsx, apps/web/ui/domains/register-domain-form.tsx, apps/web/ui/links/disabled-link-tooltip.tsx, apps/web/ui/partners/confirm-payouts-sheet.tsx, apps/web/ui/partners/external-payouts-indicator.tsx
Replaced JSX-based tooltip content with Markdown string literals. Updated imports to remove LinkifyTooltipContent references. Removed Button component usage where previously needed for call-to-action elements within tooltips.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Verify Markdown rendering correctness and link formatting consistency across all tooltip instances
  • Check that CSS styling for code elements renders properly in tooltip contexts
  • Confirm type signature change in TooltipContent doesn't break existing consumers
  • Validate new dependencies don't introduce conflicts or increase bundle size unexpectedly
  • Ensure accessibility is maintained with Markdown-based content (alt text, link semantics)

Suggested reviewers

  • TWilson023

Poem

🐰 Tooltips danced in JSX's embrace,
Now rendered smooth with Markdown's grace,
Links and code in strings so neat,
The refactor makes the UI complete!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: introducing markdown support in tooltips through a new TooltipMarkdown component.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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 and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 987e94a and 252bfd1.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • apps/web/ui/analytics/bar-list.tsx (2 hunks)
  • apps/web/ui/domains/register-domain-form.tsx (1 hunks)
  • apps/web/ui/links/disabled-link-tooltip.tsx (1 hunks)
  • apps/web/ui/partners/confirm-payouts-sheet.tsx (1 hunks)
  • apps/web/ui/partners/external-payouts-indicator.tsx (2 hunks)
  • packages/tailwind-config/tailwind.config.ts (1 hunks)
  • packages/ui/package.json (1 hunks)
  • packages/ui/src/tooltip.tsx (4 hunks)
🧰 Additional context used
🧠 Learnings (12)
📓 Common learnings
Learnt from: TWilson023
Repo: dubinc/dub PR: 2857
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/resources/program-help-and-support.tsx:95-121
Timestamp: 2025-09-17T17:40:35.470Z
Learning: In the Dub UI Switch component, providing a truthy `disabledTooltip` prop automatically disables the switch and prevents user interaction, so an explicit `disabled` prop is not needed when using `disabledTooltip`.
📚 Learning: 2025-09-18T16:33:17.719Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2858
File: apps/web/ui/partners/partner-application-tabs.tsx:1-1
Timestamp: 2025-09-18T16:33:17.719Z
Learning: When a React component in Next.js App Router uses non-serializable props (like setState functions), adding "use client" directive can cause serialization warnings. If the component is only imported by Client Components, it's better to omit the "use client" directive to avoid these warnings while still getting client-side execution through promotion.

Applied to files:

  • apps/web/ui/analytics/bar-list.tsx
  • packages/ui/src/tooltip.tsx
📚 Learning: 2025-08-25T21:03:24.285Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2736
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/bounty-card.tsx:1-1
Timestamp: 2025-08-25T21:03:24.285Z
Learning: In Next.js App Router, Server Components that use hooks can work without "use client" directive if they are only imported by Client Components, as they get "promoted" to run on the client side within the Client Component boundary.

Applied to files:

  • apps/web/ui/analytics/bar-list.tsx
  • packages/ui/src/tooltip.tsx
📚 Learning: 2025-05-29T04:45:18.504Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2448
File: packages/email/src/templates/partner-program-summary.tsx:0-0
Timestamp: 2025-05-29T04:45:18.504Z
Learning: In the PartnerProgramSummary email template (packages/email/src/templates/partner-program-summary.tsx), the stat titles are hardcoded constants ("Clicks", "Leads", "Sales", "Earnings") that will always match the ICONS object keys after toLowerCase() conversion, so icon lookup failures are not possible.

Applied to files:

  • apps/web/ui/partners/confirm-payouts-sheet.tsx
  • apps/web/ui/partners/external-payouts-indicator.tsx
📚 Learning: 2025-10-08T21:33:23.553Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2936
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/analytics/add-hostname-modal.tsx:28-34
Timestamp: 2025-10-08T21:33:23.553Z
Learning: In the dub/ui Button component, when the `disabledTooltip` prop is set to a non-undefined value (e.g., a string), the button is automatically disabled. Therefore, it's not necessary to also add the same condition to the `disabled` prop—setting `disabledTooltip={permissionsError || undefined}` is sufficient to disable the button when there's a permissions error.

Applied to files:

  • apps/web/ui/partners/confirm-payouts-sheet.tsx
  • apps/web/ui/links/disabled-link-tooltip.tsx
  • apps/web/ui/partners/external-payouts-indicator.tsx
📚 Learning: 2025-09-17T17:40:35.470Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2857
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/resources/program-help-and-support.tsx:95-121
Timestamp: 2025-09-17T17:40:35.470Z
Learning: In the Dub UI Switch component, providing a truthy `disabledTooltip` prop automatically disables the switch and prevents user interaction, so an explicit `disabled` prop is not needed when using `disabledTooltip`.

Applied to files:

  • apps/web/ui/links/disabled-link-tooltip.tsx
📚 Learning: 2025-09-17T17:40:35.470Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2857
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/resources/program-help-and-support.tsx:95-121
Timestamp: 2025-09-17T17:40:35.470Z
Learning: In the Dub UI Switch component, providing a truthy `disabledTooltip` prop automatically disables the switch and prevents user interaction, so an explicit `disabled` prop is not needed when using `disabledTooltip`. The component computes `switchDisabled = disabledTooltip ? true : disabled || loading` and passes this to the underlying Radix Switch primitive.

Applied to files:

  • apps/web/ui/links/disabled-link-tooltip.tsx
📚 Learning: 2025-09-24T15:47:40.293Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2872
File: apps/web/app/(ee)/partners.dub.co/(dashboard)/profile/about-you-form.tsx:152-157
Timestamp: 2025-09-24T15:47:40.293Z
Learning: The Button component from dub/ui automatically adds type="button" when an onClick prop is passed, preventing accidental form submissions without requiring explicit type specification. The implementation uses: type={onClick ? "button" : type}

Applied to files:

  • apps/web/ui/partners/external-payouts-indicator.tsx
📚 Learning: 2025-09-24T15:47:40.293Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2872
File: apps/web/app/(ee)/partners.dub.co/(dashboard)/profile/about-you-form.tsx:152-157
Timestamp: 2025-09-24T15:47:40.293Z
Learning: The Button component from dub/ui automatically adds type="button" when an onClick prop is passed, preventing accidental form submissions without requiring explicit type specification.

Applied to files:

  • apps/web/ui/partners/external-payouts-indicator.tsx
📚 Learning: 2025-09-24T15:47:40.293Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2872
File: apps/web/app/(ee)/partners.dub.co/(dashboard)/profile/about-you-form.tsx:152-157
Timestamp: 2025-09-24T15:47:40.293Z
Learning: The Button component from dub/ui automatically sets type="button" when an onClick prop is passed and defaults to type="submit" otherwise, using the logic: type={props.onClick ? "button" : "submit"}. This prevents accidental form submissions when buttons are used for modal triggers or other non-form actions.

Applied to files:

  • apps/web/ui/partners/external-payouts-indicator.tsx
📚 Learning: 2025-10-15T01:05:43.266Z
Learnt from: steven-tey
Repo: dubinc/dub PR: 2958
File: apps/web/app/app.dub.co/(dashboard)/[slug]/settings/members/page-client.tsx:432-457
Timestamp: 2025-10-15T01:05:43.266Z
Learning: In apps/web/app/app.dub.co/(dashboard)/[slug]/settings/members/page-client.tsx, defer refactoring the custom MenuItem component (lines 432-457) to use the shared dub/ui MenuItem component to a future PR, as requested by steven-tey.

Applied to files:

  • packages/ui/src/tooltip.tsx
📚 Learning: 2025-09-24T16:10:37.349Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2872
File: apps/web/ui/partners/partner-about.tsx:11-11
Timestamp: 2025-09-24T16:10:37.349Z
Learning: In the Dub codebase, the team prefers to import Icon as a runtime value from "dub/ui" and uses Icon as both a type and variable name in component props, even when this creates shadowing. This is their established pattern and should not be suggested for refactoring.

Applied to files:

  • packages/ui/src/tooltip.tsx
🧬 Code graph analysis (1)
apps/web/ui/links/disabled-link-tooltip.tsx (1)
packages/ui/src/tooltip.tsx (1)
  • Tooltip (59-110)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (11)
packages/tailwind-config/tailwind.config.ts (1)

24-25: LGTM!

The typography rules remove default quotation marks from inline code elements, ensuring clean rendering of markdown code blocks in tooltips.

apps/web/ui/links/disabled-link-tooltip.tsx (1)

5-5: LGTM!

The tooltip content has been successfully migrated to a markdown string format with properly formatted inline links.

apps/web/ui/domains/register-domain-form.tsx (1)

367-367: LGTM!

The tooltip title has been simplified to a plain string with markdown-style inline code formatting. The backticks around .link will render as inline code via the TooltipMarkdown component.

apps/web/ui/analytics/bar-list.tsx (1)

221-227: LGTM!

The migration to markdown-based tooltip content is correct. The markdown link format [${title}](${title}) creates a clickable link where both the display text and URL are the same, which is appropriate for displaying URLs. The stopPropagation prevents the click event from bubbling to the parent row handler.

apps/web/ui/partners/external-payouts-indicator.tsx (2)

1-1: LGTM!

Removing the Button import is correct as the tooltip content no longer renders a Button component.


13-13: LGTM!

The tooltip content has been successfully migrated to a markdown string with inline code formatting (backticks) and multiple embedded links. The dynamic slug interpolation works correctly within the template literal.

apps/web/ui/partners/confirm-payouts-sheet.tsx (1)

438-438: LGTM!

The tooltip content has been successfully migrated to a markdown string format, consistent with the pattern used throughout this PR.

packages/ui/src/tooltip.tsx (4)

20-46: Well-implemented markdown rendering for tooltips.

The TooltipMarkdown component properly configures ReactMarkdown with:

  • Custom link handling that opens in new tabs with security attributes
  • Styled inline code elements
  • Appropriate prose typography classes

The implementation is secure as ReactMarkdown doesn't execute scripts by default, and all markdown content comes from trusted developer-defined strings.


97-100: LGTM!

String content is now rendered through TooltipMarkdown, enabling markdown formatting while preserving backward compatibility for function and ReactNode content.


127-127: LGTM!

The TooltipContent title is now rendered via TooltipMarkdown, enabling markdown formatting in tooltip titles.


119-119: Breaking change verified: All TooltipContent usages properly updated.

The title prop type has been correctly narrowed from ReactNode to string in the component definition. All 10+ usages across the codebase have been updated to pass string values (template literals, variables, or string-returning functions like exceededLimitError). No JSX elements are being passed where they would violate the new type constraint.

@steven-tey steven-tey merged commit 049127a into main Nov 9, 2025
7 of 8 checks passed
@steven-tey steven-tey deleted the tooltip-markdown branch November 9, 2025 04:23
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.

2 participants