Polish UI from full-app design review#122
Conversation
- Login: wrap form in Card, add Apache-2.0 / GitHub / Docs micro-links - Landing hero: reorder to "Word Processor & Spreadsheet", apply text-balance for cleaner line breaks - Landing comparison table: replace plain "Limited" text with icon+badge for visual consistency with checkmark/X icons; add light/dark theme colors for the badge - Formatting toolbar: widen group separator gaps (mx-1 → mx-2) for clearer logical grouping - Extract shared Toolbar / ToolbarSeparator primitives in components/ui/toolbar.tsx; adopt in both Sheets and Docs toolbars to unify spacing tokens - Layout header: replace path-string if-else chain with declarative matchPath-based ROUTE_TITLES table - Add document.title sync across Layout, docs-detail, document-detail, homepage, and login page Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 16 minutes and 48 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThis PR adds a UI polish task plan and applies frontend refinements: extracts toolbar primitives, refactors formatting toolbars to use them, consolidates route-based page title logic, updates document/page titles, and tweaks landing, login, and comparison-table UI and copy for v0.3.3. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Verification: verify:selfResult: ✅ PASS in 111.0s
Verification: verify:integrationResult: ✅ PASS |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
packages/frontend/src/app/home/why-section.tsx (1)
4-8: Mark the badge icon as decorative for screen readers.Since the text already conveys meaning, hiding the icon from AT avoids redundant announcements.
Suggested tweak
- <Minus className="size-3" /> + <Minus className="size-3" aria-hidden="true" />🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/frontend/src/app/home/why-section.tsx` around lines 4 - 8, The badge icon is redundant for screen readers; in the LimitedBadge component mark the Minus icon as decorative by adding aria-hidden="true" (and optionally focusable="false" if it's an inline SVG) on the <Minus /> element so only the "Limited" text is announced; update the Minus usage in LimitedBadge accordingly.packages/frontend/src/components/ui/toolbar.tsx (1)
33-42: Consider enforcing vertical orientation inToolbarSeparator.Right now, passed props can override
orientation="vertical"due prop spread order.Suggested adjustment
return ( <Separator - orientation="vertical" - className={cn("mx-2 h-5", className)} {...props} + orientation="vertical" + className={cn("mx-2 h-5", className)} /> );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/frontend/src/components/ui/toolbar.tsx` around lines 33 - 42, ToolbarSeparator allows callers to override orientation via the props spread; update the component so orientation is always vertical by excluding any incoming orientation and explicitly setting orientation="vertical" on the rendered Separator (for example destructure orientation out of the props: function ToolbarSeparator({ className, orientation, ...props }: React.ComponentProps<typeof Separator>) and then render <Separator {...props} orientation="vertical" className={cn("mx-2 h-5", className)} />). This ensures Separator's orientation cannot be overridden by the passed props.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/tasks/active/20260411-ui-review-polish-todo.md`:
- Around line 1-55: The tasks file
docs/tasks/active/20260411-ui-review-polish-todo.md is missing its required
paired lessons file; add docs/tasks/active/20260411-ui-review-polish-lessons.md
containing a lessons summary for the ui-review-polish work (one-paragraph
overview, what changed per task 1–7, decisions made e.g., icon convention and
toolbar primitives, verification steps including pnpm verify:fast and
screenshots, and any follow-ups), ensure the filename matches the todo slug and
date exactly and commit both files together so the pair conforms to the project
guideline requiring a -todo.md and corresponding -lessons.md for non-trivial
tasks.
In `@packages/frontend/src/app/login/page.tsx`:
- Around line 21-56: Replace the internal anchor tags that cause full-page
reloads with the SPA Link component: change the <a href="/"> (logo link) and <a
href="/docs"> usages to <Link to="/"> and <Link to="/docs">, preserving their
existing className and children (e.g., the Grid2x2PlusIcon and "Wafflebase"
text, and the docs link text); keep external links that use GITHUB_URL as plain
<a> with target="_blank" and rel set. Also add the necessary Link import (e.g.,
import { Link } from 'react-router-dom') at the top of the file so the new
components resolve.
In `@packages/frontend/src/components/ui/toolbar.tsx`:
- Around line 50-61: The ToolbarButton component currently spreads props onto a
<button> which defaults to type="submit" when used inside forms; update the
ToolbarButton function to ensure a safe default by accepting a type prop (from
React.ComponentProps<"button">) and defaulting it to "button" (e.g., destructure
type = "button" from props) or explicitly set type="button" on the rendered
<button> while still spreading the rest of the props so that ToolbarButton never
triggers accidental form submission.
---
Nitpick comments:
In `@packages/frontend/src/app/home/why-section.tsx`:
- Around line 4-8: The badge icon is redundant for screen readers; in the
LimitedBadge component mark the Minus icon as decorative by adding
aria-hidden="true" (and optionally focusable="false" if it's an inline SVG) on
the <Minus /> element so only the "Limited" text is announced; update the Minus
usage in LimitedBadge accordingly.
In `@packages/frontend/src/components/ui/toolbar.tsx`:
- Around line 33-42: ToolbarSeparator allows callers to override orientation via
the props spread; update the component so orientation is always vertical by
excluding any incoming orientation and explicitly setting orientation="vertical"
on the rendered Separator (for example destructure orientation out of the props:
function ToolbarSeparator({ className, orientation, ...props }:
React.ComponentProps<typeof Separator>) and then render <Separator {...props}
orientation="vertical" className={cn("mx-2 h-5", className)} />). This ensures
Separator's orientation cannot be overridden by the passed props.
🪄 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: 132ed348-44b2-4ba6-a4ee-62db06920588
📒 Files selected for processing (11)
docs/tasks/active/20260411-ui-review-polish-todo.mdpackages/frontend/src/app/Layout.tsxpackages/frontend/src/app/docs/docs-detail.tsxpackages/frontend/src/app/docs/docs-formatting-toolbar.tsxpackages/frontend/src/app/documents/document-detail.tsxpackages/frontend/src/app/home/hero-section.tsxpackages/frontend/src/app/home/page.tsxpackages/frontend/src/app/home/why-section.tsxpackages/frontend/src/app/login/page.tsxpackages/frontend/src/components/formatting-toolbar.tsxpackages/frontend/src/components/ui/toolbar.tsx
- Login: replace <a> with React Router <Link> for internal navigation - ToolbarButton: default type="button" to prevent form submit - ToolbarSeparator: enforce vertical orientation via prop ordering - LimitedBadge: add aria-hidden on decorative Minus icon - Add missing lessons file for task workflow compliance Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/frontend/src/app/home/why-section.tsx (1)
13-39:⚠️ Potential issue | 🟠 MajorAdd screen-reader text for icon-only status cells.
The comparison states are still icon-only for several entries (
Check/X), so assistive technologies may not get explicit “Available/Unavailable” meaning.♿ Suggested fix pattern (apply to all icon-only cells in
rows){ label: "Self-hosted & own your data", - wafflebase: <Check className="size-4 text-green-500" />, - others: <X className="size-4 text-red-400/70" />, + wafflebase: ( + <> + <Check className="size-4 text-green-500" aria-hidden="true" /> + <span className="sr-only">Available</span> + </> + ), + others: ( + <> + <X className="size-4 text-red-400/70" aria-hidden="true" /> + <span className="sr-only">Not available</span> + </> + ), },🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/frontend/src/app/home/why-section.tsx` around lines 13 - 39, The rows array contains icon-only status cells (values in wafflebase and others using Check, X, LimitedBadge) which lack accessible text; update each icon cell in rows to include an offscreen/screen-reader-only label or an aria-label indicating the status (e.g., "Available", "Unavailable", "Limited") alongside the icon so assistive tech can read it—for example wrap the icon and add a visually hidden <span className="sr-only">Available</span> or set aria-label on the container element that renders the icon for every occurrence of Check, X, and LimitedBadge in the rows array.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@packages/frontend/src/app/home/why-section.tsx`:
- Around line 13-39: The rows array contains icon-only status cells (values in
wafflebase and others using Check, X, LimitedBadge) which lack accessible text;
update each icon cell in rows to include an offscreen/screen-reader-only label
or an aria-label indicating the status (e.g., "Available", "Unavailable",
"Limited") alongside the icon so assistive tech can read it—for example wrap the
icon and add a visually hidden <span className="sr-only">Available</span> or set
aria-label on the container element that renders the icon for every occurrence
of Check, X, and LimitedBadge in the rows array.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 6644324d-397b-48ae-8061-10f8f0191a18
📒 Files selected for processing (4)
docs/tasks/active/20260411-ui-review-polish-lessons.mdpackages/frontend/src/app/home/why-section.tsxpackages/frontend/src/app/login/page.tsxpackages/frontend/src/components/ui/toolbar.tsx
✅ Files skipped from review due to trivial changes (1)
- docs/tasks/active/20260411-ui-review-polish-lessons.md
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/frontend/src/app/login/page.tsx
- packages/frontend/src/components/ui/toolbar.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Summary
text-balancefor cleaner 2-line breaksLimitedBadgecomponent)Toolbar/ToolbarSeparator/ToolbarButtonincomponents/ui/toolbar.tsx; adopt in both Sheets and Docs formatting toolbarsmatchPath-basedROUTE_TITLESdocument.titlesync across Layout, docs-detail, document-detail, homepage, and loginTest plan
pnpm verify:fastpasses (lint + all unit tests)/login— card container visible, micro-links clickable/— hero title wraps cleanly in 2 lines, comparison table badges readable in both light and dark mode/shared/:tokensheet — toolbar group gaps visible between button clusters/shared/:tokendoc — toolbar separator spacing matches sheets editor🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Style
Documentation