Skip to content

Polish UI from full-app design review#122

Merged
hackerwins merged 4 commits into
mainfrom
ui-polish-review
Apr 12, 2026
Merged

Polish UI from full-app design review#122
hackerwins merged 4 commits into
mainfrom
ui-polish-review

Conversation

@hackerwins

@hackerwins hackerwins commented Apr 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Login page: wrap form in shadcn Card with Apache-2.0 / GitHub / Docs micro-links
  • Landing hero: reorder to "Word Processor & Spreadsheet", apply text-balance for cleaner 2-line breaks
  • Comparison table: replace plain "Limited" text with themed icon+badge (LimitedBadge component)
  • Formatting toolbar: widen group separator gaps for clearer visual grouping
  • Shared Toolbar primitives: extract Toolbar / ToolbarSeparator / ToolbarButton in components/ui/toolbar.tsx; adopt in both Sheets and Docs formatting toolbars
  • Layout header: replace if-else path matching with declarative matchPath-based ROUTE_TITLES
  • Browser title: add document.title sync across Layout, docs-detail, document-detail, homepage, and login

Test plan

  • pnpm verify:fast passes (lint + all unit tests)
  • Manual: open /login — card container visible, micro-links clickable
  • Manual: open / — hero title wraps cleanly in 2 lines, comparison table badges readable in both light and dark mode
  • Manual: open /shared/:token sheet — toolbar group gaps visible between button clusters
  • Manual: open /shared/:token doc — toolbar separator spacing matches sheets editor
  • Manual: navigate between Documents / Data Sources / Settings — browser tab title updates
  • Manual: open a document — browser tab shows document name

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Browser tab titles now reflect current page or document
    • Added footer links on login page for docs and GitHub
  • Style

    • Refreshed landing hero heading, layout, and added light-mode support
    • Enhanced login card design and spacing
    • Updated comparison table badges/icons and “Limited” badge styling
    • Unified toolbar UI and separators for consistent toolbars across the app
  • Documentation

    • Added UI review polish task plan and lessons with verification steps

- 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]>
@coderabbitai

coderabbitai Bot commented Apr 12, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@hackerwins has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 16 minutes and 48 seconds before requesting another review.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

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

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 47ccf074-6947-4fe7-a8b2-04f9e709a5a9

📥 Commits

Reviewing files that changed from the base of the PR and between fbf2b9c and 6b847ea.

📒 Files selected for processing (2)
  • docs/tasks/README.md
  • docs/tasks/active/20260411-ui-review-polish-todo.md
📝 Walkthrough

Walkthrough

This 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

Cohort / File(s) Summary
Documentation & Planning
docs/tasks/active/20260411-ui-review-polish-todo.md, docs/tasks/active/20260411-ui-review-polish-lessons.md
Add UI-review polish task plan and lessons notes targeting v0.3.3, including scope, sequenced tasks, verification steps, and implementation notes.
App Layout / Route Titles
packages/frontend/src/app/Layout.tsx
Replace pathname-based title logic with a declarative ROUTE_TITLES + matchPath lookup; set document.title via useEffect when derived title changes.
Document & Page Titles
packages/frontend/src/app/docs/docs-detail.tsx, packages/frontend/src/app/documents/document-detail.tsx, packages/frontend/src/app/home/page.tsx, packages/frontend/src/app/login/page.tsx
Add useEffect hooks to update document.title for documents, home, and login pages using the <title> — Wafflebase pattern.
Toolbar Primitives
packages/frontend/src/components/ui/toolbar.tsx
Introduce exported Toolbar, ToolbarSeparator, and ToolbarButton components to standardize toolbar layout, separators, and icon buttons.
Toolbar Refactors
packages/frontend/src/components/formatting-toolbar.tsx, packages/frontend/src/app/docs/docs-formatting-toolbar.tsx
Refactor existing formatting toolbars to use new Toolbar container and ToolbarSeparator in place of previous div and Separator usages.
Landing / Hero / Comparison Table
packages/frontend/src/app/home/hero-section.tsx, packages/frontend/src/app/home/why-section.tsx, packages/frontend/src/app/home/page.tsx
Adjust hero heading to single-line with text balancing and centering, reorder copy, add LimitedBadge for comparison table, and tweak icon/styling for availability indicators.
Login Page Layout & Links
packages/frontend/src/app/login/page.tsx
Wrap login form in Card/CardContent, adjust sizing/layout, change header link to /, add footer links (GitHub, license, docs), and set page title on mount.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I hopped through code with eager cheer,

Toolbars gathered, titles clear,
Hero lines now fit just right,
Login card all cozy, bright,
A little polish, big delight! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 58.33% 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 PR title 'Polish UI from full-app design review' directly and clearly summarizes the main changes: UI polishing work resulting from a design review, covering login, landing, toolbars, layout, and document titles.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ui-polish-review

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.

@github-actions

github-actions Bot commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Verification: verify:self

Result: ✅ PASS in 111.0s

Lane Status Duration
sheets:build ✅ pass 12.4s
docs:build ✅ pass 7.4s
verify:fast ✅ pass 56.6s
frontend:build ✅ pass 13.8s
verify:frontend:chunks ✅ pass 0.3s
backend:build ✅ pass 4.4s
cli:build ✅ pass 1.6s
verify:entropy ✅ pass 14.5s

Verification: verify:integration

Result: ✅ PASS

@codecov

codecov Bot commented Apr 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 in ToolbarSeparator.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 3a4c4e8 and d0c4f4d.

📒 Files selected for processing (11)
  • docs/tasks/active/20260411-ui-review-polish-todo.md
  • packages/frontend/src/app/Layout.tsx
  • packages/frontend/src/app/docs/docs-detail.tsx
  • packages/frontend/src/app/docs/docs-formatting-toolbar.tsx
  • packages/frontend/src/app/documents/document-detail.tsx
  • packages/frontend/src/app/home/hero-section.tsx
  • packages/frontend/src/app/home/page.tsx
  • packages/frontend/src/app/home/why-section.tsx
  • packages/frontend/src/app/login/page.tsx
  • packages/frontend/src/components/formatting-toolbar.tsx
  • packages/frontend/src/components/ui/toolbar.tsx

Comment thread docs/tasks/active/20260411-ui-review-polish-todo.md Outdated
Comment thread packages/frontend/src/app/login/page.tsx Outdated
Comment thread packages/frontend/src/components/ui/toolbar.tsx
hackerwins and others added 2 commits April 12, 2026 14:23
- 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]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 | 🟠 Major

Add 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

📥 Commits

Reviewing files that changed from the base of the PR and between d0c4f4d and fbf2b9c.

📒 Files selected for processing (4)
  • docs/tasks/active/20260411-ui-review-polish-lessons.md
  • packages/frontend/src/app/home/why-section.tsx
  • packages/frontend/src/app/login/page.tsx
  • packages/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

@hackerwins
hackerwins merged commit 4959bd2 into main Apr 12, 2026
1 check passed
@hackerwins
hackerwins deleted the ui-polish-review branch April 12, 2026 05:30
@coderabbitai coderabbitai Bot mentioned this pull request Apr 18, 2026
12 tasks
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