Skip to content

style(ui): modernize typography system and redesign sidebar#479

Open
pswamis wants to merge 2 commits intositeboon:mainfrom
pswamis:style/ui-typography-sidebar
Open

style(ui): modernize typography system and redesign sidebar#479
pswamis wants to merge 2 commits intositeboon:mainfrom
pswamis:style/ui-typography-sidebar

Conversation

@pswamis
Copy link

@pswamis pswamis commented Mar 4, 2026

What changed

  • Added a typography token system in src/index.css:
    • New font stacks (--font-sans, --font-serif, --font-mono)
    • Unified text scale tokens (--text-2xs through --text-3xl)
    • Improved base typography defaults (line-height, tracking, smoothing, heading rhythm)
  • Extended Tailwind config to support the new scale:
    • Added text-2xs utility in tailwind.config.js
  • Redesigned sidebar surface and structure:
    • Updated sidebar container styling (glass effect, border/shadow treatment)
    • Refreshed header layout with improved branding block, action buttons, and search input
    • Updated project/session row visual hierarchy, spacing, and interaction states
    • Refined sidebar footer styling and consistency with overall design language
  • Propagated typography + spacing refinements across key UI areas:
    • Chat tool renderers and chat subcomponents
    • Main content headers/tabs/titles
    • File tree, git panel, shell minimal view
    • Shared UI primitives (button, input, badge) and related screens

Result

  • More cohesive and modern visual language
  • Stronger text hierarchy and legibility
  • Cleaner sidebar interaction model on both desktop and mobile
  • No major functional behavior changes intended (primarily styling and presentation updates)

Summary by CodeRabbit

  • Style

    • Standardized and tightened typography across the app; many labels, badges, and tooltips use a new compact size.
    • Refreshed visuals for buttons, inputs, badges, headers, sidebars and panels with rounded corners, updated shadows, borders and spacing.
    • New semi-transparent, frosted-glass surfaces for headers and shells.
  • Chores

    • Added a compact font size token to improve consistency.
  • Behavior

    • Onboarding is auto-marked complete in platform mode.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 4, 2026

📝 Walkthrough

Walkthrough

Standardized typography and refreshed visual tokens across the app: added a new Tailwind size (text-2xs), updated numerous component classNames (rounded-xl, shadows, borders), introduced CSS shell classes (modern-*-shell), and made one behavioral change in AuthProvider to mark onboarding complete in platform mode.

Changes

