Skip to content

Conversation

@kotAPI
Copy link
Collaborator

@kotAPI kotAPI commented Dec 21, 2025

Summary by CodeRabbit

Release Notes

  • Documentation

    • Updated component maturity guidelines with clearer descriptions of experimental, beta, and production-ready statuses
    • Standardized icon usage across component examples for consistency
    • Improved visual presentation of component coverage documentation
  • New Features

    • Added Ruler utility component for visual alignment guidance in documentation
  • Style

    • Refined spacing and layout of dialog action buttons
    • Reduced size of feature indicator icons for improved visual hierarchy
    • Enhanced tooltip styling and content presentation

✏️ Tip: You can customize this high-level summary in your review settings.

@changeset-bot
Copy link

changeset-bot bot commented Dec 21, 2025

⚠️ No Changeset found

Latest commit: fcf0543

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 21, 2025

Walkthrough

This PR systematically modernizes documentation examples by replacing custom SVG icons with lucide-react library icons across multiple component examples and helpers, restructures documentation (moving component coverage guide, adding visualization utilities), introduces a new RadUIDemo landing component, updates core dependencies (adds lucide-react, upgrades @radui/ui), and refines markup/styling with minor layout improvements.

Changes

Cohort / File(s) Summary
Icon Replacements in Callout Examples
docs/app/docs/components/callout/examples/*
Replaced locally-defined BookmarkIcon with lucide-react AlertCircle icon across CalloutExample, CalloutColor, CalloutSizes, and CalloutVariants; updated rendering with full-size styling via className.
Icon Replacements in Component Examples
docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx, docs/app/docs/components/toggle/docs/toggle-example-basic.tsx
Swapped inline SVG icon definitions (FrameIcon, CropIcon, LayersIcon, ColumnsIcon, Power) with imported lucide-react equivalents.
Blockquote Example Punctuation
docs/app/docs/components/blockquote/examples/*
Replaced em-dash (—) with hyphen (-) separator in BlockQuoteColor, BlockQuoteExample, and BlockQuoteSizes example text.
Alert Dialog Layout
docs/app/docs/components/alert-dialog/docs/example_1.tsx
Wrapped action buttons in flex container with justify-end and gap-2 classes for improved alignment.
Aspect Ratio & Tooltip Examples
docs/app/docs/components/aspect-ratio/page.mdx, docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx
Added ruler visualization around AspectRatio content; simplified Tooltip by removing Card wrapper and adding direct CSS styling.
New Icon Component Module
docs/app/docs/contributing/component-coverage/CoverageIcons.js
Introduced new component exporting CheckIcon, XIcon, HighPriorityIcon, MediumPriorityIcon, and DashIcon using lucide-react icons.
Component Coverage Documentation Restructure
docs/app/docs/contributing/component-coverage/page.mdx, docs/app/docs/contributing/component-maturity-rubric/page.mdx
Migrated from emoji indicators to icon components in coverage matrix; removed emoji prefixes from maturity level headings; expanded guidance sections with explicit criteria.
Component Coverage Guide Removal
docs/app/docs/guides/component-coverage/page.mdx, docs/app/docs/guides/component-coverage/seo.ts
Removed entire component coverage comparison guide and associated SEO metadata.
Layout & CSS Updates
docs/app/layout.js, docs/app/layout.tsx, docs/app/globals.scss
Added suppressHydrationWarning to body element; replaced BookmarkIcon with lucide-react in layout callout; removed .layout-image CSS block; added scroll-locked scrollbar hiding styles.
Landing Page Components
docs/app/landingComponents/HeroSection.js, docs/app/landingComponents/MusicAppPlayerDemo.js, docs/app/landingComponents/RadUIDemo.js
Commented out multiple demo imports; introduced comprehensive RadUIDemo component with multi-section dashboard; replaced inline SVG icons (LeftArrow, ShuffleIcon, ThreeDots) with lucide-react equivalents in MusicAppPlayerDemo.
Music App Showcase Updates
docs/app/showcase/music-app/helpers/*
Consolidated lucide-react icon imports across MusicPlayer, MusicSidebar, and PlaylistHero; updated icon sizing and container wrapping for full-width/height rendering.
Documentation Helper Components
docs/components/layout/Documentation/Documentation.js, docs/components/layout/Documentation/helpers/CodeBlock.js, docs/components/layout/Documentation/helpers/ComponentFeatures/ComponentFeatures.js, docs/components/layout/Documentation/helpers/ComponentHero/ComponentHero.js, docs/components/layout/Documentation/helpers/DocsTable.js, docs/components/layout/Documentation/utils.js
Replaced inline SVG arrows with lucide-react ChevronLeft/ChevronRight; added as prop to ComponentHero for heading level control; refined scrollbar visibility logic in CodeBlock; reduced tick indicator size; replaced LinkIcon and InfoIcon with lucide-react equivalents.
New Ruler Utility Component
docs/components/utility/Ruler/index.js
Introduced new Ruler component rendering directional arrows and dotted lines with configurable orientation (horizontal/vertical) and length.
Copy Component & PostHog Provider Updates
docs/components/Copy.js, docs/components/PostHogProvider.tsx
Replaced inline SVG CopyIcon with lucide-react Copy icon; expanded PostHog error suppression to catch fetch/script load failures and unhandled promise rejections with delayed initialization and reduced error noise configuration.
Dependency Updates
docs/package.json
Added lucide-react ^0.562.0; updated @radui/ui from ^0.0.47 to ^0.1.9.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Areas requiring extra attention:

  • PostHogProvider.tsx: Expanded error suppression logic with multiple conditional paths for fetch/script failures and promise rejection handling—verify error detection patterns are comprehensive and unintended errors aren't being silently swallowed.
  • RadUIDemo.js: New large component with numerous state hooks and complex nested layout—verify component structure, accessibility, and that all interactive elements (inputs, toggles, radio groups) function as intended.
  • ComponentHero prop signature change: New as prop for heading level control—confirm all call sites either omit it (uses default "h2") or provide valid heading levels.
  • ScrollArea scrollbar visibility logic in CodeBlock.js: Conditional scrollbar rendering based on inline and expanded state—verify scrolling behavior is correct in all states (expanded/collapsed, inline/block).

Possibly related PRs

Suggested labels

automerge

Suggested reviewers

  • GoldGroove06

Poem

🐰 Icons dance from SVG chains,
Lucide brings them bright and plain.
Coverage matrices glow with grace,
Layout rulers mark their place.
Documentation springs anew,
Fresh and modern through and through! 🌟

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'Docs improvements' is overly vague and generic, using a non-descriptive term that doesn't convey meaningful information about the specific changes made in this comprehensive pull request. Consider a more specific title that highlights the main changes, such as 'Replace local SVG icons with lucide-react icons across docs and demos' or 'Consolidate documentation icons and update layout components'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch kotapi/docs-improvements-20-dec-2025

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

// Be more lenient with pattern matching to catch all variations
const isPostHogError =
(errorMessage.includes('[PostHog.js]') && errorMessage.includes('failed to load script')) ||
(fullMessage.includes('failed to fetch') && (fullMessage.includes('posthog') || fullMessage.includes('posthog-js') || fullMessage.includes('posthog.com'))) ||

Check failure

Code scanning / CodeQL

Incomplete URL substring sanitization High documentation

'
posthog.com
' can be anywhere in the URL, and arbitrary hosts may come before or after it.

Copilot Autofix

AI 20 days ago

In general, instead of checking whether a domain name appears anywhere within an arbitrary string (which could be part of a path or query of some other URL), you should extract hostnames from any URLs in the string and compare those hostnames against an allow‑list. For this case, the goal is simply to decide whether an error is likely to be PostHog‑related; we can preserve that behavior while avoiding substring URL checks by parsing any URLs we see and checking their hostname against posthog.com or known PostHog subdomains.

The minimal change here is to replace the fullMessage.includes('posthog.com') part of the condition with a helper that scans fullMessage for URLs, parses them using the standard URL constructor, and returns true if any parsed hostname equals posthog.com or ends with .posthog.com. That keeps the intent ("errors involving PostHog network endpoints") but avoids the incomplete substring sanitization pattern. Concretely, inside PostHogProvider we can define a small hasPosthogHost(fullMessage: string): boolean function, use a simple regex to find potential URLs, safely parse them in a try/catch, and then change line 30 from fullMessage.includes('posthog.com') to hasPosthogHost(fullMessage). No new imports are needed; URL is available in modern browsers and Next.js environments.

Specifically:

  • Add a helper function near the top of the PostHogProvider component (before useEffect) that:
    • Uses a regex like /https?:\/\/[^\s)"]+/g to find URL‑like substrings in the message.
    • For each match, does new URL(match) and checks url.hostname === 'posthog.com' || url.hostname.endsWith('.posthog.com').
    • Returns true if any match passes; false otherwise.
  • Update the isPostHogError expression so that the third clause on line 30 becomes hasPosthogHost(fullMessage) instead of fullMessage.includes('posthog.com').
    This keeps the logic functionally similar while addressing CodeQL’s concern.
Suggested changeset 1
docs/components/PostHogProvider.tsx

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/docs/components/PostHogProvider.tsx b/docs/components/PostHogProvider.tsx
--- a/docs/components/PostHogProvider.tsx
+++ b/docs/components/PostHogProvider.tsx
@@ -4,6 +4,33 @@
 import { PostHogProvider as PHProvider } from "posthog-js/react"
 import { useEffect } from "react"
 
+function hasPosthogHost(message: string): boolean {
+  if (!message) {
+    return false
+  }
+
+  const urlPattern = /https?:\/\/[^\s)"]+/gi
+  const matches = message.match(urlPattern)
+
+  if (!matches) {
+    return false
+  }
+
+  for (const candidate of matches) {
+    try {
+      const url = new URL(candidate)
+      const hostname = url.hostname.toLowerCase()
+      if (hostname === "posthog.com" || hostname.endsWith(".posthog.com")) {
+        return true
+      }
+    } catch {
+      // Ignore values that are not valid URLs
+    }
+  }
+
+  return false
+}
+
 export function PostHogProvider({ children }: { children: React.ReactNode }) {
   // Early return if no API key - prevents any PostHog code from running
   const hasPostHogKey = process.env.NEXT_PUBLIC_POSTHOG_KEY && 
@@ -27,7 +54,7 @@
       // Be more lenient with pattern matching to catch all variations
       const isPostHogError = 
         (errorMessage.includes('[PostHog.js]') && errorMessage.includes('failed to load script')) ||
-        (fullMessage.includes('failed to fetch') && (fullMessage.includes('posthog') || fullMessage.includes('posthog-js') || fullMessage.includes('posthog.com'))) ||
+        (fullMessage.includes('failed to fetch') && (fullMessage.includes('posthog') || fullMessage.includes('posthog-js') || hasPosthogHost(fullMessage))) ||
         (errorMessage.includes('TypeError') && errorMessage.includes('Failed to fetch') && (stackTrace.includes('posthog') || stackTrace.includes('posthog-js'))) ||
         // Catch fetch errors from PostHog module (webpack-internal path includes posthog-js)
         (errorMessage.includes('TypeError') && errorMessage.includes('Failed to fetch') && stackTrace.includes('webpack-internal') && stackTrace.includes('posthog-js')) ||
EOF
@@ -4,6 +4,33 @@
import { PostHogProvider as PHProvider } from "posthog-js/react"
import { useEffect } from "react"

function hasPosthogHost(message: string): boolean {
if (!message) {
return false
}

const urlPattern = /https?:\/\/[^\s)"]+/gi
const matches = message.match(urlPattern)

if (!matches) {
return false
}

for (const candidate of matches) {
try {
const url = new URL(candidate)
const hostname = url.hostname.toLowerCase()
if (hostname === "posthog.com" || hostname.endsWith(".posthog.com")) {
return true
}
} catch {
// Ignore values that are not valid URLs
}
}

return false
}

export function PostHogProvider({ children }: { children: React.ReactNode }) {
// Early return if no API key - prevents any PostHog code from running
const hasPostHogKey = process.env.NEXT_PUBLIC_POSTHOG_KEY &&
@@ -27,7 +54,7 @@
// Be more lenient with pattern matching to catch all variations
const isPostHogError =
(errorMessage.includes('[PostHog.js]') && errorMessage.includes('failed to load script')) ||
(fullMessage.includes('failed to fetch') && (fullMessage.includes('posthog') || fullMessage.includes('posthog-js') || fullMessage.includes('posthog.com'))) ||
(fullMessage.includes('failed to fetch') && (fullMessage.includes('posthog') || fullMessage.includes('posthog-js') || hasPosthogHost(fullMessage))) ||
(errorMessage.includes('TypeError') && errorMessage.includes('Failed to fetch') && (stackTrace.includes('posthog') || stackTrace.includes('posthog-js'))) ||
// Catch fetch errors from PostHog module (webpack-internal path includes posthog-js)
(errorMessage.includes('TypeError') && errorMessage.includes('Failed to fetch') && stackTrace.includes('webpack-internal') && stackTrace.includes('posthog-js')) ||
Copilot is powered by AI and may make mistakes. Always verify output.
// Catch PostHog-related fetch errors in promise rejections
const lowerError = fullError.toLowerCase()
if (
(lowerError.includes('failed to fetch') && (lowerError.includes('posthog') || lowerError.includes('posthog-js') || lowerError.includes('posthog.com'))) ||

Check failure

Code scanning / CodeQL

Incomplete URL substring sanitization High documentation

'
posthog.com
' can be anywhere in the URL, and arbitrary hosts may come before or after it.

Copilot Autofix

AI 20 days ago

Copilot could not generate an autofix suggestion

Copilot could not generate an autofix suggestion for this alert. Try pushing a new commit or if the problem persists contact support.

@github-actions
Copy link
Contributor

Coverage

This report compares the PR with the base branch. "Δ" shows how the PR affects each metric.

Metric PR Δ
Statements 83.99% +0.00%
Branches 60.52% +0.00%
Functions 66.5% +0.00%
Lines 82.64% +0.00%

Coverage improved or stayed the same. Great job!

Run npm run coverage locally for detailed reports and target untested areas to raise these numbers.

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: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/app/docs/components/callout/examples/CalloutVariants.tsx (1)

19-19: Remove debug console.log statement.

Line 19 contains a console.log(variant) statement that appears to be debug code. This should be removed before merging.

🔎 Proposed fix
       <div className="flex items-center gap-4">
         {calloutVariants.map((variant,idx) => {
-          console.log(variant);
           return <span key={idx}>
🧹 Nitpick comments (12)
docs/app/landingComponents/MusicAppPlayerDemo.js (2)

38-48: Consider using the size prop for more concise icon sizing.

The current wrapper div approach works but lucide-react icons support a size prop that can simplify the markup. Based on the pattern used in Documentation.js, you could refactor this to:

<LeftArrow size={24} className="text-gray-900" />

And for the right-side icons:

<ShuffleIcon size={18} />
<ThreeDots size={18} />

This eliminates the need for wrapper divs while achieving the same visual result.

🔎 Proposed refactor
                    <div className='flex justify-between items-center'>
-                        <div className='text-gray-900 w-6 h-6'>
-                            <LeftArrow className="w-full h-full" />
-                        </div>
+                        <LeftArrow size={24} className="text-gray-900" />
                        <div>
                            <div className='text-green-900 flex items-center space-x-2'>
-                                <div className="w-[18px] h-[18px]">
-                                    <ShuffleIcon className="w-full h-full" />
-                                </div>
-                                <div className="w-[18px] h-[18px]">
-                                    <ThreeDots className="w-full h-full" />
-                                </div>
+                                <ShuffleIcon size={18} />
+                                <ThreeDots size={18} />
                            </div>
                        </div>
                    </div>

63-63: Remove trailing semicolon after JSX element.

The semicolon after <MusicBars /> is unnecessary in JSX context.

🔎 Proposed fix
-                                <MusicBars />;
+                                <MusicBars />
docs/app/showcase/music-app/helpers/sections/PlaylistHero.tsx (1)

71-71: Consider adding explicit size constraints to the RightArrow icon for consistency.

Unlike other icons in this showcase (MusicPlayer and MusicSidebar use 18x18 constrained icons), this icon has no explicit size classes. While the Button component may handle sizing automatically, adding explicit size classes (e.g., size={18} or className="w-4 h-4") would ensure consistency across the music app showcase.

🔎 Suggested approach for consistent icon sizing
-                    <Button variant="solid" className="space-x-2"> <span>Play Now</span> <RightArrow /> </Button>
+                    <Button variant="solid" className="space-x-2"> <span>Play Now</span> <RightArrow size={18} /> </Button>
docs/app/showcase/music-app/helpers/MusicPlayer.tsx (1)

21-22: Consider simplifying the nested div structure.

The nested wrapper div on line 22 could be eliminated by applying w-full h-full directly to the children components, reducing DOM depth.

🔎 Alternative approach without nested div

If the children icons support className props, you could pass the size classes directly:

 const IconContainerSmall: any = ({ children }: any) => {
     return (
-        <div className='text-gray-1000 hover:text-purple-900 cursor-pointer flex items-center justify-center' style={{ height: 18, width: 18 }}>
-            <div className="w-full h-full">{children}</div>
-        </div>
+        <div className='text-gray-1000 hover:text-purple-900 cursor-pointer flex items-center justify-center' style={{ height: 18, width: 18 }}>
+            {React.cloneElement(children, { className: "w-full h-full" })}
+        </div>
     );
 }

Note: This assumes children is a single React element. Keep the current approach if that's not guaranteed.

docs/app/showcase/music-app/helpers/MusicSidebar.js (1)

10-12: Consider simplifying the nested div structure.

Similar to MusicPlayer.tsx, this nested wrapper adds DOM depth. If icon components accept className props, you could pass size classes directly to reduce nesting.

🔎 Alternative approach without nested div
 const MenuItem = ({children, label="", active=false}) => {
     const DIMENSIONS = 18;
     return <div className={`flex items-center space-x-2 cursor-pointer`}>
                 <div className='flex items-center space-x-2'>
-                    <div className='flex-none' style={{width:DIMENSIONS, height:DIMENSIONS}}>
-                        <div className="w-full h-full">{children}</div>
-                    </div>
+                    <div className='flex-none' style={{width:DIMENSIONS, height:DIMENSIONS}}>
+                        {React.cloneElement(children, { className: "w-full h-full" })}
+                    </div>
                     <Text className={`${active?'!font-medium text-gray-1000':'font-light text-gray-900 hover:text-gray-1000 !hover:font-medium'}`}>{label}</Text>
                 </div>
         </div>
 }

Note: This assumes children is a single React element.

docs/components/layout/Documentation/helpers/ComponentFeatures/ComponentFeatures.js (1)

6-24: Replace custom TickIcon with lucide-react Check for consistency.

The codebase uses lucide-react icons throughout docs components (e.g., Copy.js). Replace the custom SVG TickIcon (lines 6-8) with lucide-react's Check icon to maintain consistency and reduce custom code. The proposed migration is straightforward and the reduced container size (16px) with p-1 padding provides adequate spacing for the icon.

docs/app/globals.scss (1)

138-144: Acknowledge technical debt - track the TODO.

The scrollbar hiding logic is a temporary workaround, as indicated by the comment. This should ideally be handled within the ScrollArea component in the library itself.

Consider creating a tracking issue for this TODO to ensure it gets addressed in a future update. Would you like me to help draft an issue description for moving this functionality to the @radui/ui ScrollArea component?

docs/components/Copy.js (1)

23-29: Consider simplifying the TickIcon wrapper.

The TickIcon function creates a wrapper div just to render the Check icon. Since you're already wrapping icons in divs at the usage site (lines 36-40), this wrapper function adds an unnecessary layer.

🔎 Proposed simplification
-    const TickIcon = () => {
-        return (
-            <div className="w-4 h-4">
-                <Check className="w-full h-full" />
-            </div>
-        );
-    };
-
     return (
         <span className = "flex items-center">
             <button
                 onClick={handleCopy}
                 className=" m-0.5 mr-0 ml-2 px-1.5 py-1.5 border border-blue-400 hover:border-blue-500 text-sm font-bold rounded text-blue-900 hover:text-blue-900 bg-blue-100 hover:bg-blue-300">
-                {isCopied ? <TickIcon /> : (
+                {isCopied ? (
+                    <div className="w-4 h-4">
+                        <Check className="w-full h-full" />
+                    </div>
+                ) : (
                     <div className="w-4 h-4">
                         <CopyIcon className="w-full h-full" />
                     </div>
                 )}
docs/components/utility/Ruler/index.js (1)

5-7: Consider documenting the length prop behavior.

The length prop only recognizes 'full' as a special value; any other value results in no length modifier. This might be confusing for users. Consider either:

  • Adding JSDoc to document this behavior
  • Supporting more values like 'auto', 'fit-content', etc.
  • Using a boolean fullLength prop instead
docs/app/landingComponents/RadUIDemo.js (2)

138-141: Inconsistent icon usage: inline SVGs instead of lucide-react.

This PR systematically replaces inline SVGs with lucide-react icons across multiple files (Copy.js, Documentation.js, CalloutVariants.tsx, etc.), but this new component introduces several inline SVG icons. For consistency and maintainability, consider using lucide-react icons here as well.

Examples of inline SVGs that could use lucide-react
  • Lines 138-141: Info/help icon → could use HelpCircle or Info from lucide-react
  • Lines 171-173: Info icon → Info from lucide-react
  • Lines 183-185: Sparkles icon → Sparkles from lucide-react
  • Lines 198-200: Checkmark icon → CheckCircle or Check from lucide-react
  • Lines 277-279, 284-286: Info and sparkles icons → lucide-react equivalents
  • Line 294: Back arrow → ChevronLeft from lucide-react

This would align with the broader iconography standardization in the PR.

Also applies to: 171-173, 183-185, 198-200, 277-279, 284-286, 293-295


15-376: Consider extracting sub-components to improve maintainability.

This 376-line component contains multiple distinct UI sections (payment form, team members, compute settings, survey, etc.). Extracting these into smaller, focused components would improve:

  • Reusability across the docs site
  • Testability of individual sections
  • Code organization and maintainability

Example sections that could be extracted:

  • PaymentMethodCard (lines 34-74)
  • BillingAddressCard (lines 77-89)
  • TeamMembersCard (lines 106-123)
  • ComputeEnvironmentCard (lines 209-228)
  • SurveyCard (lines 330-359)
docs/app/landingComponents/HeroSection.js (1)

7-7: Unused import: RadUIDemo is imported but not rendered.

The RadUIDemo component is imported on Line 7 but its usage is commented out (lines 160-165). This creates an unused import warning. Consider either:

  • Uncommenting the demo if it's ready for production
  • Removing the import until the component is actually needed
  • Adding a comment explaining why it's imported but not used

Also applies to: 160-165

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 140d24d and fcf0543.

⛔ Files ignored due to path filters (1)
  • docs/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (36)
  • docs/app/docs/components/alert-dialog/docs/example_1.tsx (1 hunks)
  • docs/app/docs/components/aspect-ratio/page.mdx (2 hunks)
  • docs/app/docs/components/blockquote/examples/BlockQuoteColor.tsx (1 hunks)
  • docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx (1 hunks)
  • docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx (1 hunks)
  • docs/app/docs/components/callout/examples/CalloutColor.tsx (2 hunks)
  • docs/app/docs/components/callout/examples/CalloutExample.tsx (1 hunks)
  • docs/app/docs/components/callout/examples/CalloutSizes.tsx (2 hunks)
  • docs/app/docs/components/callout/examples/CalloutVariants.tsx (2 hunks)
  • docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx (1 hunks)
  • docs/app/docs/components/toggle/docs/toggle-example-basic.tsx (1 hunks)
  • docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx (1 hunks)
  • docs/app/docs/contributing/component-coverage/CoverageIcons.js (1 hunks)
  • docs/app/docs/contributing/component-coverage/page.mdx (2 hunks)
  • docs/app/docs/contributing/component-maturity-rubric/page.mdx (3 hunks)
  • docs/app/docs/guides/component-coverage/page.mdx (0 hunks)
  • docs/app/docs/guides/component-coverage/seo.ts (0 hunks)
  • docs/app/docs/layout.tsx (2 hunks)
  • docs/app/globals.scss (1 hunks)
  • docs/app/landingComponents/HeroSection.js (2 hunks)
  • docs/app/landingComponents/MusicAppPlayerDemo.js (2 hunks)
  • docs/app/landingComponents/RadUIDemo.js (1 hunks)
  • docs/app/layout.js (1 hunks)
  • docs/app/showcase/music-app/helpers/MusicPlayer.tsx (3 hunks)
  • docs/app/showcase/music-app/helpers/MusicSidebar.js (2 hunks)
  • docs/app/showcase/music-app/helpers/sections/PlaylistHero.tsx (1 hunks)
  • docs/components/Copy.js (2 hunks)
  • docs/components/PostHogProvider.tsx (3 hunks)
  • docs/components/layout/Documentation/Documentation.js (2 hunks)
  • docs/components/layout/Documentation/helpers/CodeBlock.js (2 hunks)
  • docs/components/layout/Documentation/helpers/ComponentFeatures/ComponentFeatures.js (1 hunks)
  • docs/components/layout/Documentation/helpers/ComponentHero/ComponentHero.js (2 hunks)
  • docs/components/layout/Documentation/helpers/DocsTable.js (1 hunks)
  • docs/components/layout/Documentation/utils.js (2 hunks)
  • docs/components/utility/Ruler/index.js (1 hunks)
  • docs/package.json (2 hunks)
💤 Files with no reviewable changes (2)
  • docs/app/docs/guides/component-coverage/page.mdx
  • docs/app/docs/guides/component-coverage/seo.ts
🧰 Additional context used
📓 Path-based instructions (3)
docs/**/*.{ts,tsx}

