Skip to content

Restyle#47

Merged
FSM1 merged 34 commits into
mainfrom
feat/pencil-restyle
Jan 25, 2026
Merged

Restyle#47
FSM1 merged 34 commits into
mainfrom
feat/pencil-restyle

Conversation

@FSM1

@FSM1 FSM1 commented Jan 23, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Matrix rain background on login and JetBrains Mono font support.
  • Style

    • Full terminal/hacker aesthetic: green-on-black, monospace typography, glow accents, design tokens applied across UI (overlays, modals, upload, responsive).
  • UI Changes

    • File list header now: NAME / SIZE / TYPE / MODIFIED; file/folder prefixes like [DIR]/[FILE]; branding and action labels lowercased/stylized (e.g. > CIPHERBOX, [CONNECT], --upload).
  • Tests

    • E2E suites archived/reorganized and test selectors updated to match restyled UI.
  • Documentation

    • ROADMAP and planning updated with new Phase 6.3 and adjusted phase totals.

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

FSM1 and others added 29 commits January 23, 2026 03:44
Phase 6.2: Restyle App with Pencil Design
- 6 plans in 4 waves
- Wave 1: Design tokens foundation (01)
- Wave 2: File browser, dialogs, responsive/matrix (02, 03, 04) - parallel
- Wave 3: Component TSX updates (05)
- Wave 4: E2E updates and verification (06)

Terminal/hacker aesthetic: JetBrains Mono, green-on-black, [DIR]/[FILE] prefixes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 6.2: Restyle App with Pencil Design - 6 plans in 4 waves

User decisions captured:
- Full matrix animation (not static fallback)
- Mobile 2-row stacked layout per Pencil design (ZVAUX)
  - Row 1: [DIR]/[FILE] icon + filename
  - Row 2: Date (left) | Size (right)