Cohort / File(s) Summary
Tailwind & Global Styles
tailwind.config.js, src/index.css
Added fontSize.2xs and broad design-token, typography, layout shell, and responsive style updates across light/dark themes.
Core UI Primitives
src/components/ui/button.tsx, src/components/ui/badge.tsx, src/components/ui/input.tsx
Reworked component class strings: larger radii (rounded-xl), updated shadows/transitions, variant adjustments, badge shape changed to rounded-full, and input/button sizing tweaked.
Shell & Layout
src/components/app/AppContent.tsx, src/components/main-content/view/MainContent.tsx, src/components/main-content/view/subcomponents/*
Added/updated modern shell classes and header/tab/container styles (backdrop blur, opacity, padding, borders, spacing).
Sidebar
src/components/sidebar/view/subcomponents/...
Widespread visual refresh: increased radii, borders, shadows, spacing, search input sizing, and updated typography/weights for header, footer, projects, and sessions.
Chat UI & Tools
src/components/chat/..., src/components/chat/tools/components/...
Standardized small text sizes (replacing fixed px utilities with text-2xs/text-xs), plus input/composer styling updates (bg-card/90, backdrop blur, shadow tweaks).
File / Diff / Code Views
src/components/file-tree/..., src/components/code-editor/..., src/components/chat/tools/components/DiffViewer.tsx
Reduced small text sizes to new tokens; minor header/badge typography updates; layout preserved.
Git & File Change UIs
src/components/git-panel/view/changes/...
Badge text size normalized to text-2xs; visual sizing adjustments only.
Misc Components
src/components/MobileNav.jsx, src/components/TodoList.jsx, src/components/settings/..., src/components/shell/..., src/components/chat/view/subcomponents/...
Multiple small typography tweaks (text-[10px] → text-2xs / text-sm), padding/spacing refinements, and minor presentational updates.
Badge/Variant Tokens
src/components/ui/badge.tsx
Changed default badge shape to rounded-full (class string update).
Auth Initialization
src/contexts/AuthContext.jsx
Behavioral change: in platform mode, onboarding check replaced with setHasCompletedOnboarding(true) (skips onboarding status check).

Possibly related PRs

Poem

🐰
A hop of fonts, a fluttered shell,
text-2xs whispers, shadows swell.
Rounded corners, tidy lines,
I nibble pixels, spark designs.
Hooray — the UI looks so well!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: modernizing the typography system and redesigning the sidebar, which are the primary focuses evident across all file modifications.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

🧹 Nitpick comments (1)
src/index.css (1)

349-356: Add WebKit backdrop-filter fallback for shell surfaces.

Lines 351 and 356 use backdrop-filter, but these shell classes omit -webkit-backdrop-filter while .nav-glass already includes both forms. Aligning this ensures consistent cross-browser rendering, particularly in Safari.

♻️ Suggested refactor
 .modern-sidebar-shell {
   background: hsl(var(--card) / 0.72);
   backdrop-filter: blur(24px) saturate(1.2);
+  -webkit-backdrop-filter: blur(24px) saturate(1.2);
 }

 .modern-main-shell {
   background: hsl(var(--card) / 0.52);
   backdrop-filter: blur(16px) saturate(1.15);
+  -webkit-backdrop-filter: blur(16px) saturate(1.15);
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/index.css` around lines 349 - 356, The .modern-sidebar-shell and
.modern-main-shell rules are missing the WebKit-prefixed property; add matching
-webkit-backdrop-filter declarations (using the same blur and saturate values:
blur(24px) saturate(1.2) for .modern-sidebar-shell and blur(16px) saturate(1.15)
for .modern-main-shell) alongside the existing backdrop-filter to match
.nav-glass and ensure consistent Safari rendering.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/sidebar/view/subcomponents/SidebarContent.tsx`:
- Line 70: Remove the conflicting overflow class on the ScrollArea wrapper: in
SidebarContent.tsx locate the ScrollArea component instance (the one with
className="flex-1 md:px-2.5 md:py-2 overflow-y-auto overscroll-contain") and
delete the "overflow-y-auto" token from its className so the prop becomes
className="flex-1 md:px-2.5 md:py-2 overscroll-contain", allowing ScrollArea's
internal viewport to control scrolling.

In `@src/components/sidebar/view/subcomponents/SidebarHeader.tsx`:
- Around line 44-46: The projects count label is hardcoded and not pluralized;
replace the raw "{projectsCount} projects" text in SidebarHeader (the JSX
rendering where projectsCount is used) with a localized pluralized string, e.g.
call the translation/plural API (t) with a count parameter like
t('projects.count', { count: projectsCount }) or the app's pluralization helper
so the string correctly renders singular/plural forms and is translated for
other locales.
- Around line 148-157: The icon-only mobile buttons (the button elements that
call onRefresh and onCreateProject and render the RefreshCw icon) lack
accessible names; add explicit accessible names by adding an aria-label (or
aria-labelledby) to each button (e.g., aria-label="Refresh projects" on the
onRefresh button and aria-label="Create project" on the onCreateProject button)
or include visually-hidden text inside the button so screen readers can discover
them; ensure the labels reflect the button action and are present even when
disabled and that the RefreshCw icon remains purely decorative
(aria-hidden="true") if you use an aria-label.

In `@src/contexts/AuthContext.jsx`:
- Around line 35-39: The code unconditionally marks onboarding complete in
platform mode which bypasses ProtectedRoute; change the branch that runs when
IS_PLATFORM so it does not force setHasCompletedOnboarding(true) — either remove
that call or set it from the persisted/derived onboarding state (e.g., a stored
flag or existing hasCompletedOnboarding getter) so platform users still honor
onboarding gating; update the IS_PLATFORM block around setUser, setNeedsSetup,
and setIsLoading to preserve or load the real onboarding state instead of
overriding it.

In `@src/index.css`:
- Around line 77-79: The CSS custom properties --font-sans, --font-serif, and
--font-mono are tripping stylelint: convert generic family keywords to lowercase
(e.g., sans-serif, serif, monospace) so value-keyword-case passes, and remove
any unexpected empty line immediately before these declarations (or adjust
spacing to match the project's declaration-empty-line-before rule) so the
declaration-empty-line-before errors are resolved for the lines defining
--font-sans, --font-serif, and --font-mono (and the same fix for the occurrences
flagged at lines 144 and 153).

---

Nitpick comments:
In `@src/index.css`:
- Around line 349-356: The .modern-sidebar-shell and .modern-main-shell rules
are missing the WebKit-prefixed property; add matching -webkit-backdrop-filter
declarations (using the same blur and saturate values: blur(24px) saturate(1.2)
for .modern-sidebar-shell and blur(16px) saturate(1.15) for .modern-main-shell)
alongside the existing backdrop-filter to match .nav-glass and ensure consistent
Safari rendering.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 044fad3e-5474-4a2f-b4a1-7a374fe90905

📥 Commits

Reviewing files that changed from the base of the PR and between 453a145 and e25aba8.

📒 Files selected for processing (39)
  • src/components/MobileNav.jsx
  • src/components/TodoList.jsx
  • src/components/app/AppContent.tsx
  • src/components/chat/tools/components/CollapsibleDisplay.tsx
  • src/components/chat/tools/components/CollapsibleSection.tsx
  • src/components/chat/tools/components/ContentRenderers/FileListContent.tsx
  • src/components/chat/tools/components/ContentRenderers/QuestionAnswerContent.tsx
  • src/components/chat/tools/components/ContentRenderers/TaskListContent.tsx
  • src/components/chat/tools/components/DiffViewer.tsx
  • src/components/chat/tools/components/InteractiveRenderers/AskUserQuestionPanel.tsx
  • src/components/chat/tools/components/OneLineDisplay.tsx
  • src/components/chat/tools/components/SubagentContainer.tsx
  • src/components/chat/view/subcomponents/ChatComposer.tsx
  • src/components/chat/view/subcomponents/ChatInputControls.tsx
  • src/components/chat/view/subcomponents/ChatMessagesPane.tsx
  • src/components/chat/view/subcomponents/CommandMenu.tsx
  • src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx
  • src/components/code-editor/view/subcomponents/CodeEditorHeader.tsx
  • src/components/file-tree/view/FileTreeDetailedColumns.tsx
  • src/components/file-tree/view/FileTreeNode.tsx
  • src/components/git-panel/view/changes/FileChangeItem.tsx
  • src/components/git-panel/view/changes/FileStatusLegend.tsx
  • src/components/main-content/view/MainContent.tsx
  • src/components/main-content/view/subcomponents/MainContentHeader.tsx
  • src/components/main-content/view/subcomponents/MainContentTabSwitcher.tsx
  • src/components/main-content/view/subcomponents/MainContentTitle.tsx
  • src/components/settings/view/tabs/api-settings/sections/VersionInfoSection.tsx
  • src/components/shell/view/subcomponents/ShellMinimalView.tsx
  • src/components/sidebar/view/subcomponents/SidebarContent.tsx
  • src/components/sidebar/view/subcomponents/SidebarFooter.tsx
  • src/components/sidebar/view/subcomponents/SidebarHeader.tsx
  • src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx
  • src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx
  • src/components/ui/badge.tsx
  • src/components/ui/button.tsx
  • src/components/ui/input.tsx
  • src/contexts/AuthContext.jsx
  • src/index.css
  • tailwind.config.js

/>

<ScrollArea className="flex-1 md:px-1.5 md:py-2 overflow-y-auto overscroll-contain">
<ScrollArea className="flex-1 md:px-2.5 md:py-2 overflow-y-auto overscroll-contain">
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:

#!/bin/bash
set -euo pipefail

# Find ScrollArea implementation
SCROLL_FILE="$(fd -t f 'scroll-area' 2>/dev/null | grep -E '\.(tsx?|jsx?)$' | head -n 1 || echo '')"
if [ -z "$SCROLL_FILE" ]; then
  echo "Searching for scroll-area implementation..."
  SCROLL_FILE="$(find . -type f -name '*scroll*area*' -name '*.tsx' -o -name '*.ts' 2>/dev/null | head -n 1 || echo '')"
fi

if [ -n "$SCROLL_FILE" ] && [ -f "$SCROLL_FILE" ]; then
  echo "=== ScrollArea implementation file: ${SCROLL_FILE} ==="
  wc -l "$SCROLL_FILE"
  head -n 120 "$SCROLL_FILE"
  echo ""
  echo "=== Checking for overflow-related styles in ScrollArea ==="
  grep -n "overflow" "$SCROLL_FILE" || echo "No explicit overflow styles found"
else
  echo "ScrollArea file not found via direct search"
fi

echo ""
echo "=== SidebarContent context (lines 64-78) ==="
if [ -f "src/components/sidebar/view/subcomponents/SidebarContent.tsx" ]; then
  sed -n '64,78p' src/components/sidebar/view/subcomponents/SidebarContent.tsx
else
  echo "SidebarContent file not found"
fi

echo ""
echo "=== Other ScrollArea usages with overflow classes ==="
rg -n --type=tsx 'ScrollArea.*className.*overflow' src/components 2>/dev/null || rg -n 'ScrollArea.*className.*overflow' src/ 2>/dev/null || echo "No matches found"

echo ""
echo "=== All ScrollArea component usages in components directory ==="
rg -n 'ScrollArea' src/components --type=tsx -A1 | head -n 50

Repository: siteboon/claudecodeui

Length of output: 1912


Remove overflow-y-auto from ScrollArea on line 70.

ScrollArea implements a viewport pattern: the root enforces overflow-hidden while the internal viewport handles scrolling with overflow-auto. Adding overflow-y-auto to the wrapper creates conflicting CSS classes on the outer div and is redundant since scrolling is delegated to the inner viewport. Remove overflow-y-auto from the className and rely on ScrollArea's internal behavior.

Current implementation
      <ScrollArea className="flex-1 md:px-2.5 md:py-2 overflow-y-auto overscroll-contain">

Change to:

      <ScrollArea className="flex-1 md:px-2.5 md:py-2 overscroll-contain">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/sidebar/view/subcomponents/SidebarContent.tsx` at line 70,
Remove the conflicting overflow class on the ScrollArea wrapper: in
SidebarContent.tsx locate the ScrollArea component instance (the one with
className="flex-1 md:px-2.5 md:py-2 overflow-y-auto overscroll-contain") and
delete the "overflow-y-auto" token from its className so the prop becomes
className="flex-1 md:px-2.5 md:py-2 overscroll-contain", allowing ScrollArea's
internal viewport to control scrolling.

Comment on lines +44 to +46
<h1 className="text-sm font-semibold text-foreground tracking-tight truncate">{t('app.title')}</h1>
<p className="text-2xs text-muted-foreground/90 leading-tight mt-0.5">{projectsCount} projects</p>
</div>
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

Localize and pluralize the projects count label.

{projectsCount} projects is hardcoded English and will render incorrect singular/plural forms (e.g., 1 projects).

💡 Proposed fix
-        <p className="text-2xs text-muted-foreground/90 leading-tight mt-0.5">{projectsCount} projects</p>
+        <p className="text-2xs text-muted-foreground/90 leading-tight mt-0.5">
+          {t('projects.count', { count: projectsCount })}
+        </p>
📝 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
<h1 className="text-sm font-semibold text-foreground tracking-tight truncate">{t('app.title')}</h1>
<p className="text-2xs text-muted-foreground/90 leading-tight mt-0.5">{projectsCount} projects</p>
</div>
<h1 className="text-sm font-semibold text-foreground tracking-tight truncate">{t('app.title')}</h1>
<p className="text-2xs text-muted-foreground/90 leading-tight mt-0.5">
{t('projects.count', { count: projectsCount })}
</p>
</div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/sidebar/view/subcomponents/SidebarHeader.tsx` around lines 44
- 46, The projects count label is hardcoded and not pluralized; replace the raw
"{projectsCount} projects" text in SidebarHeader (the JSX rendering where
projectsCount is used) with a localized pluralized string, e.g. call the
translation/plural API (t) with a count parameter like t('projects.count', {
count: projectsCount }) or the app's pluralization helper so the string
correctly renders singular/plural forms and is translated for other locales.

Comment on lines 148 to 157
<button
className="w-8 h-8 rounded-lg bg-muted/50 flex items-center justify-center active:scale-95 transition-all"
className="w-9 h-9 rounded-xl bg-muted/60 flex items-center justify-center active:scale-95 transition-all"
onClick={onRefresh}
disabled={isRefreshing}
>
<RefreshCw className={`w-4 h-4 text-muted-foreground ${isRefreshing ? 'animate-spin' : ''}`} />
</button>
<button
className="w-8 h-8 rounded-lg bg-primary/90 text-primary-foreground flex items-center justify-center active:scale-95 transition-all"
className="w-9 h-9 rounded-xl bg-primary text-primary-foreground flex items-center justify-center active:scale-95 transition-all shadow-[0_10px_20px_hsl(var(--primary)/0.25)]"
onClick={onCreateProject}
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

Add accessible names to mobile icon-only action buttons.

The refresh/create mobile buttons are icon-only without an explicit accessible name, which blocks reliable screen-reader discovery.

♿ Proposed fix
             <button
+              type="button"
+              aria-label={t('tooltips.refresh')}
+              title={t('tooltips.refresh')}
               className="w-9 h-9 rounded-xl bg-muted/60 flex items-center justify-center active:scale-95 transition-all"
               onClick={onRefresh}
               disabled={isRefreshing}
             >
@@
             <button
+              type="button"
+              aria-label={t('tooltips.createProject')}
+              title={t('tooltips.createProject')}
               className="w-9 h-9 rounded-xl bg-primary text-primary-foreground flex items-center justify-center active:scale-95 transition-all shadow-[0_10px_20px_hsl(var(--primary)/0.25)]"
               onClick={onCreateProject}
             >
📝 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
<button
className="w-8 h-8 rounded-lg bg-muted/50 flex items-center justify-center active:scale-95 transition-all"
className="w-9 h-9 rounded-xl bg-muted/60 flex items-center justify-center active:scale-95 transition-all"
onClick={onRefresh}
disabled={isRefreshing}
>
<RefreshCw className={`w-4 h-4 text-muted-foreground ${isRefreshing ? 'animate-spin' : ''}`} />
</button>
<button
className="w-8 h-8 rounded-lg bg-primary/90 text-primary-foreground flex items-center justify-center active:scale-95 transition-all"
className="w-9 h-9 rounded-xl bg-primary text-primary-foreground flex items-center justify-center active:scale-95 transition-all shadow-[0_10px_20px_hsl(var(--primary)/0.25)]"
onClick={onCreateProject}
<button
type="button"
aria-label={t('tooltips.refresh')}
title={t('tooltips.refresh')}
className="w-9 h-9 rounded-xl bg-muted/60 flex items-center justify-center active:scale-95 transition-all"
onClick={onRefresh}
disabled={isRefreshing}
>
<RefreshCw className={`w-4 h-4 text-muted-foreground ${isRefreshing ? 'animate-spin' : ''}`} />
</button>
<button
type="button"
aria-label={t('tooltips.createProject')}
title={t('tooltips.createProject')}
className="w-9 h-9 rounded-xl bg-primary text-primary-foreground flex items-center justify-center active:scale-95 transition-all shadow-[0_10px_20px_hsl(var(--primary)/0.25)]"
onClick={onCreateProject}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/sidebar/view/subcomponents/SidebarHeader.tsx` around lines 148
- 157, The icon-only mobile buttons (the button elements that call onRefresh and
onCreateProject and render the RefreshCw icon) lack accessible names; add
explicit accessible names by adding an aria-label (or aria-labelledby) to each
button (e.g., aria-label="Refresh projects" on the onRefresh button and
aria-label="Create project" on the onCreateProject button) or include
visually-hidden text inside the button so screen readers can discover them;
ensure the labels reflect the button action and are present even when disabled
and that the RefreshCw icon remains purely decorative (aria-hidden="true") if
you use an aria-label.

Comment on lines 35 to 39
if (IS_PLATFORM) {
setUser({ username: 'platform-user' });
setNeedsSetup(false);
checkOnboardingStatus();
setHasCompletedOnboarding(true); // Skip onboarding in platform mode
setIsLoading(false);
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

Platform mode now hard-bypasses onboarding state.

On Line 38, setting hasCompletedOnboarding to true unconditionally means platform users can never hit the onboarding gate in ProtectedRoute, so the onboarding completion flow becomes unreachable.

Suggested fix
   useEffect(() => {
     if (IS_PLATFORM) {
       setUser({ username: 'platform-user' });
       setNeedsSetup(false);
-      setHasCompletedOnboarding(true); // Skip onboarding in platform mode
-      setIsLoading(false);
+      // Preserve real onboarding state for platform users as well
+      checkOnboardingStatus().finally(() => {
+        setIsLoading(false);
+      });
       return;
     }

     checkAuthStatus();
   }, []);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/contexts/AuthContext.jsx` around lines 35 - 39, The code unconditionally
marks onboarding complete in platform mode which bypasses ProtectedRoute; change
the branch that runs when IS_PLATFORM so it does not force
setHasCompletedOnboarding(true) — either remove that call or set it from the
persisted/derived onboarding state (e.g., a stored flag or existing
hasCompletedOnboarding getter) so platform users still honor onboarding gating;
update the IS_PLATFORM block around setUser, setNeedsSetup, and setIsLoading to
preserve or load the real onboarding state instead of overriding it.

Comment on lines +77 to +79
--font-sans: "Inter", "IBM Plex Sans", "Manrope", "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
--font-serif: "Source Serif 4", "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
--font-mono: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", monospace;
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

Resolve the current stylelint errors in this block.

Lines 77-79, 144, and 153 are currently flagged (value-keyword-case, declaration-empty-line-before). This should be corrected to avoid lint failures.

🔧 Proposed fix
-    --font-sans: "Inter", "IBM Plex Sans", "Manrope", "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
-    --font-serif: "Source Serif 4", "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
-    --font-mono: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", monospace;
+    --font-sans: "Inter", "IBM Plex Sans", "Manrope", "Avenir Next", "Segoe UI", "Helvetica Neue", "Arial", sans-serif;
+    --font-serif: "Source Serif 4", "Iowan Old Style", "Palatino Linotype", "Book Antiqua", "Georgia", serif;
+    --font-mono: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", "Menlo", "Monaco", "Consolas", "Liberation Mono", monospace;
@@
-    text-rendering: optimizeLegibility;
+    text-rendering: optimizelegibility;
@@
   body {
     `@apply` bg-background text-foreground;
+
     font-family: var(--font-sans);

Also applies to: 144-144, 153-153

🧰 Tools
🪛 Stylelint (17.3.0)

[error] 77-77: Expected "Arial" to be "arial" (value-keyword-case)

(value-keyword-case)


[error] 78-78: Expected "Georgia" to be "georgia" (value-keyword-case)

(value-keyword-case)


[error] 79-79: Expected "Menlo" to be "menlo" (value-keyword-case)

(value-keyword-case)


[error] 79-79: Expected "Monaco" to be "monaco" (value-keyword-case)

(value-keyword-case)


[error] 79-79: Expected "Consolas" to be "consolas" (value-keyword-case)

(value-keyword-case)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/index.css` around lines 77 - 79, The CSS custom properties --font-sans,
--font-serif, and --font-mono are tripping stylelint: convert generic family
keywords to lowercase (e.g., sans-serif, serif, monospace) so value-keyword-case
passes, and remove any unexpected empty line immediately before these
declarations (or adjust spacing to match the project's
declaration-empty-line-before rule) so the declaration-empty-line-before errors
are resolved for the lines defining --font-sans, --font-serif, and --font-mono
(and the same fix for the occurrences flagged at lines 144 and 153).

@blackmammoth
Copy link
Collaborator

Hey @pswamis, thanks for the PR! On the PR description, please include detailed information about the PR. Same for #478

@pswamis
Copy link
Author

pswamis commented Mar 4, 2026

Hey @pswamis, thanks for the PR! On the PR description, please include detailed information about the PR. Same for #478

@blackmammoth Sorry my bad, added now.

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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx`:
- Line 79: In SidebarSessionItem (the class list string used for the session
item), replace the invalid Tailwind opacity token "bg-card/82" with the
arbitrary alpha syntax "bg-card/[0.82]" so the background color includes the
intended 82% opacity; update the class in the string where 'p-2.5 mx-3 my-0.5
rounded-lg bg-card/82 border active:scale-[0.98] transition-all duration-150
relative' appears (the classname for the session item) to use bg-card/[0.82].

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c7ab175f-730a-4485-9d96-b2b3ba7c7189

📥 Commits

Reviewing files that changed from the base of the PR and between e25aba8 and f3f1f38.

📒 Files selected for processing (4)
  • src/components/app/AppContent.tsx
  • src/components/sidebar/view/subcomponents/SidebarFooter.tsx
  • src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx
  • src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/components/app/AppContent.tsx
  • src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx
  • src/components/sidebar/view/subcomponents/SidebarFooter.tsx

className={cn(
'p-2 mx-3 my-0.5 rounded-md bg-card border active:scale-[0.98] transition-all duration-150 relative',
isSelected ? 'bg-primary/5 border-primary/20' : '',
'p-2.5 mx-3 my-0.5 rounded-lg bg-card/82 border active:scale-[0.98] transition-all duration-150 relative',
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:

#!/bin/bash
set -euo pipefail

echo "Tailwind version reference:"
rg -n '"tailwindcss"\s*:\s*"' package.json

echo
echo "Find Tailwind config(s):"
fd 'tailwind\.config\.(js|cjs|mjs|ts)$'

echo
echo "Check whether opacity token 82 is explicitly configured:"
fd 'tailwind\.config\.(js|cjs|mjs|ts)$' -x sh -c 'echo "== $1 =="; rg -n "opacity|82|extend|theme" "$1"' sh {}

echo
echo "Current class usage:"
rg -n "bg-card/82|bg-card/\[0\.82\]" src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx

Repository: siteboon/claudecodeui

Length of output: 429


🏁 Script executed:

cat -n tailwind.config.js

Repository: siteboon/claudecodeui

Length of output: 2379


bg-card/82 is not a valid Tailwind opacity token and will be silently dropped.

Tailwind's default opacity scale includes 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100—but not 82. Since your tailwind.config.js doesn't extend the opacity scale, bg-card/82 on line 79 will generate no CSS. Use bg-card/[0.82] (arbitrary alpha value syntax) instead:

Suggested change
- 'p-2.5 mx-3 my-0.5 rounded-lg bg-card/82 border active:scale-[0.98] transition-all duration-150 relative',
+ 'p-2.5 mx-3 my-0.5 rounded-lg bg-card/[0.82] border active:scale-[0.98] transition-all duration-150 relative',
📝 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
'p-2.5 mx-3 my-0.5 rounded-lg bg-card/82 border active:scale-[0.98] transition-all duration-150 relative',
'p-2.5 mx-3 my-0.5 rounded-lg bg-card/[0.82] border active:scale-[0.98] transition-all duration-150 relative',
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx` at line 79,
In SidebarSessionItem (the class list string used for the session item), replace
the invalid Tailwind opacity token "bg-card/82" with the arbitrary alpha syntax
"bg-card/[0.82]" so the background color includes the intended 82% opacity;
update the class in the string where 'p-2.5 mx-3 my-0.5 rounded-lg bg-card/82
border active:scale-[0.98] transition-all duration-150 relative' appears (the
classname for the session item) to use bg-card/[0.82].

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