📄 CodeRabbit inference engine (docs/.cursor/rules/posthog-integration.mdc)

In TypeScript, store feature flag names in an enum

Files:

  • docs/app/docs/components/alert-dialog/docs/example_1.tsx
  • docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx
  • docs/app/docs/components/callout/examples/CalloutSizes.tsx
  • docs/app/docs/components/callout/examples/CalloutVariants.tsx
  • docs/app/docs/components/callout/examples/CalloutColor.tsx
  • docs/app/docs/components/toggle/docs/toggle-example-basic.tsx
  • docs/app/docs/layout.tsx
  • docs/app/docs/components/callout/examples/CalloutExample.tsx
  • docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx
  • docs/app/docs/components/blockquote/examples/BlockQuoteColor.tsx
  • docs/app/showcase/music-app/helpers/sections/PlaylistHero.tsx
  • docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx
  • docs/app/showcase/music-app/helpers/MusicPlayer.tsx
  • docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx
  • docs/components/PostHogProvider.tsx
docs/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (docs/.cursor/rules/posthog-integration.mdc)

docs/**/*.{ts,tsx,js,jsx}: Write enum/const object members for feature flag names in UPPERCASE_WITH_UNDERSCORE
Gate flag-dependent code with a check that verifies the flag’s values are valid and expected before use
If a custom person/event property is referenced in two or more places, define it in a central enum (TS) or const object (JS) and reuse that reference

Files:

  • docs/app/docs/components/alert-dialog/docs/example_1.tsx
  • docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx
  • docs/components/layout/Documentation/Documentation.js
  • docs/app/docs/components/callout/examples/CalloutSizes.tsx
  • docs/components/layout/Documentation/helpers/DocsTable.js
  • docs/app/layout.js
  • docs/components/utility/Ruler/index.js
  • docs/app/docs/components/callout/examples/CalloutVariants.tsx
  • docs/components/layout/Documentation/helpers/ComponentHero/ComponentHero.js
  • docs/app/landingComponents/HeroSection.js
  • docs/components/layout/Documentation/helpers/ComponentFeatures/ComponentFeatures.js
  • docs/app/docs/components/callout/examples/CalloutColor.tsx
  • docs/app/docs/components/toggle/docs/toggle-example-basic.tsx
  • docs/app/docs/layout.tsx
  • docs/app/docs/components/callout/examples/CalloutExample.tsx
  • docs/components/layout/Documentation/utils.js
  • docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx
  • docs/app/showcase/music-app/helpers/MusicSidebar.js
  • docs/app/landingComponents/MusicAppPlayerDemo.js
  • docs/app/docs/components/blockquote/examples/BlockQuoteColor.tsx
  • docs/app/landingComponents/RadUIDemo.js
  • docs/app/docs/contributing/component-coverage/CoverageIcons.js
  • docs/app/showcase/music-app/helpers/sections/PlaylistHero.tsx
  • docs/components/layout/Documentation/helpers/CodeBlock.js
  • docs/components/Copy.js
  • docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx
  • docs/app/showcase/music-app/helpers/MusicPlayer.tsx
  • docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx
  • docs/components/PostHogProvider.tsx