Plans:
- 01: Design tokens and typography foundation
- 02: File browser and breadcrumbs restyle
- 03: Dialogs, menus, modals, upload restyle
- 04: Responsive styles and matrix animation
- 05: Component TSX updates (text prefixes, labels)
- 06: E2E test updates and visual verification

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Google Fonts preconnect for performance
- Load JetBrains Mono with weights 400, 600, 700
- Positioned before title tag in head section
- Enables monospace typography for terminal aesthetic
- Replace Inter font with JetBrains Mono monospace
- Change background from #242424 to pure black #000000
- Add complete CSS custom properties system:
  - Color primitives (green primary #00D084, black, dim variants)
  - Semantic colors (error, warning)
  - Typography tokens (font sizes, weights)
  - Spacing scale (8px to 32px)
  - Effects (green glow, border thickness)
- Remove place-items: center from body layout
- Add accessibility focus styles and selection colors
- Foundation for terminal/hacker aesthetic
- Update login container with terminal aesthetic styling
- Add > CIPHERBOX prompt using ::before pseudo-element
- Convert login button to sharp corners (border-radius: 0)
- Change button from gradient to solid green (#00D084)
- Add uppercase text transform and letter spacing
- Update dashboard header to use design tokens
- Convert API status indicator to use CSS variables
- Use monospace font throughout
- All colors now reference CSS custom properties
- Terminal/hacker aesthetic with green-on-black theme
Tasks completed: 3/3
- Task 1: Add JetBrains Mono font to index.html
- Task 2: Create design tokens in index.css
- Task 3: Restyle login page in App.css

SUMMARY: .planning/phases/06.2-restyle-app-with-pencil-design/06.2-01-SUMMARY.md
- Remove all light mode CSS and prefers-color-scheme queries
- Use design token variables throughout
- Remove border-radius (sharp corners)
- Add green glow to box-shadow
- Monospace font for menu items
- Green hover states and focus indicators
- Replace all rgba colors with design token variables
- Remove border-radius values (set to 0 for terminal aesthetic)
- Use green color scheme for all hover/active states
- Update file list to use 2-row stacked layout on mobile
- Hide TYPE column on mobile
- Add terminal styling to sidebar overlay

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace all rgba() colors with CSS design tokens
- Add green borders (--color-border) on sidebar and file list
- Change to 4-column grid (NAME, SIZE, TYPE, MODIFIED)
- Remove border-radius for sharp terminal edges
- Add green hover/active states using --color-green-darker
- Add left border highlight for selected items
- Use monospace font family (--font-family-mono) throughout
- Apply terminal glow effect (--glow-green) on hover
- Remove all light mode CSS and prefers-color-scheme queries
- Use design token variables throughout
- Remove border-radius (sharp corners)
- Add green glow effects on focus/hover
- Monospace font for all dialog text
- Green primary button, red destructive button styling
- Canvas-based matrix rain animation
- Performance-optimized: 30fps throttled rendering
- Low opacity (0.25) for subtle effect
- Handles window resize with cleanup
- Uses JetBrains Mono font for consistency
- aria-hidden for accessibility
- Cleanup on unmount prevents memory leaks

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add terminal-style path prefix (~/) using ::before pseudo-element
- Replace all rgba() colors with CSS design tokens
- Remove border-radius for sharp terminal edges
- Add green hover state using --color-green-darker
- Apply monospace font (--font-family-mono)
- Add green glow effect (--glow-green) on back button hover
- Use design token spacing and typography throughout
- Import and render MatrixBackground component
- Update text to lowercase for terminal aesthetic
- Update tagline to match design ('zero-knowledge encrypted storage')
- Loading state shows 'initializing...' instead of 'Loading...'
- Matrix animation renders as first child (background layer)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove all light mode CSS and prefers-color-scheme queries
- Use design token variables throughout
- Remove all border-radius (sharp corners)
- Add green glow effects
- Monospace font for all text
- Green progress bars and buttons
- Terminal-styled upload zone with dashed border
- Add TYPE column header to FileList component
- Implement getItemType() helper for file type detection
- Update FileListItem to render type column in grid
- Match 4-column design (NAME, SIZE, TYPE, MODIFIED) from CSS

Deviation: Plan specified CSS-only changes but components needed
update to render the TYPE column per design specification (Rule 2)
Tasks completed: 3/3
- Update responsive.css with terminal aesthetic
- Create MatrixBackground component
- Add MatrixBackground to Login page

SUMMARY: .planning/phases/06.2-restyle-app-with-pencil-design/06.2-04-SUMMARY.md
Tasks completed: 2/2
- Task 1: Restyle file-browser.css with terminal aesthetic
- Task 2: Restyle breadcrumbs.css with terminal aesthetic

Deviation: Added TYPE column to React components (Rule 2)

SUMMARY: .planning/phases/06.2-restyle-app-with-pencil-design/06.2-02-SUMMARY.md
Tasks completed: 3/3
- Task 1: Restyle context-menu.css (terminal aesthetic)
- Task 2: Restyle dialogs.css (green accents, monospace)
- Task 3: Restyle modal.css and upload.css (terminal styling)

SUMMARY: .planning/phases/06.2-restyle-app-with-pencil-design/06.2-03-SUMMARY.md
- FileListItem: [DIR]/[FILE] text prefixes instead of emoji icons
- FolderTreeNode: [DIR] text prefix for folders
- Restructure FileListItem with row-top (icon+name) and row-bottom (date+size) for mobile 2-row layout
- TYPE column shows 'dir' for folders, file extension for files
- Simplify type detection logic for terminal aesthetic
…text

- FileList header: uppercase column names (NAME, SIZE, TYPE, MODIFIED)
- UploadZone: terminal-style button text (--upload) and lowercase states
- Match terminal/hacker aesthetic with proper text casing
…branding

- AuthButton: [CONNECT] text with lowercase loading state
- LogoutButton: lowercase text (logout, logging out...)
- Dashboard header: > CIPHERBOX branding with app-title class
- Settings link and user email: lowercase for terminal aesthetic
- Remove unused auth method formatting logic and imports
Tasks completed: 3/3
- Task 1: Update FileListItem and FolderTreeNode with text prefixes
- Task 2: Update FileList header and upload zone
- Task 3: Update AuthButton and Dashboard header

SUMMARY: .planning/phases/06.2-restyle-app-with-pencil-design/06.2-05-SUMMARY.md
- Update login button selector: [CONNECT] button uses .auth-button class
- Update logout button selector: logout button uses .logout-button class
- Replace text-based selectors with stable class selectors
- Updated page objects: LoginPage, DashboardPage
- Updated test files: smoke.spec.ts, login.spec.ts, logout.spec.ts, session.spec.ts

Note: Folder creation tests still reference non-existent 'New Folder' button.
These tests will be addressed when folder toolbar buttons are implemented.
- Update h1 selector: CipherBox → CIPHERBOX (uppercase)
- Update tagline selector: Zero-knowledge encrypted cloud storage → zero-knowledge encrypted storage
- Matches actual component text from Login.tsx after Pencil restyle

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…esting

- Implemented a Fastify server to handle IPNS records with endpoints for storing and retrieving records.
- Added in-memory storage for IPNS records, with a reset endpoint for clearing records.
- Configured TypeScript with strict settings and output directory.
- Included necessary dependencies and scripts in package.json for building and running the service.
- AuthButton: auth-button → login-button (matches App.css)
- LogoutButton: logout-button → logout-link (matches App.css)
- E2E page objects: updated selectors to match

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Login button: button:has-text("Sign In") → button.login-button
- Logout button: button:has-text("Logout") → button.logout-link

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update file-list.page.ts selectors from .file-list-item-text to
  .file-list-item-name to match actual component class names
- Add wait for file list to stabilize after navigating to root in
  test 3.1 to prevent race condition during upload
- Update logout test selector to recognize [CONNECT] button from
  terminal-styled login page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@FSM1 FSM1 requested a review from Copilot January 23, 2026 13:54

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements Phase 6.2 of the CipherBox project: a complete UI restyle with a terminal/hacker aesthetic. The changes transform the application from a standard UI to a green-on-black terminal theme using JetBrains Mono font, replacing emoji icons with text prefixes ([DIR]/[FILE]), and updating all interactive elements to match the new design.

Changes:

  • Complete CSS restyle with design tokens for terminal aesthetic (green-on-black color scheme, JetBrains Mono font)
  • E2E test updates to use stable class selectors instead of text-based selectors
  • Archive of redundant/obsolete test files from previous testing approach
  • New MatrixBackground component for animated login screen
  • Component text updates ([CONNECT] button, [DIR]/[FILE] prefixes, lowercase interactive text)
  • Extensive planning documentation for Phase 6.2 implementation

Reviewed changes

Copilot reviewed 53 out of 53 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tests/e2e/utils/web3auth-helpers.ts Updated selectors to use class-based approach for stability
tests/e2e/tests/full-workflow.spec.ts Updated button text expectations and added stability wait
tests/e2e/page-objects/*.ts Updated to use class selectors instead of text-based
tests/e2e/archive/tests/*.spec.ts Archived obsolete test files with README documentation
designs/cipher-box-design.pen Updated Pencil design file with mobile layout structure
apps/web/src/styles/*.css Complete restyle with terminal aesthetic and design tokens
apps/web/src/components/*.tsx Updated text content and added MatrixBackground component
apps/web/src/routes/*.tsx Login and Dashboard updates for terminal branding
apps/web/index.html Added JetBrains Mono font from Google Fonts
apps/web/src/index.css Complete design token system with CSS variables
.planning/phases/06.2-/.md Comprehensive planning documentation for Phase 6.2

Comment thread tests/e2e/utils/web3auth-helpers.ts
@FSM1 FSM1 marked this pull request as ready for review January 25, 2026 02:30
@coderabbitai

coderabbitai Bot commented Jan 25, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Inserted Phase 6.3 into planning; added extensive Phase 6.2 planning artifacts to restyle the web UI to a terminal/pencil aesthetic (design tokens, JetBrains Mono), many CSS and component changes (including a new MatrixBackground), updated UI copy/selectors, and removed archived E2E test suites and README files.

Changes

Cohort / File(s) Summary
Roadmap & State
​.planning/ROADMAP.md, ​.planning/STATE.md
Added Phase 6.3 entry, updated totals, progress table and last-updated timestamp.
Phase 06.2 Planning Docs
.planning/phases/06.2-restyle-app-with-pencil-design/*
Added plans (06.2-01…06.2-06), summaries, context, research, and tasks for design tokens, terminal restyle, responsive/mobile, overlays, Matrix background, and E2E selector updates.
Global fonts & tokens
apps/web/index.html, apps/web/src/index.css
Load JetBrains Mono via Google Fonts; introduce :root design tokens for colors, typography, spacing; enforce dark color-scheme.
App-level styling
apps/web/src/App.css
Major restyle of login/dashboard to terminal motif (mono typography, token-driven styles, API status tweaks).
Matrix background component
apps/web/src/components/MatrixBackground.tsx
New exported MatrixBackground canvas component (matrix rain ~30fps, resize handling, cleanup).
Login & Dashboard routes
apps/web/src/routes/Login.tsx, apps/web/src/routes/Dashboard.tsx
Login mounts MatrixBackground, adds redirect-on-auth; branding and copy updated; dashboard title and email casing changed.
Auth UI
apps/web/src/components/auth/AuthButton.tsx, apps/web/src/components/auth/LogoutButton.tsx
Simplified AuthButton to [CONNECT] / connecting...; Logout button class/text changed to logout-link / logout (lowercase).
File browser components
apps/web/src/components/file-browser/*
FileList header uppercased and adds TYPE column; FileListItem uses [DIR]/[FILE] prefixes, getFileExtension() helper, two-row mobile layout; FolderTreeNode uses [DIR]; UploadZone text simplified.
Stylesheets (terminal restyle)
apps/web/src/styles/*.css
Large CSS replacements to token-driven terminal aesthetic: zero border-radius, green glow, monospace typography; four-column desktop / two-row mobile layout and overlay restyles.
Design file updates
designs/cipher-box-design.pen
Layout adjustments to support two-row mobile layout and moved size/modified metadata to bottom rows.
E2E tests & page objects
tests/e2e/archive/**, tests/e2e/page-objects/*, tests/e2e/utils/web3auth-helpers.ts, tests/e2e/tests/full-workflow.spec.ts
Removed archived E2E suites and README; updated page-object selectors to class-based locators, adjusted helpers and test selectors to include [CONNECT], and added stabilization waits.
Tooling & config
tools/mock-ipns-routing/package.json, .coderabbit.yaml, .claude/settings.json
Small devDependency bump; added .coderabbit.yaml review config; removed statusLine entry from .claude/settings.json.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User as rgba(66,133,244,0.5) User
participant Browser as rgba(52,168,83,0.5) Browser
participant LoginPage as rgba(255,193,7,0.5) Login Page
participant MatrixBG as rgba(156,39,176,0.5) MatrixBackground
participant AuthService as rgba(233,30,99,0.5) Auth Service
participant Router as rgba(96,125,139,0.5) Router
participant Dashboard as rgba(0,188,212,0.5) Dashboard Page

User->>Browser: navigate to /
Browser->>LoginPage: render login UI
LoginPage->>MatrixBG: mount (start canvas animation)
User->>LoginPage: click [CONNECT]
LoginPage->>AuthService: initiate auth flow
AuthService-->>LoginPage: auth success
LoginPage->>Router: navigate('/dashboard')
Router->>Dashboard: render dashboard
LoginPage->>MatrixBG: unmount (cleanup animation)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Restyle' is vague and generic, providing minimal insight into the scope or primary focus of the changeset. Consider using a more descriptive title that captures the main objective, such as 'Apply terminal/hacker aesthetic to web UI' or 'Restyle app with Pencil design system'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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


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

@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: 6

Caution

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

⚠️ Outside diff range comments (1)
apps/web/src/components/auth/AuthButton.tsx (1)

3-6: Update the doc comment to reflect the new generic connect label.

The comment still promises “Continue with [method]”, but the UI now shows a static “[CONNECT]”.

🤖 Fix all issues with AI agents
In @.planning/phases/06.2-restyle-app-with-pencil-design/06.2-01-SUMMARY.md:
- Around line 54-57: The emphasized bold line "**JetBrains Mono monospace
typography system with pure black background, green accent colors (`#00D084`), and
complete CSS custom properties for terminal/hacker aesthetic**" should be
converted into a proper Markdown heading to satisfy markdownlint MD036; replace
the bold syntax with an appropriate heading level (for example add one to three
leading # characters) so the text becomes a real heading (e.g., "### JetBrains
Mono monospace typography system with pure black background, green accent colors
(`#00D084`), and complete CSS custom properties for terminal/hacker aesthetic")
and ensure no surrounding ** markers remain.

In @.planning/phases/06.2-restyle-app-with-pencil-design/06.2-02-SUMMARY.md:
- Around line 47-50: Replace the emphasized summary line "**File browser and
breadcrumbs restyled with terminal aesthetic: green borders, 4-column grid
(NAME, SIZE, TYPE, MODIFIED), monospace fonts, and ~/ path prefix**" with a
proper Markdown heading (e.g., "### File browser and breadcrumbs restyled with
terminal aesthetic: green borders, 4-column grid (NAME, SIZE, TYPE, MODIFIED),
monospace fonts, and ~/ path prefix") so the content uses a heading level
instead of bold text and satisfies MD036; keep the existing wording but prepend
the appropriate number of "#" characters to match the document structure.

In @.planning/phases/06.2-restyle-app-with-pencil-design/06.2-03-SUMMARY.md:
- Around line 238-244: The fenced code block listing commits (containing commit
hashes ad043a8, e33e353, b2b14c0) lacks a language tag; add a language
identifier (for example "text" or "diff") immediately after the opening ``` so
the block becomes ```text and leave the content and closing ``` unchanged to
satisfy markdownlint MD040.

In @.planning/phases/06.2-restyle-app-with-pencil-design/06.2-05-SUMMARY.md:
- Around line 98-121: Convert the bolded numbered items (e.g., "**1. Text
prefixes replace emoji icons**", "**2. Simplified file type detection**", "**3.
Removed auth method display logic**", "**4. 2-row mobile structure with wrapper
divs**", and the "## Deviations from Plan" / "**ESLint unused variable errors
during commit**" lines) into proper Markdown headings (e.g., use #, ##, or ###
as appropriate) so the document satisfies MD036; update the section lines to
heading syntax while preserving the original text and hierarchy and ensure any
subsequent content remains under the new headings.

In @.planning/STATE.md:
- Around line 12-18: Update the Phase 6.2 and overall plan counts in STATE.md to
match ROADMAP by replacing the outdated "Plan: 5 of 7" and "Progress:
[########..] 79% (37 of 47 plans)" values with the correct counts from ROADMAP
(Phase 6.2 should show 6 plans and the total plans should be 54); search for the
exact strings "Phase: 6.2", "Plan: 5 of 7", and "Progress: [########..] 79% (37
of 47 plans)" and update all occurrences (also apply the same correction to the
nearby occurrences referenced in the comment) so the displayed counts and
computed percentage reflect 6 of 6 in Phase 6.2 and the correct overall total of
54 plans.

In `@apps/web/src/styles/file-browser.css`:
- Around line 274-315: The grid cells lack proper ARIA semantics: ensure every
cell element inside the file row has role="gridcell" (e.g., the
icon/name/size/type/date spans inside .file-list-item and the children that
currently rely on .file-list-item-row-bottom) or remove/replace display:contents
on .file-list-item-row-bottom so the wrapper can carry the role; update the
elements rendered inside .file-list-item-row-top/.file-list-item-row-bottom to
include role="gridcell" (or a wrapper with role="gridcell") and verify the
container uses role="grid" and headers keep role="columnheader" so screen
readers can correctly interpret the grid.
🧹 Nitpick comments (12)
apps/web/src/index.css (1)

28-32: Consider using rem units for font sizes to improve accessibility.

Using fixed px values prevents users who adjust their browser's default font size from scaling the text. Consider defining font sizes in rem relative to a base size.

♻️ Suggested change
-  --font-size-xs: 10px;   /* Status text */
-  --font-size-sm: 11px;   /* Body, buttons, file list */
-  --font-size-md: 14px;   /* App name */
-  --font-size-lg: 18px;   /* Prompt symbol */
-  --font-size-xl: 24px;   /* Login logo */
+  --font-size-xs: 0.625rem;   /* Status text */
+  --font-size-sm: 0.6875rem;  /* Body, buttons, file list */
+  --font-size-md: 0.875rem;   /* App name */
+  --font-size-lg: 1.125rem;   /* Prompt symbol */
+  --font-size-xl: 1.5rem;     /* Login logo */
apps/web/src/styles/breadcrumbs.css (1)

75-83: Consider adding keyboard focus styles for path segments.

The .breadcrumbs-segment has hover styles but lacks :focus or :focus-visible styles. If these segments are interactive (clickable to navigate), they should have visible focus indicators for keyboard users.

♻️ Suggested addition
 .breadcrumbs-segment:hover {
   color: var(--color-text-primary);
   cursor: pointer;
 }
+
+.breadcrumbs-segment:focus-visible {
+  color: var(--color-text-primary);
+  outline: 2px solid var(--color-green-primary);
+  outline-offset: 2px;
+}
apps/web/src/styles/modal.css (2)

19-20: Consider using a design token for the backdrop color.

The backdrop uses a hardcoded rgba(0, 0, 0, 0.8) while other components use design tokens. For consistency, consider adding a backdrop token.

♻️ Suggested approach

Add a token in index.css:

--color-backdrop: rgba(0, 0, 0, 0.8);

Then use it here:

-  background-color: rgba(0, 0, 0, 0.8);
+  background-color: var(--color-backdrop);

99-104: Modal body max-height calculation uses a magic number.

The 80px in calc(90vh - 80px) assumes a fixed header height. If the header height changes, this could cause content clipping or extra space. Consider documenting this coupling or using a CSS variable.

apps/web/src/styles/file-browser.css (1)

39-85: Consider migrating legacy toolbar button styles to avoid mixed theming.
The new toolbar button base styles may still be overridden by the legacy .file-browser-new-folder-button rules later in the file, leaving rounded corners/rgba colors in a tokenized toolbar. Aligning that legacy rule with the new tokens would keep the toolbar consistent.

apps/web/src/styles/dialogs.css (1)

80-83: Optional: tokenise the error focus glow for full consistency.
If you want complete token coverage, consider introducing a shared --glow-error token and referencing it here instead of the hard‑coded RGBA.

apps/web/src/routes/Dashboard.tsx (1)

39-43: Preserve original email casing; use CSS if lowercase display is desired.

toLowerCase() alters the displayed email; if the goal is visual style, prefer text-transform: lowercase in CSS to keep the original value intact.

apps/web/src/routes/Login.tsx (1)

5-40: Optional: render MatrixBackground once to avoid remounts.
Right now it mounts in both branches; you can render it once and conditionally swap the content.

♻️ Suggested refactor
-  if (isLoading) {
-    return (
-      <div className="login-container">
-        <MatrixBackground />
-        <div className="loading">initializing...</div>
-      </div>
-    );
-  }
-
-  return (
-    <div className="login-container">
-      <MatrixBackground />
-      <h1>CIPHERBOX</h1>
-      <p className="tagline">zero-knowledge encrypted storage</p>
-      <p className="login-description">
-        your files, encrypted on your device. we never see your data.
-      </p>
-      <AuthButton />
-      <ApiStatusIndicator />
-    </div>
-  );
+  return (
+    <div className="login-container">
+      <MatrixBackground />
+      {isLoading ? (
+        <div className="loading">initializing...</div>
+      ) : (
+        <>
+          <h1>CIPHERBOX</h1>
+          <p className="tagline">zero-knowledge encrypted storage</p>
+          <p className="login-description">
+            your files, encrypted on your device. we never see your data.
+          </p>
+          <AuthButton />
+          <ApiStatusIndicator />
+        </>
+      )}
+    </div>
+  );
apps/web/src/components/MatrixBackground.tsx (1)

12-101: Respect prefers-reduced-motion to avoid forced animation.
This helps accessibility for motion-sensitive users.

♿ Suggested addition
     const CHARACTERS = '01';
     const PRIMARY_COLOR = '#00D084';
     const DIM_COLOR = '#006644';
+    const prefersReducedMotion = window.matchMedia(
+      '(prefers-reduced-motion: reduce)'
+    );
@@
     function resize() {
       targetCanvas.width = window.innerWidth;
       targetCanvas.height = window.innerHeight;
@@
     }
+
+    if (prefersReducedMotion.matches) {
+      resize();
+      window.addEventListener('resize', resize);
+      return () => {
+        window.removeEventListener('resize', resize);
+      };
+    }
apps/web/src/components/file-browser/FileListItem.tsx (1)

54-60: Treat dotfiles as no-extension in TYPE column.

Right now .env shows env, which may read like a real extension. If you want extensions only, treat a leading-dot filename as “no extension.”

♻️ Proposed tweak
-  if (lastDot === -1 || lastDot === filename.length - 1) {
+  if (lastDot <= 0 || lastDot === filename.length - 1) {
     return '-';
   }
apps/web/src/styles/responsive.css (2)

31-68: Add a prefers-reduced-motion fallback for animations/transitions.

Lines 31 and 58 introduce motion without a reduced-motion escape hatch. Adding a small media query improves accessibility without affecting the design.

♿ Suggested addition
+@media (prefers-reduced-motion: reduce) {
+  .file-browser-toggle,
+  .file-browser-sidebar,
+  .file-browser-backdrop,
+  .file-browser-sidebar-close {
+    transition: none;
+    animation: none;
+  }
+}

163-189: Consider bumping mobile font sizes for readability.

Lines 164, 169, and 187 use 9–11px text, which can be hard to read on mobile. Slightly larger sizes typically improve legibility without breaking layout.

🔍 Possible tweak
 .file-list-item-icon {
-  font-size: 10px;
+  font-size: 12px;
   font-weight: 600;
 }

 .file-list-item-name {
-  font-size: 11px;
+  font-size: 12px;
   flex: 1;
   overflow: hidden;
   text-overflow: ellipsis;
   white-space: nowrap;
 }

 .file-list-item-date,
 .file-list-item-size {
-  font-size: 9px;
+  font-size: 11px;
   color: var(--color-text-secondary);
 }

Comment thread .planning/phases/06.2-restyle-app-with-pencil-design/06.2-05-SUMMARY.md Outdated
Comment thread .planning/STATE.md Outdated
Comment on lines 12 to 18
Phase: 6.2 of 11 (Restyle App with Pencil Design) - IN PROGRESS
Plan: 5 of 7 in Phase 6.2 complete
Status: In progress - Component text updates complete
Last activity: 2026-01-23 - Completed 06.2-05-PLAN.md (Component Text Updates)

Progress: [#######...] 72% (34 of 47 plans)
Progress: [########..] 79% (37 of 47 plans)

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

Reconcile Phase 6.2 and total-plan counts with ROADMAP.

STATE says “5 of 7” and “37 of 47,” but ROADMAP lists 6 plans for Phase 6.2 and total plans 54. Please align these totals to avoid reporting drift.

Also applies to: 23-26

🤖 Prompt for AI Agents
In @.planning/STATE.md around lines 12 - 18, Update the Phase 6.2 and overall
plan counts in STATE.md to match ROADMAP by replacing the outdated "Plan: 5 of
7" and "Progress: [########..] 79% (37 of 47 plans)" values with the correct
counts from ROADMAP (Phase 6.2 should show 6 plans and the total plans should be
54); search for the exact strings "Phase: 6.2", "Plan: 5 of 7", and "Progress:
[########..] 79% (37 of 47 plans)" and update all occurrences (also apply the
same correction to the nearby occurrences referenced in the comment) so the
displayed counts and computed percentage reflect 6 of 6 in Phase 6.2 and the
correct overall total of 54 plans.

Comment on lines +274 to 315
/* File List Item - Desktop uses grid, Mobile uses 2-row stacked layout */
.file-list-item {
display: grid;
grid-template-columns: 1fr 100px 150px;
gap: 1rem;
padding: 0.75rem 1rem;
grid-template-columns: 1fr 120px 120px 180px;
grid-template-areas: "name size type date";
gap: var(--spacing-md);
padding: var(--spacing-sm) var(--spacing-md);
cursor: pointer;
transition: background-color 0.15s ease;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
border-bottom: var(--border-thickness) solid var(--color-border-dim);
font-family: var(--font-family-mono);
}

.file-list-item:last-child {
border-bottom: none;
}

.file-list-item:hover {
background: rgba(255, 255, 255, 0.05);
background-color: var(--color-green-darker);
}

.file-list-item--selected {
background: rgba(102, 126, 234, 0.2);
background-color: var(--color-green-darker);
border-left: 2px solid var(--color-green-primary);
}

.file-list-item--selected:hover {
background: rgba(102, 126, 234, 0.3);
background-color: var(--color-green-darker);
}

.file-list-item-name {
/* Row wrappers - on desktop, these act as containers within grid */
.file-list-item-row-top {
grid-area: name;
display: flex;
align-items: center;
gap: 0.5rem;
min-width: 0; /* Allow text truncation */
gap: 6px;
min-width: 0;
}

.file-list-item-row-bottom {
display: contents; /* Children participate directly in parent grid on desktop */
}

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# Find HTML/JSX files that might use the file-browser.css or reference the file-list-item classes
find . -type f \( -name "*.html" -o -name "*.jsx" -o -name "*.tsx" -o -name "*.js" -o -name "*.ts" \) | head -20

Repository: FSM1/cipher-box

Length of output: 805


🏁 Script executed:

#!/bin/bash

# Search for files referencing file-list-item-row-bottom
rg "file-list-item-row-bottom" --type jsx --type tsx --type js --type html -l

# Also search for file-browser related components
rg "file-browser" --type jsx --type tsx --type js --type html -l | head -10

Repository: FSM1/cipher-box

Length of output: 114


🏁 Script executed:

#!/bin/bash

# Search for the main component that uses these CSS classes
rg "file-list-item" --type jsx --type tsx -B 2 -A 2 | head -50

Repository: FSM1/cipher-box

Length of output: 86


🏁 Script executed:

#!/bin/bash

# Check for accessibility testing files or configurations
find . -type f \( -name "*a11y*" -o -name "*accessibility*" -o -name "*test*" \) | grep -E "\.(ts|tsx|js|jsx|json)$" | head -20

# Check for jest/vitest config
find . -type f -name "jest.config.*" -o -name "vitest.config.*" -o -name ".eslintrc*"

Repository: FSM1/cipher-box

Length of output: 1848


🏁 Script executed:

#!/bin/bash

# Find the web app structure to understand component types
ls -la apps/web/src/ | head -20

Repository: FSM1/cipher-box

Length of output: 1045


🏁 Script executed:

#!/bin/bash

# Search for file-list-item-row-bottom without file type restrictions
rg "file-list-item-row-bottom" --type-list | head -5

# Try searching for file-list-item classes broadly
rg "file-list-item" -t ts -t js -A 3 | head -60

Repository: FSM1/cipher-box

Length of output: 4812


🏁 Script executed:

#!/bin/bash

# Look for .vue or .svelte component files
find apps/web/src -type f \( -name "*.vue" -o -name "*.svelte" \) -print

# Look at file-browser.css directly to understand full context
cat apps/web/src/styles/file-browser.css

Repository: FSM1/cipher-box

Length of output: 9640


🏁 Script executed:

#!/bin/bash

# Search for the component that might render the file list
rg "file-list-item" apps/web/src --max-count 20

Repository: FSM1/cipher-box

Length of output: 2352


🏁 Script executed:

#!/bin/bash

# Check the responsive.css to understand mobile behavior
cat apps/web/src/styles/responsive.css

Repository: FSM1/cipher-box

Length of output: 6200


🏁 Script executed:

#!/bin/bash

# Examine the FileListItem component more closely for any accessibility attributes
cat -n apps/web/src/components/file-browser/FileListItem.tsx

Repository: FSM1/cipher-box

Length of output: 8389


🏁 Script executed:

#!/bin/bash

# Check if there's any accessibility testing or ARIA usage in the project
find apps/web -type f \( -name "*.tsx" -o -name "*.ts" \) -exec grep -l "aria-\|role=" {} \; | head -10

Repository: FSM1/cipher-box

Length of output: 672


🏁 Script executed:

#!/bin/bash

# Check for any ARIA attributes on file-list-item-row-bottom or related elements
rg "file-list-item-row-bottom" -A 5 -B 5 apps/web/src/components/

# Also check if there's any accessibility testing in place
rg "getByRole\|queryByRole\|findByRole" apps/web/src --type tsx --type ts | head -20

Repository: FSM1/cipher-box

Length of output: 1157


🏁 Script executed:

#!/bin/bash

# Check the FileList component to see the parent container context
cat -n apps/web/src/components/file-browser/FileList.tsx

Repository: FSM1/cipher-box

Length of output: 3996


🏁 Script executed:

#!/bin/bash

# Search for any accessibility-related comments or aria attributes in the codebase
rg "a11y|accessibility|aria-label|role=" apps/web/src/components/file-browser/ --type tsx -B 2 -A 2

Repository: FSM1/cipher-box

Length of output: 86


🏁 Script executed:

#!/bin/bash

# Search for any accessibility tests or testing setup
find apps/web -name "*.test.*" -o -name "*.spec.*" | grep -i "a11y\|access" 

# Check if there's a testing library or axe-core setup
rg "testing-library\|@axe-core\|jest-axe" apps/web --type json

# Check package.json for a11y testing dependencies
cat apps/web/package.json 2>/dev/null || find . -name "package.json" -path "*/apps/web/*" -exec cat {} \;

Repository: FSM1/cipher-box

Length of output: 1559


🏁 Script executed:

#!/bin/bash

# Check if there are any explicit gridcell roles on the span elements
rg "role=\"gridcell\"|role=\"cell\"" apps/web/src/components/file-browser/

# Look for how other grid implementations in the codebase handle cells
rg "role=\"grid\"" apps/web/src -B 5 -A 10 | head -50

Repository: FSM1/cipher-box

Length of output: 1345


🏁 Script executed:

#!/bin/bash

# Verify the actual rendered HTML structure by looking at how spans are positioned in the grid
cat -n apps/web/src/components/file-browser/FileListItem.tsx | sed -n '202,240p'

Repository: FSM1/cipher-box

Length of output: 1607


🏁 Script executed:

#!/bin/bash

# Check if the span elements inside the grid should have role="gridcell"
# Look at all grid-cell-like elements
rg "grid-area:" apps/web/src/styles/file-browser.css -B 2 -A 2

# Check if any spans or grid cells have explicit gridcell roles
rg "gridcell" apps/web/src/components/

Repository: FSM1/cipher-box

Length of output: 470


🏁 Script executed:

#!/bin/bash

# Verify the complete structure to understand if gridcell roles are needed
# Look at the actual grid column assignments in CSS
cat -n apps/web/src/styles/file-browser.css | sed -n '274,320p'

# Check the header structure to see if it has proper roles
cat -n apps/web/src/components/file-browser/FileList.tsx | sed -n '73,90p'

Repository: FSM1/cipher-box

Length of output: 2295


Add role="gridcell" to all grid cell content and verify grid semantics.

The grid structure is incomplete: while the container has role="grid" and headers have role="columnheader", all grid cells (icon, name, size, type, date) are missing role="gridcell". This is compounded by display: contents on .file-list-item-row-bottom, which removes the wrapper from the accessibility tree, leaving the child spans with no explicit cell semantics. Screen readers cannot properly announce grid structure with this configuration. Add gridcell roles to all cell content or refactor to avoid display: contents without proper ARIA compensation.

🤖 Prompt for AI Agents
In `@apps/web/src/styles/file-browser.css` around lines 274 - 315, The grid cells
lack proper ARIA semantics: ensure every cell element inside the file row has
role="gridcell" (e.g., the icon/name/size/type/date spans inside .file-list-item
and the children that currently rely on .file-list-item-row-bottom) or
remove/replace display:contents on .file-list-item-row-bottom so the wrapper can
carry the role; update the elements rendered inside
.file-list-item-row-top/.file-list-item-row-bottom to include role="gridcell"
(or a wrapper with role="gridcell") and verify the container uses role="grid"
and headers keep role="columnheader" so screen readers can correctly interpret
the grid.

FSM1 and others added 3 commits January 25, 2026 18:04
* ci: add CodeRabbit AI code review configuration

Adds .coderabbit.yaml with project-specific review settings including:
- Path-based instructions for api, web, and crypto packages
- Appropriate filters to ignore generated/lock files
- Security-focused review guidance for crypto code

* fix(ci): use valid profile value in CodeRabbit config

Change profile from 'default' to 'chill' as only 'chill' and
'assertive' are valid enum values in the CodeRabbit schema.

---------

Co-authored-by: Claude <noreply@anthropic.com>
- Fix MD036: Replace bold text with proper headings in SUMMARY files
- Fix MD040: Add language tag to fenced code block
- Fix a11y: Add role="gridcell" to file list grid cells
- Fix a11y: Add aria-hidden to decorative icon text

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@FSM1

FSM1 commented Jan 25, 2026

Copy link
Copy Markdown
Owner Author

All CodeRabbit review comments have been addressed in commit 8d09913:

Fixed:

  • MD036 (bold text as heading) in 06.2-01-SUMMARY.md, 06.2-02-SUMMARY.md, 06.2-05-SUMMARY.md
  • MD040 (fenced code block language) in 06.2-03-SUMMARY.md
  • Accessibility: Added role="gridcell" to FileListItem grid cells
  • Accessibility: Added aria-hidden="true" to decorative icon text

Ignored (not applicable):

  • STATE.md count mismatch: This is a working document that gets updated during execution, not a final artifact

Already fixed (in prior commits):

  • E2E test comment for [CONNECT] button was already updated

@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: 1

🤖 Fix all issues with AI agents
In @.planning/phases/06.2-restyle-app-with-pencil-design/06.2-01-SUMMARY.md:
- Around line 98-101: The malformed inline comment `/_ Status text _/` in the
CSS token block (e.g., near --font-size-xs) triggers markdownlint MD037; replace
that with a valid CSS comment syntax (/* Status text */) so semantic tokens like
--font-size-xs use proper comments and the MD037 warning is resolved.

Comment on lines +98 to +101
- Organize CSS variables by category: color primitives → semantic colors → typography → spacing → effects
- Use semantic naming: --color-text-primary instead of --green-1
- Reference primitives in semantic tokens: --color-text-primary: var(--color-green-primary)
- Document intended usage in comments (e.g., --font-size-xs: 10px; /_ Status text _/)

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

Fix malformed CSS comment triggering MD037.

The inline comment uses underscores with spaces (/_ Status text _/), which markdownlint flags. Use a proper CSS comment.

✅ Proposed fix
-- Document intended usage in comments (e.g., --font-size-xs: 10px; /_ Status text _/)
+- Document intended usage in comments (e.g., --font-size-xs: 10px; /* Status text */)
📝 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
- Organize CSS variables by category: color primitives → semantic colors → typography → spacing → effects
- Use semantic naming: --color-text-primary instead of --green-1
- Reference primitives in semantic tokens: --color-text-primary: var(--color-green-primary)
- Document intended usage in comments (e.g., --font-size-xs: 10px; /_ Status text _/)
- Organize CSS variables by category: color primitives → semantic colors → typography → spacing → effects
- Use semantic naming: --color-text-primary instead of --green-1
- Reference primitives in semantic tokens: --color-text-primary: var(--color-green-primary)
- Document intended usage in comments (e.g., --font-size-xs: 10px; /* Status text */)
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

101-101: Spaces inside emphasis markers

(MD037, no-space-in-emphasis)


101-101: Spaces inside emphasis markers

(MD037, no-space-in-emphasis)

🤖 Prompt for AI Agents
In @.planning/phases/06.2-restyle-app-with-pencil-design/06.2-01-SUMMARY.md
around lines 98 - 101, The malformed inline comment `/_ Status text _/` in the
CSS token block (e.g., near --font-size-xs) triggers markdownlint MD037; replace
that with a valid CSS comment syntax (/* Status text */) so semantic tokens like
--font-size-xs use proper comments and the MD037 warning is resolved.

Michael and others added 2 commits January 25, 2026 23:34
- Insert Phase 6.3 after 6.2 for structural UI redesign
- Design-first approach using Pencil MCP as source of truth
- Covers page layouts, component hierarchy, toolbars, navigation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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