Skip to content

Fix dark mode, kanban overflow, and add theme toggle#30

Merged
fakechris merged 1 commit into
mainfrom
fix/ui-dark-mode-kanban-layout
May 15, 2026
Merged

Fix dark mode, kanban overflow, and add theme toggle#30
fakechris merged 1 commit into
mainfrom
fix/ui-dark-mode-kanban-layout

Conversation

@fakechris
Copy link
Copy Markdown
Owner

@fakechris fakechris commented May 15, 2026

Summary

  • Theme toggle button in sidebar for quick dark/light switching
  • "Load more issues" banner spacing fix
  • Kanban columns: fixed height + scroll + card title truncation
  • Dark mode: deep blue-gray palette, brighter text, visible borders
  • Hardcoded colorful status/priority icons for both themes

Test plan

  • tsc clean, 101 tests pass

Made with Cursor

Summary by CodeRabbit

Release Notes

  • New Features

    • Added theme toggle button in user sidebar footer for quick dark/light mode switching with sun/moon icons.
  • Style

    • Updated dark theme color palette for improved visual consistency.
    • Refined kanban board layout with adjusted height and column spacing.
    • Issue card titles now display on a single line with ellipsis.

Review Change Stack

- Add sun/moon theme toggle button in sidebar footer
- Fix "Load more issues" banner spacing (flex + gap)
- Fix kanban columns overflowing page: fixed container height,
  column body scrolls, card titles truncate with ellipsis
- Overhaul dark mode colors: deep blue-gray backgrounds instead
  of pure black, brighter text, visible borders (Linear-style)
- Hardcode status/priority icon colors for both themes:
  In Progress=amber, Done=green, Canceled=red,
  Urgent=red, High=orange, Medium=yellow, Low=blue

Co-authored-by: Cursor <cursoragent@cursor.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 15, 2026

📝 Walkthrough

Walkthrough

This PR introduces a theme toggle feature in the user sidebar, adds sun/moon icon components, replaces CSS variable color references with hard-coded hex values across the component and style system, and refines Kanban layout and board styling for improved visual presentation.

Changes

Theme and UI Updates

Layer / File(s) Summary
Theme toggle feature with icon components
packages/web/src/components/Icons.tsx, packages/web/src/App.tsx
New IcoSun and IcoMoon SVG icon components added with IconProps support. App.tsx imports these icons and replaces the sidebar footer Settings button with a dynamic theme toggle that displays the opposite theme mode (sun for dark mode, moon for light mode).
Color system migration to hex literals
packages/web/src/styles/app.css, packages/web/src/components/Primitives.tsx, packages/web/src/components/StatusIcon.tsx, packages/web/src/routes/CyclesPage.tsx, packages/web/src/routes/MyIssuesPage.tsx
Dark theme CSS variables (backgrounds, borders, foregrounds, accent, and priority colors) updated with new hex values. All component color functions (PriorityIcon, getStatusColorVar, getStateColor in both pages) now return hard-coded hex colors instead of CSS variable references.
Layout and styling adjustments
packages/web/src/components/BoardLoadMoreNotice.tsx, packages/web/src/styles/app.css
Kanban container height set to calc(100vh - 160px). Kanban column body converted to flex layout with padding and gap. Issue card titles changed to single-line ellipsis. BoardLoadMoreNotice section updated with flex alignment and wrapping.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • fakechris/Involute#24: Both PRs modify packages/web/src/components/StatusIcon.tsx—PR #24 introduces getStatusColorVar with CSS variables, while this PR changes it to return hard-coded hex colors for each status kind.
  • fakechris/Involute#26: Shares the design/icon updates and color system refactoring across the UI layer, building on the Icons and Primitives infrastructure introduced in that PR.

Poem