docs/**/*.{js,jsx}

📄 CodeRabbit inference engine (docs/.cursor/rules/posthog-integration.mdc)

In JavaScript, store feature flag names as strings in a constant object to simulate an enum, and use a consistent naming convention

Files:

  • docs/components/layout/Documentation/Documentation.js
  • docs/components/layout/Documentation/helpers/DocsTable.js
  • docs/app/layout.js
  • docs/components/utility/Ruler/index.js
  • docs/components/layout/Documentation/helpers/ComponentHero/ComponentHero.js
  • docs/app/landingComponents/HeroSection.js
  • docs/components/layout/Documentation/helpers/ComponentFeatures/ComponentFeatures.js
  • docs/components/layout/Documentation/utils.js
  • docs/app/showcase/music-app/helpers/MusicSidebar.js
  • docs/app/landingComponents/MusicAppPlayerDemo.js
  • docs/app/landingComponents/RadUIDemo.js
  • docs/app/docs/contributing/component-coverage/CoverageIcons.js
  • docs/components/layout/Documentation/helpers/CodeBlock.js
  • docs/components/Copy.js
🧠 Learnings (2)
📚 Learning: 2024-11-24T06:43:42.194Z
Learnt from: kotAPI
Repo: rad-ui/ui PR: 576
File: src/core/primitives/Toggle/index.tsx:15-22
Timestamp: 2024-11-24T06:43:42.194Z
Learning: In the `TogglePrimitive` component (`src/core/primitives/Toggle/index.tsx`), when the component becomes controlled, it's acceptable to not sync the internal `isPressed` state with the external `pressed` prop.

Applied to files:

  • docs/app/docs/components/toggle/docs/toggle-example-basic.tsx
📚 Learning: 2024-12-12T08:34:33.079Z
Learnt from: decipher-cs
Repo: rad-ui/ui PR: 417
File: src/components/ui/Dropdown/Dropdown.stories.tsx:43-50
Timestamp: 2024-12-12T08:34:33.079Z
Learning: Ensure to verify existing ARIA attributes in components before suggesting additions during code reviews, especially in the `Dropdown.Trigger` component in `src/components/ui/Dropdown/Dropdown.stories.tsx`.

Applied to files:

  • docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx
🧬 Code graph analysis (4)
docs/app/docs/components/alert-dialog/docs/example_1.tsx (1)
docs/app/docs/components/alert-dialog/docs/anatomy.tsx (1)
  • AlertDialog (3-18)
docs/components/layout/Documentation/helpers/ComponentHero/ComponentHero.js (1)
docs/components/layout/Documentation/utils.js (2)
  • BookMarkLink (4-37)
  • BookMarkLink (4-37)
docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx (1)
docs/app/docs/components/tooltip/docs/anatomy.tsx (1)
  • Tooltip (3-14)
docs/app/landingComponents/MusicAppPlayerDemo.js (1)
docs/components/layout/Documentation/Documentation.js (1)
  • LeftArrow (15-17)
🪛 GitHub Check: CodeQL
docs/components/PostHogProvider.tsx

[failure] 30-30: Incomplete URL substring sanitization
'posthog.com' can be anywhere in the URL, and arbitrary hosts may come before or after it.


[failure] 57-57: Incomplete URL substring sanitization
'posthog.com' can be anywhere in the URL, and arbitrary hosts may come before or after it.

🪛 LanguageTool
docs/app/docs/contributing/component-maturity-rubric/page.mdx

[grammar] ~24-~24: Use a hyphen to join words.
Context: ...ure complete, usable, still gaining real world confidence - Production: stabl...

(QB_NEW_EN_HYPHEN)

⏰ 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: coverage
🔇 Additional comments (29)
docs/app/docs/components/blockquote/examples/BlockQuoteExample.tsx (1)

6-6: LGTM: Typographic simplification applied.

The change from em dash (—) to hyphen (-) simplifies the attribution separator. Both are acceptable, and the hyphen is more web-friendly and consistent with the updates across other BlockQuote examples in this PR.

docs/app/docs/components/blockquote/examples/BlockQuoteColor.tsx (1)

9-9: LGTM: Consistent typographic update.

The punctuation change from em dash to hyphen aligns with the other BlockQuote examples updated in this PR, maintaining consistency across the documentation.

docs/app/docs/components/blockquote/examples/BlockQuoteSizes.tsx (1)

10-10: LGTM: Consistent punctuation update.

The change from em dash to hyphen maintains consistency with the other BlockQuote documentation examples updated in this PR.

docs/app/landingComponents/MusicAppPlayerDemo.js (1)

13-13: LGTM! Good migration to lucide-react.

The import of lucide-react icons standardizes icon usage across the documentation and reduces maintenance overhead compared to custom SVG components.

docs/components/PostHogProvider.tsx (2)

108-125: LGTM on cleanup and conditional rendering.

The cleanup function correctly:

  • Clears the initialization timeout
  • Restores the original console.error
  • Removes the unhandled rejection listener

The conditional rendering appropriately returns children without the provider when no valid API key exists.


75-106: The defaults configuration option is valid and correctly formatted.

The defaults option accepts a date string (such as '2025-11-30') for a configuration snapshot to initialize PostHog. Your implementation using '2025-05-24' is correct.

The setTimeout(..., 0) pattern to defer initialization is a pragmatic approach and PostHog handles uninitialized state internally, so this should function as intended.

docs/app/showcase/music-app/helpers/MusicPlayer.tsx (2)

32-32: LGTM - Appropriate sizing for PlayIcon.

The w-full h-full classes ensure the icon properly fills the 48x48 PlayButton container.


6-6: All requested icons are valid exports from lucide-react version 0.562.0.

StepBack can be imported from lucide-react, StepForward is available, and Play can be imported from lucide-react. The icon names are correct.

docs/app/showcase/music-app/helpers/sections/PlaylistHero.tsx (1)

9-9: The import statement is correct. lucide-react exports the ArrowRight icon, so no changes are needed.

docs/app/showcase/music-app/helpers/MusicSidebar.js (1)

1-1: Verify the correct icon name for the Disc icon.

lucide-react exports Home, Rocket, and Music icons. However, the Disc icon name requires clarification. Lucide provides icon variants like Disc3, but no explicit confirmation was found for importing a plain "Disc" icon from lucide-react. Consider verifying the correct icon name (e.g., Disc3, Disc2) for your use case. Additionally, verify that using Music aliased as RowsIcon aligns with its visual representation.

docs/app/docs/components/toggle-group/docs/toggle-group-example-basic.tsx (2)

10-13: Icon usage looks correct.

The lucide-react icons are properly used as JSX elements in the items array. Note that these icons default to 24x24px; if the previous custom SVG icons had different dimensions, you may want to verify the visual appearance remains consistent.


6-6: Verify icon names exist in lucide-react v0.562.0 before importing.

The import references Frame, Crop, Layers, and Columns icons from lucide-react. While Layers can be imported from lucide-react, verify that Frame and Columns are valid, importable icon names in the current version (^0.562.0 specified in docs/package.json). The GitHub lucide-icons repository documents that some icon names have import restrictions; confirm all four icons are available before merging.

Likely an incorrect or invalid review comment.

docs/package.json (2)

31-31: LGTM - Lucide React addition supports icon migration.

The addition of lucide-react as a dependency aligns well with the PR's objective to modernize documentation examples by replacing custom SVG icons with standardized icon library components.


18-18: Review the @radui/ui v0.1.9 release notes for breaking changes.

The @radui/ui package has been updated from ^0.0.47 to ^0.1.9. Without publicly available release notes for this version, verify that component APIs used in the documentation (Button, Badge, Heading, Text, Link, Tooltip, Card, ScrollArea, Table, Tabs, Dialog, Theme, etc.) remain compatible with v0.1.9.

docs/app/docs/components/alert-dialog/docs/example_1.tsx (1)

20-27: LGTM - Improved button alignment.

Wrapping the action buttons in a flex container with justify-end and gap-2 provides better visual alignment, following common dialog pattern conventions.

docs/app/docs/components/toggle/docs/toggle-example-basic.tsx (1)

6-6: LGTM - Icon migration to lucide-react.

The migration from inline SVG to the lucide-react Power icon is consistent with the PR's objective to standardize icon usage across documentation. The w-full h-full classes ensure the icon properly fills its container.

Also applies to: 12-12

docs/app/docs/components/aspect-ratio/page.mdx (1)

15-48: LGTM - Enhanced documentation with visual rulers.

The addition of ruler components around the AspectRatio example effectively demonstrates the dimensional constraints and provides clear visual context for the 4:3 aspect ratio. The layout is well-structured with clear comments and consistent spacing.

docs/components/layout/Documentation/helpers/CodeBlock.js (1)

87-87: LGTM - Improved scroll behavior for collapsed code blocks.