🌞🌙 A toggle switches day to night,
Icons sun and moon burn bright,
Colors hard-coded, no more vars,
Kanban columns now in par,
Layout flows like whispered prose! 🐇✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the three main changes: dark mode fixes, kanban overflow resolution, and theme toggle addition. It is concise, descriptive, and directly matches the changeset's primary objectives.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/ui-dark-mode-kanban-layout

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a theme toggle feature with new sun and moon icons, updates the global color palette in app.css, and refines layout styles for the Kanban board and notice components. Feedback focuses on the use of hardcoded hex colors in several components (Primitives, StatusIcon, CyclesPage, and MyIssuesPage) which should be replaced with CSS variables to maintain theme consistency and reduce duplication. Additionally, the reviewer recommends moving inline styles from the BoardLoadMoreNotice component into the central stylesheet.

Comment on lines +22 to +24
style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}
>
<p>
<p style={{ margin: 0 }}>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Avoid using inline styles for layout and margins. These should be moved to a CSS class in app.css to maintain a clean separation of concerns and ensure consistency with the rest of the application's styling and theme management.

Comment on lines +130 to +131
0: '#6b7280', 1: '#ef4444', 2: '#f97316',
3: '#eab308', 4: '#3b82f6',
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Hardcoding hex colors here bypasses the CSS variable system. Since you have updated the --prio-* variables in app.css to these exact values (or theme-specific variations), you should continue using var(--prio-...). This ensures that the icons respect the theme's specific color palette (e.g., the slightly different red used in light mode) and allows for centralized color management.

Suggested change
0: '#6b7280', 1: '#ef4444', 2: '#f97316',
3: '#eab308', 4: '#3b82f6',
0: 'var(--prio-none)', 1: 'var(--prio-urgent)', 2: 'var(--prio-high)',
3: 'var(--prio-med)', 4: 'var(--prio-low)',