The changes improve the user experience by:

  1. Preventing overflow scrolling when the code block is collapsed (Line 87)
  2. Only showing the scrollbar when the code block is expanded (Lines 95-99)

This makes the "Show more" button more purposeful by requiring users to expand the code block to access content beyond the initial 180px height.

Also applies to: 95-99

docs/app/docs/components/tooltip/docs/examples/tooltip_example1.tsx (1)

8-13: LGTM - Simplified example structure.

The removal of unnecessary wrapper components (Card, Text) makes this example clearer and more focused on the Tooltip component itself. The inline styling on Tooltip.Content ensures proper visibility.

Note: The z-[9999] value is quite high but acceptable for a documentation example to ensure the tooltip appears above all other content.

docs/components/layout/Documentation/helpers/ComponentHero/ComponentHero.js (1)

10-10: LGTM! Good API enhancement.

The addition of the as prop with a sensible default enables flexible heading hierarchy control while maintaining backward compatibility. The conditional margin application based on title presence prevents unnecessary spacing.

Also applies to: 34-35

docs/app/docs/contributing/component-maturity-rubric/page.mdx (1)

23-26: LGTM! Cleaner documentation format.

Removing emoji prefixes from the maturity level labels improves professionalism and accessibility. The text-based format is clearer and more suitable for technical documentation.

docs/app/docs/components/callout/examples/CalloutVariants.tsx (1)

5-5: LGTM! Icon migration aligns with PR standards.

The replacement of the local BookmarkIcon with lucide-react's AlertCircle is consistent with the iconography standardization across this PR and follows the same sizing pattern (className="w-full h-full") used in other migrated files.

Also applies to: 23-23

docs/components/layout/Documentation/Documentation.js (1)

6-6: LGTM! Clean icon migration to lucide-react.

The replacement of inline SVG arrow icons with lucide-react's ChevronLeft and ChevronRight components is clean and consistent with the broader iconography standardization effort in this PR. The explicit size={18} prop maintains the original icon dimensions.

Also applies to: 15-21

docs/components/layout/Documentation/helpers/DocsTable.js (1)

8-12: LGTM: Clean icon migration with proper accessibility.

The replacement of the inline SVG with lucide-react's Info component is well-executed. The semantic naming is clear, and the aria-hidden="true" attribute correctly marks the icon as decorative since it's wrapped in an accessible Button within a Tooltip trigger.

docs/components/layout/Documentation/utils.js (1)

2-2: LGTM: Semantically correct icon migration.

The replacement of the inline SVG with lucide-react's Link component is clean and semantically appropriate. The icon accurately represents the link functionality, and the size prop provides clear sizing control.

Also applies to: 33-33

docs/app/docs/contributing/component-coverage/CoverageIcons.js (1)

1-10: LGTM: Well-structured icon components with semantic naming.

This new module provides clean, reusable icon components for the coverage matrix. The naming is semantically clear, and the color-coding effectively communicates status and priority levels. The consistent sizing and styling pattern makes the code maintainable.

docs/app/docs/layout.tsx (1)

74-84: LGTM: Improved spacing and content structure.

The layout adjustments enhance readability by increasing the gap from gap-1 to gap-2 and restructuring the Discord invitation text. The changes improve the visual hierarchy without affecting functionality.

docs/app/docs/contributing/component-coverage/page.mdx (2)

2-2: LGTM: Effective migration to icon components.

The systematic replacement of text/emoji indicators with the CoverageIcons components significantly improves visual consistency and maintainability. Using dedicated React components instead of raw Unicode characters makes the table easier to update and ensures consistent rendering across different platforms and fonts.

Also applies to: 102-157


95-97: Clear communication about placeholder status.

Adding the "[Sample]" suffix and explanatory note transparently communicates that this table is a work in progress. This manages expectations well while still providing valuable comparison data.

"use client";
import Callout from "@radui/ui/Callout";
import { BookmarkIcon } from './CalloutExample';
import { AlertCircle as BookmarkIcon } from 'lucide-react';
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Misleading icon alias: AlertCircle imported as BookmarkIcon.

Same issue as in CalloutSizes.tsx—the AlertCircle icon is semantically a warning/error indicator, not a bookmark. The alias creates confusion about what icon is actually being displayed.

🔎 Proposed fix
-import { AlertCircle as BookmarkIcon } from 'lucide-react';
+import { AlertCircle } from 'lucide-react';
-                                <BookmarkIcon className="w-full h-full" />
+                                <AlertCircle className="w-full h-full" />

Also applies to: 12-12

🤖 Prompt for AI Agents
In docs/app/docs/components/callout/examples/CalloutColor.tsx around lines 3 and
12, the code imports AlertCircle but aliases it as BookmarkIcon which is
misleading; change the alias to a name matching the actual icon (e.g.,
AlertCircleIcon or AlertIcon) and update any usages in the file to use that new,
semantically correct identifier so the icon name matches its visual meaning.

export const BookmarkIcon = () => {
return <svg width="24" height="24" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3.5 2C3.22386 2 3 2.22386 3 2.5V13.5C3 13.6818 3.09864 13.8492 3.25762 13.9373C3.41659 14.0254 3.61087 14.0203 3.765 13.924L7.5 11.5896L11.235 13.924C11.3891 14.0203 11.5834 14.0254 11.7424 13.9373C11.9014 13.8492 12 13.6818 12 13.5V2.5C12 2.22386 11.7761 2 11.5 2H3.5Z" fill="currentColor" fillRule="evenodd" clipRule="evenodd"></path></svg>;
};
import { AlertCircle as BookmarkIcon } from 'lucide-react';
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Read the CalloutExample.tsx file to see current state
cat -n docs/app/docs/components/callout/examples/CalloutExample.tsx

Repository: rad-ui/ui

Length of output: 617


🏁 Script executed:

# Search for any imports of BookmarkIcon from CalloutExample
rg "from ['\"].*CalloutExample['\"]" -A 5 -B 2

# Search for any references to BookmarkIcon in the codebase
rg "BookmarkIcon" --type=tsx --type=ts --type=jsx --type=js

Repository: rad-ui/ui

Length of output: 906


🏁 Script executed:

# Let's check what's actually exported from codeUsage and if BookmarkIcon is defined there
cat -n docs/app/docs/components/callout/docs/codeUsage.ts 2>/dev/null || cat -n docs/app/docs/components/callout/docs/codeUsage.tsx 2>/dev/null || cat -n docs/app/docs/components/callout/docs/codeUsage.js 2>/dev/null

# Search for BookmarkIcon definition
rg "BookmarkIcon" -A 3 -B 3

# Check if CalloutExample exports BookmarkIcon
rg "export.*BookmarkIcon"

Repository: rad-ui/ui

Length of output: 13377


🏁 Script executed:

# Check git history to see if BookmarkIcon was previously exported from codeUsage
git log --oneline -p docs/app/docs/components/callout/docs/codeUsage.ts 2>/dev/null | head -100

# Also check CalloutExample export history
git log --oneline -p docs/app/docs/components/callout/examples/CalloutExample.tsx 2>/dev/null | head -100

# Check if page.mdx actually uses the imported BookmarkIcon
grep -n "BookmarkIcon" docs/app/docs/components/callout/page.mdx

Repository: rad-ui/ui

Length of output: 943


Remove misleading icon alias in Callout examples.

The AlertCircle icon is semantically incorrect as BookmarkIcon and should use its proper name. This pattern appears in multiple example files: CalloutExample.tsx, CalloutSizes.tsx, CalloutVariants.tsx, and CalloutColor.tsx.

Additionally, docs/app/docs/components/callout/page.mdx has a broken import attempting to import BookmarkIcon from ./docs/codeUsage, but this file does not export it.

🤖 Prompt for AI Agents
In docs/app/docs/components/callout/examples/CalloutExample.tsx around line 4,
the import aliases AlertCircle as BookmarkIcon are misleading; replace the alias
with the actual icon name (import { AlertCircle } from 'lucide-react') or import
the intended bookmark icon (e.g., import { Bookmark } from 'lucide-react') so
the symbol name matches its semantics; apply the same fix to CalloutSizes.tsx,
CalloutVariants.tsx, and CalloutColor.tsx, and in
docs/app/docs/components/callout/page.mdx remove or correct the broken import of
BookmarkIcon from ./docs/codeUsage (either export BookmarkIcon from that file or
import the correct icon directly from lucide-react).

"use client";
import Callout from '@radui/ui/Callout';
import { BookmarkIcon } from './CalloutExample';
import { AlertCircle as BookmarkIcon } from 'lucide-react';
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Misleading icon alias: AlertCircle imported as BookmarkIcon.

The AlertCircle icon from lucide-react represents warnings/errors, not bookmarks. Aliasing it as BookmarkIcon creates confusion for developers reading the code. Consider either using a semantically appropriate icon or renaming the variable to reflect the actual icon being used (e.g., AlertIcon or WarningIcon).

🔎 Proposed fix
-import { AlertCircle as BookmarkIcon } from 'lucide-react';
+import { AlertCircle } from 'lucide-react';
-                                <BookmarkIcon className="w-full h-full" />
+                                <AlertCircle className="w-full h-full" />

Also applies to: 15-15

🤖 Prompt for AI Agents
In docs/app/docs/components/callout/examples/CalloutSizes.tsx around lines 3 and
15, the file imports AlertCircle from lucide-react but aliases it as
BookmarkIcon which is misleading; update the import alias to a semantically
correct name (e.g., AlertIcon or WarningIcon) or replace the import with an
actual bookmark icon from lucide-react if a bookmark is intended, and then
update any usages to match the new identifier.

- 🔄 **Beta**: feature complete, usable, still gaining real world confidence
- **Production**: stable API, strong docs, strong tests, safe to adopt
- **Experimental**: early work, learning phase, sharp edges expected
- **Beta**: feature complete, usable, still gaining real world confidence
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix hyphenation for compound adjective.

The phrase "real world confidence" should be hyphenated as "real-world confidence" when used as a compound adjective modifying a noun.

🔎 Proposed fix
-- **Beta**: feature complete, usable, still gaining real world confidence
+- **Beta**: feature complete, usable, still gaining real-world confidence
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- **Beta**: feature complete, usable, still gaining real world confidence
- **Beta**: feature complete, usable, still gaining real-world confidence
🧰 Tools
🪛 LanguageTool

[grammar] ~24-~24: Use a hyphen to join words.
Context: ...ure complete, usable, still gaining real world confidence - Production: stabl...

(QB_NEW_EN_HYPHEN)

🤖 Prompt for AI Agents
In docs/app/docs/contributing/component-maturity-rubric/page.mdx around line 24,
the phrase "real world confidence" is missing a hyphen when used as a compound
adjective; update the text to "real-world confidence" so the compound modifier
is properly hyphenated.

const BookmarkIcon = () => {
return <svg width="24" height="24" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.3004 7.49991C10.3004 8.4943 9.49426 9.30041 8.49988 9.30041C7.50549 9.30041 6.69938 8.4943 6.69938 7.49991C6.69938 6.50553 7.50549 5.69942 8.49988 5.69942C9.49426 5.69942 10.3004 6.50553 10.3004 7.49991ZM11.205 8C10.9699 9.28029 9.84816 10.2504 8.49988 10.2504C7.1516 10.2504 6.0299 9.28029 5.79473 8H0.5C0.223858 8 0 7.77614 0 7.5C0 7.22386 0.223858 7 0.5 7H5.7947C6.0298 5.71962 7.15154 4.74942 8.49988 4.74942C9.84822 4.74942 10.97 5.71962 11.2051 7H14.5C14.7761 7 15 7.22386 15 7.5C15 7.77614 14.7761 8 14.5 8H11.205Z" fill="currentColor" fillRule="evenodd" clipRule="evenodd"></path></svg>
};
import { Wrench as BookmarkIcon } from 'lucide-react';
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Misleading icon alias: Wrench imported as BookmarkIcon.

While the Wrench icon is semantically appropriate for the "Under Construction" context, aliasing it as BookmarkIcon creates confusion. The variable name should reflect the actual icon being used.

🔎 Proposed fix
-import { Wrench as BookmarkIcon } from 'lucide-react';
+import { Wrench } from 'lucide-react';
-                <BookmarkIcon className="w-full h-full" />
+                <Wrench className="w-full h-full" />

Also applies to: 72-72

🤖 Prompt for AI Agents
In docs/app/docs/layout.tsx around lines 21 and 72, the lucide-react import
aliases the Wrench icon as BookmarkIcon which is misleading; rename the alias to
a descriptive name (e.g., WrenchIcon or UnderConstructionIcon) in both import
statements and update all local usages of BookmarkIcon to the new name so the
variable accurately reflects the actual icon being used.

<div className="space-y-4">
<div>
<Text className="text-sm text-gray-900 mb-1">Name on Card</Text>
<input type="text" placeholder="Alex Johnson" className="w-full px-3 py-2 border border-gray-400 rounded-md bg-gray-200 text-gray-1000" />
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Accessibility: Plain HTML inputs lack proper labeling.

Multiple native HTML inputs (<input>, <textarea>, <select>) are not properly associated with their labels. While Text components provide visual labels, they're not semantically linked via htmlFor/id or by wrapping the input. This impacts screen reader users.

🔎 Recommended pattern

Current pattern (Lines 40-42):

<Text className="text-sm text-gray-900 mb-1">Name on Card</Text>
<input type="text" placeholder="Alex Johnson" className="..." />

Better approach:

<label htmlFor="card-name">
  <Text className="text-sm text-gray-900 mb-1">Name on Card</Text>
</label>
<input id="card-name" type="text" placeholder="Alex Johnson" className="..." />

Or wrap with label:

<label>
  <Text className="text-sm text-gray-900 mb-1">Name on Card</Text>
  <input type="text" placeholder="Alex Johnson" className="..." />
</label>

This applies to inputs on lines 41, 45, 51-67, 71, 94, 136, 149-157, 163, 169, 179.

Also applies to: 45-45, 51-67, 71-71, 81-86, 94-94, 136-136, 149-157, 163-163, 169-169, 179-179

🤖 Prompt for AI Agents
In docs/app/landingComponents/RadUIDemo.js around lines
41,45,51-67,71,81-86,94,136,149-157,163,169 and 179, several native inputs,
textareas and selects are visually labeled by Text components but not
semantically associated; update each control to either wrap it with a <label> or
add a unique id on the input and an htmlFor on the corresponding Text-wrapped
label so screen readers can associate labels with controls, ensure ids are
unique and preserved if generated, and keep existing classes/styles intact;
apply the same pattern for all listed lines (including select/textarea) and
verify no visual layout changes.

/>
</head>
<body className="h-screen overflow-hidden">
<body className="h-screen overflow-hidden" suppressHydrationWarning>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

rg -n 'suppressHydrationWarning' --type=tsx --type=ts --type=jsx --type=js -C 3

Repository: rad-ui/ui

Length of output: 80


🏁 Script executed:

cat -n docs/app/layout.js | head -150 | tail -60

Repository: rad-ui/ui

Length of output: 2772


🏁 Script executed:

rg 'suppressHydrationWarning' -C 3

Repository: rad-ui/ui

Length of output: 400


🏁 Script executed:

fd 'Main' -t f docs/app/ | head -20

Repository: rad-ui/ui

Length of output: 35


🏁 Script executed:

rg 'darkMode|dark' docs/app/ -C 2 | head -100

Repository: rad-ui/ui

Length of output: 1769


🏁 Script executed:

rg 'export.*Main|function Main|const Main' docs/app/ -C 5

Repository: rad-ui/ui

Length of output: 35


🏁 Script executed:

rg 'import.*Main' docs/app/layout.js -C 2

Repository: rad-ui/ui

Length of output: 176


🏁 Script executed:

cat -n docs/components/Main/Main.js

Repository: rad-ui/ui

Length of output: 1750


Apply suppressHydrationWarning more specifically or investigate root cause.

The suppressHydrationWarning on the <body> element is overly broad. The body itself has only static attributes; dark mode state is managed client-side in the Main component and applied to a nested <div> (line 33 of docs/components/Main/Main.js), not the body element.

If hydration warnings occur, they likely originate from the Theme component or client-side state initialization within Main, not the body element itself. Either:

  1. Remove suppressHydrationWarning from body and apply it to the specific element causing warnings (the theme wrapper div in Main), or
  2. Investigate and fix the root cause of hydration mismatches rather than suppressing them globally
🤖 Prompt for AI Agents
In docs/app/layout.js around line 142, suppressHydrationWarning is applied too
broadly to the <body> even though the dynamic dark-mode state is applied in
docs/components/Main/Main.js (around its theme wrapper div); remove
suppressHydrationWarning from the body and instead add it to the specific
element that actually mounts/hydrates differently (the theme wrapper div in
Main), or alternatively remove the suppression and fix the Theme/Main
client-side initialization so SSR and client render match (ensure same initial
class/state on server and client).

Comment on lines +56 to +66
if (
(lowerError.includes('failed to fetch') && (lowerError.includes('posthog') || lowerError.includes('posthog-js') || lowerError.includes('posthog.com'))) ||
(lowerError.includes('posthog') || lowerError.includes('posthog-js')) ||
// Catch fetch errors from PostHog module (webpack-internal path includes posthog-js)
(lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && lowerError.includes('webpack-internal') && lowerError.includes('posthog-js')) ||
// Catch any fetch error during PostHog initialization
(lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && fullError.includes('PostHogProvider'))
) {
event.preventDefault()
return
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Overly broad error suppression may hide legitimate issues.

Line 58 suppresses any unhandled rejection containing the substring "posthog" or "posthog-js", regardless of whether it's actually a PostHog fetch error. This could mask legitimate application errors that happen to reference PostHog (e.g., errors in code that processes PostHog data, or errors with "posthog" in the stack trace from unrelated causes).

Consider removing this overly broad condition and relying only on the more specific checks:

🔎 Proposed fix
       if (
         (lowerError.includes('failed to fetch') && (lowerError.includes('posthog') || lowerError.includes('posthog-js') || lowerError.includes('posthog.com'))) ||
-        (lowerError.includes('posthog') || lowerError.includes('posthog-js')) ||
         // Catch fetch errors from PostHog module (webpack-internal path includes posthog-js)
         (lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && lowerError.includes('webpack-internal') && lowerError.includes('posthog-js')) ||
         // Catch any fetch error during PostHog initialization
         (lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && fullError.includes('PostHogProvider'))
       ) {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (
(lowerError.includes('failed to fetch') && (lowerError.includes('posthog') || lowerError.includes('posthog-js') || lowerError.includes('posthog.com'))) ||
(lowerError.includes('posthog') || lowerError.includes('posthog-js')) ||
// Catch fetch errors from PostHog module (webpack-internal path includes posthog-js)
(lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && lowerError.includes('webpack-internal') && lowerError.includes('posthog-js')) ||
// Catch any fetch error during PostHog initialization
(lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && fullError.includes('PostHogProvider'))
) {
event.preventDefault()
return
}
if (
(lowerError.includes('failed to fetch') && (lowerError.includes('posthog') || lowerError.includes('posthog-js') || lowerError.includes('posthog.com'))) ||
// Catch fetch errors from PostHog module (webpack-internal path includes posthog-js)
(lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && lowerError.includes('webpack-internal') && lowerError.includes('posthog-js')) ||
// Catch any fetch error during PostHog initialization
(lowerError.includes('typeerror') && lowerError.includes('failed to fetch') && fullError.includes('PostHogProvider'))
) {
event.preventDefault()
return
}
🧰 Tools
🪛 GitHub Check: CodeQL

[failure] 57-57: Incomplete URL substring sanitization
'posthog.com' can be anywhere in the URL, and arbitrary hosts may come before or after it.

🤖 Prompt for AI Agents
In docs/components/PostHogProvider.tsx around lines 56 to 66, remove the overly
broad branch that suppresses any unhandled rejection containing "posthog" or
"posthog-js" and instead restrict suppression to explicit network/fetch
initialization failures: only call event.preventDefault() when the error
message/stack clearly indicates a network "failed to fetch" TypeError
originating from PostHog initialization or the posthog-js module (e.g., check
for "failed to fetch" plus "posthog-js" in webpack-internal paths or
"PostHogProvider" in the stack/message). Keep other checks (the specific "failed
to fetch" + module/init contexts) and add a fallback to log the error rather
than silencing it for any other cases.

Comment on lines +18 to +21
{/* Dotted line */}
<div
className={`flex-1 bg-gray-600 ${isHorizontal ? 'h-[1px]' : 'w-[1px]'}`}
/>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Misleading comment: line is solid, not dotted.

The comment on Line 18 says "Dotted line" but the implementation uses a solid background (bg-gray-600) without any dotted or dashed styling. Either update the comment to reflect the actual styling or apply appropriate border styles if a dotted appearance is intended.

🔎 Proposed fixes

Option 1: Update comment to match current implementation

-            {/* Dotted line */}
+            {/* Line */}
             <div 
                 className={`flex-1 bg-gray-600 ${isHorizontal ? 'h-[1px]' : 'w-[1px]'}`}
             />

Option 2: Implement actual dotted styling

             {/* Dotted line */}
             <div 
-                className={`flex-1 bg-gray-600 ${isHorizontal ? 'h-[1px]' : 'w-[1px]'}`}
+                className={`flex-1 ${isHorizontal ? 'border-t border-dotted border-gray-600' : 'border-l border-dotted border-gray-600'}`}
             />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{/* Dotted line */}
<div
className={`flex-1 bg-gray-600 ${isHorizontal ? 'h-[1px]' : 'w-[1px]'}`}
/>
{/* Line */}
<div
className={`flex-1 bg-gray-600 ${isHorizontal ? 'h-[1px]' : 'w-[1px]'}`}
/>
Suggested change
{/* Dotted line */}
<div
className={`flex-1 bg-gray-600 ${isHorizontal ? 'h-[1px]' : 'w-[1px]'}`}
/>
{/* Dotted line */}
<div
className={`flex-1 ${isHorizontal ? 'border-t border-dotted border-gray-600' : 'border-l border-dotted border-gray-600'}`}
/>
🤖 Prompt for AI Agents
In docs/components/utility/Ruler/index.js around lines 18 to 21, the inline
comment says "Dotted line" but the element is rendered as a solid line
(bg-gray-600) — either update the comment to "Solid line" or change the styling
to a dotted/dashed appearance; to fix, choose one: (a) replace the comment with
a correct description like "Solid line" to match current bg class, or (b) change
the element styling to use a dotted/dashed border (for example replace the
background-based approach with appropriate border classes and conditional sizing
for horizontal/vertical) so the visual matches the "Dotted line" comment.

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