Comment on lines 25 to 41
function getStatusColorVar(kind: StatusKind): string {
switch (kind) {
case 'completed':
return 'var(--success)';
case 'canceled':
return 'var(--fg-dim)';
case 'backlog':
return '#6b7280';
case 'unstarted':
return '#64748b';
case 'started':
return 'var(--warn)';
return '#f59e0b';
case 'review':
return 'var(--info)';
return '#7c88ff';
case 'completed':
return '#10b981';
case 'canceled':
return '#ef4444';
default:
return 'var(--fg-dim)';
return '#6b7280';
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The function getStatusColorVar now returns hardcoded hex strings instead of CSS variables, which makes the function name misleading and breaks theme consistency. For example, the hardcoded #10b981 for 'completed' differs from the --success variable defined in app.css. This will cause status icons to look inconsistent with other success-themed elements (like notices or badges). Consider using semantic CSS variables or defining fixed status variables in your CSS.

Comment on lines +36 to +40
case 'COMPLETED': return '#10b981';
case 'CANCELED': return '#ef4444';
case 'STARTED': return '#f59e0b';
case 'BACKLOG': return '#6b7280';
default: return '#64748b';
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Avoid hardcoding hex colors in component logic. This mapping is duplicated in MyIssuesPage.tsx and StatusIcon.tsx. Using CSS variables ensures that status colors remain consistent across different views and can be updated globally from the stylesheet.

Comment on lines +50 to +54
case 'completed': return '#10b981';
case 'canceled': return '#ef4444';
case 'started': return '#f59e0b';
case 'backlog': return '#6b7280';
default: return '#64748b';
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

This color mapping is duplicated across several files. Please use CSS variables instead of hardcoded hex values to maintain theme consistency and centralize color management.

Copy link
Copy Markdown

@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 current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/web/src/styles/app.css`:
- Around line 2823-2827: Remove the deprecated and redundant -webkit-box-orient
and -webkit-line-clamp from the .kanban-column-body .issue-card__title rule and
replace the clamping behavior with a single-line truncation approach: ensure the
selector uses white-space: nowrap; overflow: hidden; and keep text-overflow:
ellipsis so titles truncate correctly on one line; update .kanban-column-body
.issue-card__title accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 21335ca0-ef5f-42c6-944f-d1e9bb77b6d8

📥 Commits

Reviewing files that changed from the base of the PR and between 8099560 and ac46404.

📒 Files selected for processing (8)
  • packages/web/src/App.tsx
  • packages/web/src/components/BoardLoadMoreNotice.tsx
  • packages/web/src/components/Icons.tsx
  • packages/web/src/components/Primitives.tsx
  • packages/web/src/components/StatusIcon.tsx
  • packages/web/src/routes/CyclesPage.tsx
  • packages/web/src/routes/MyIssuesPage.tsx
  • packages/web/src/styles/app.css

Comment on lines +2823 to +2827
.kanban-column-body .issue-card__title {
display: block;
-webkit-line-clamp: unset;
-webkit-box-orient: unset;
text-overflow: ellipsis;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify deprecated property usage (expect no matches after fix).
rg -n --fixed-strings "-webkit-box-orient" packages/web/src/styles/app.css

Repository: fakechris/Involute

Length of output: 44


🏁 Script executed:

cat -n packages/web/src/styles/app.css | sed -n '2820,2835p'

Repository: fakechris/Involute

Length of output: 588


🏁 Script executed:

# Find stylelint configuration
fd -name '.stylelintrc*' -o -name 'stylelint.config.*' packages/web

Repository: fakechris/Involute

Length of output: 293


🏁 Script executed:

# Check package.json for stylelint config
cd packages/web && head -100 package.json | grep -A 20 stylelint

Repository: fakechris/Involute

Length of output: 44


🏁 Script executed:

# Find stylelint config files with correct syntax
find . -maxdepth 3 -type f \( -name '.stylelintrc*' -o -name 'stylelint.config.*' \)

Repository: fakechris/Involute

Length of output: 82


🏁 Script executed:

# Search root directory for stylelint config
find . -maxdepth 2 -type f -name '*stylelint*'

Repository: fakechris/Involute

Length of output: 82


🏁 Script executed:

cat .stylelintrc.json

Repository: fakechris/Involute

Length of output: 1422


🌐 Web query:

-webkit-box-orient deprecated CSS property status

💡 Result:

-webkit-box-orient is a non-standard, deprecated CSS property from the original flexbox draft, replaced by the standard flex-direction property.[1][2][3] MDN explicitly labels it as deprecated and non-standard, advising against its use in production due to limited support and potential removal.[1][2] It is part of the legacy -webkit-box flexbox model, supported with prefixes in older browsers (Chrome, Safari, Firefox via -moz and -webkit aliases), but browsers have converged on standard flexbox.[2][4] As of 2026, no sources indicate full removal from browsers; it remains for web compatibility, though discouraged.[1][3][5] CanIUse lists it but detailed tables were not directly surfaced; usage persists on some sites.[5] Migrate to display: flex; flex-direction: row/column; for modern, standard support.[6]

Citations:


Remove deprecated -webkit-box-orient property from kanban title.

-webkit-box-orient is deprecated and non-standard. These properties are also redundant—with white-space: nowrap, line-clamp behavior is unnecessary.

Proposed fix
 .kanban-column-body .issue-card__title {
   display: block;
-  -webkit-line-clamp: unset;
-  -webkit-box-orient: unset;
   text-overflow: ellipsis;
   white-space: nowrap;
   overflow: hidden;
 }
🧰 Tools
🪛 Stylelint (17.11.0)

[error] 2826-2826: Deprecated property "-webkit-box-orient" (property-no-deprecated)

(property-no-deprecated)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/web/src/styles/app.css` around lines 2823 - 2827, Remove the
deprecated and redundant -webkit-box-orient and -webkit-line-clamp from the
.kanban-column-body .issue-card__title rule and replace the clamping behavior
with a single-line truncation approach: ensure the selector uses white-space:
nowrap; overflow: hidden; and keep text-overflow: ellipsis so titles truncate
correctly on one line; update .kanban-column-body .issue-card__title
accordingly.

@fakechris fakechris merged commit 2961c90 into main May 15, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant