Skip to content

refactor(ui): collapse light surface system, drop shell gradient#841

Merged
Astro-Han merged 3 commits into
devfrom
claude/i840-light-collapse
May 22, 2026
Merged

refactor(ui): collapse light surface system, drop shell gradient#841
Astro-Han merged 3 commits into
devfrom
claude/i840-light-collapse

Conversation

@Astro-Han

@Astro-Han Astro-Han commented May 21, 2026

Copy link
Copy Markdown
Owner

Summary

Three cuts to the light theme surface system. They are bundled because all three fix the same complaint: the light canvas should be a calm flat sheet, and it wasn't.

  1. Drop the desktop shell background gradient. [data-component="desktop-shell"] painted a linear-gradient(180deg, #FFFFFF, #F9F9F9) plus a radial highlight overlay. Transparent inner regions (thread, right pane) sat on top of it and read as ~#FCFCFC instead of the spec #FFFFFF. The bg-bg-base Tailwind class on the same element now paints a flat var(--bg-base) surface, and the Electron BrowserWindow native backgroundColor (already set from --background-base via setBackgroundColor IPC) handles any transparent fallthrough.
  2. Collapse the light token surface to match the dark collapse landed in feat(ui): collapse dark mode to 2-surface palette #834. Light carried a 4-tier ink scale, a 3-tier border scale mixing opaque hex and high alpha, and an unused --surface-list-hover token. Dark already collapsed to 2-tier ink + 1-tier alpha border; light is now symmetric.
  3. Align send button icon color with the composer preview spec. Pre-existing latent bug surfaced by cut 2: send-button.tsx set the icon to var(--fg-weak) when disabled while the background used var(--icon-weak). After the collapse merged both tokens to #8c817a, the disabled-state arrow rendered the same color as its own background and went invisible. docs/design/preview/composer.html L264-273 locks the icon at var(--bg-base) unconditionally; runtime now matches that spec across enabled / disabled / stopping states, and the hardcoded #1A1613 / --button-brand-base literals are replaced with the var(--fg-strong) / var(--brand-primary) tokens the preview uses.

Token names survive as aliases so callsites do not need touching. --surface-interactive-base / --surface-interactive-hover keep their separate values because context-items.tsx uses both to differentiate default / hover / selected states; collapsing them would force callsite invention.

Why

A user-supplied screenshot of the production light theme read off-spec: pixel-sampled center thread and right pane were #FCFCFC instead of the spec #FFFFFF. Composer and sidebar measured correctly because they paint their own opaque background; the bug was specifically in regions that depended on inheriting the canvas. The shell gradient was the source: linear-gradient(180deg, #FFFFFF, #F9F9F9) at the mid point resolves to ~#FCFCFC, exactly the measured value.

Light's token system also drifted from the dark collapse: 4 ink tiers, 3 border tiers mixing opaque #ECE6DF / #F3EDE6 with high-alpha rgba(0,0,0,0.162), and a --surface-list-hover that no Tailwind callsite consumed. Collapsing brings the two themes to the same shape (2 ink, 1 border alpha) and removes one dead token.

Related Issue

Closes #840.

Human Review Status

Pending

Review Focus

  • packages/app/src/index.css — both light and dark shell rules lose the gradient + --shell-background-* + --shell-highlight-overlay vars symmetrically. Border / frame / titlebar vars are kept; they are color-mix inputs for OS window chrome, not body dividers, and have a comment explaining the asymmetry with the rest of the surface system.
  • packages/ui/src/styles/theme.css — light block (around L83-160): ink, border, icon collapse. Both dark mirrors (:root[data-color-scheme="dark"] first-paint and the @media (prefers-color-scheme: dark) block) drop --surface-list-hover only; everything else dark stays as feat(ui): collapse dark mode to 2-surface palette #834 landed it.
  • packages/ui/src/theme/themes/pawwork.json — overrides mirror the theme.css collapse for both light and dark.
  • packages/ui/script/colors.txt and the regenerated packages/ui/src/styles/tailwind/colors.css--surface-list-hover removed from the Tailwind color enumeration; tailwind utility classes for that token no longer exist.

Risk Notes

  • Border tier reads softer in light. --border-base drops from rgba(0,0,0,0.162) to rgba(0,0,0,0.08), mirroring dark's airy rgba(255,255,255,0.06) posture. Button / input outlines, tooltip / popover containers, code fences and tool card borders all lighten slightly. The visual reads as cleaner, but it is a perceivable change.
  • --surface-list-hover deleted (light and dark both). The earlier grep confirmed no Tailwind callsite consumes it; the dead removal is safe. If any future component reaches for bg-surface-list-hover, the build will fail to find the utility — that is correct; the row hover pattern lives on --row-hover-overlay.
  • DESIGN.md is left untouched for now. docs/DESIGN.md L184 / L192 / L194 prose still describes light as 4-tier ink + 3-tier border. These are local-only files in this checkout and a doc-sync follow-up will rewrite that section together with docs/design/preview/colors-neutrals.html (currently stamped 2026-05-03 stale). Doc drift does not block the code change.

How To Verify

Phase 1 (shell gradient):
  bun --cwd packages/app run typecheck        # tsgo -b clean
  cd packages/app && bun test shell-frame-contract   # 9 pass / 95 expects
  rg shell-highlight-overlay|shell-background-base|shell-background-weak packages/   # zero refs

Phase 2 (token collapse):
  bun --cwd packages/ui run typecheck         # tsgo --noEmit clean
  cd packages/ui && bun test theme-parity     # 199 pass / 394 expects
  bun --cwd packages/opencode run typecheck   # tsgo --noEmit clean
  bun run script/tailwind.ts                  # regenerated colors.css from colors.txt

Snap (vite preview production build, not dev):
  PLAYWRIGHT_WEB_COMMAND='bun run serve -- --host 127.0.0.1 --port 3000' bun run snap app-shell           # 1 pass
  PLAYWRIGHT_WEB_COMMAND='...' bun run snap sidebar              # 1 pass
  PLAYWRIGHT_WEB_COMMAND='...' bun run snap sidebar-unread       # 1 pass
  PLAYWRIGHT_WEB_COMMAND='...' bun run snap session-turn-changes # 1 pass

Snap grids show: light center thread / right pane / composer all flat white; sidebar #F9F9F9; light tool card and sidebar selected row carry the softer border / overlay; dark side unchanged.

Real Electron walk with the macOS Digital Color Meter is the recommended pre-merge check (the gradient bug was originally reported from a real Electron screenshot). Snap is a web Chromium renderer so it does not exercise the Electron native window background path, but that path now intentionally shows through nothing because the shell paints bg-bg-base opaquely.

Screenshots or Recordings

app-shell session-turn-changes sidebar-unread sidebar

Checklist

  • Type label — this PR carries exactly one of bug, enhancement, task, documentation. Type labels are author-added; the labeler bot does NOT assign them. Add the label in the GitHub UI, then tick this.
  • Routing labels — this PR carries at least one of app, ui, platform, harness, ci. The labeler bot assigns these on PR open based on changed paths. Confirm the bot's choice (or override if wrong), then tick this.
  • Priority label — this PR carries exactly one of P0, P1, P2, P3. The priority-triage bot suggests one on PR open. Confirm or override, then tick this.
  • Human Review Status above is set to Pending, Approved by @<reviewer>, or Not required: <reason> (default is Pending; "not required" is restricted to bot-authored low-risk PRs).
  • I linked the related issue, or stated in Summary why there is no issue.
  • I described the review focus and any meaningful risks.
  • I replaced the example block in How To Verify with the real verification steps and the key result for each.
  • I did not introduce unrelated refactors, dependencies, generated files, or file changes beyond the stated scope.
  • (conditional) I manually checked visible UI or copy changes when needed, with screenshots or recordings. Leave unticked only if no visible UI or copy changed.
  • (conditional) I considered macOS and Windows impact for platform, packaging, updater, signing, paths, shell, or permissions changes. Leave unticked only if no platform/packaging surface was touched.
  • (conditional) I called out docs, release notes, dependencies, permissions, credentials, deletion behavior, generated content, or local file changes when relevant. Leave unticked only if none of those surfaces was touched.
  • I reviewed the final diff for unrelated changes and suspicious dependency changes.
  • I am targeting dev, and my PR title and commit messages use Conventional Commits in English.

Summary by CodeRabbit

  • Style
    • Normalized color palette across light and dark themes for improved visual consistency
    • Consolidated foreground and border color tones to streamline the design system
    • Removed obsolete list-hover token and simplified hover/overlay tokens
    • Updated desktop shell surface, border, and frame styling structure
    • Send button now uses theme tokens for more consistent colors across states

Review Change Stack

Astro-Han added 2 commits May 22, 2026 07:46
The shell painted a `linear-gradient(180deg, #FFFFFF, #F9F9F9)` plus a
radial highlight overlay. Transparent inner regions (thread, right pane)
bled through, landing at ~#FCFCFC instead of the spec #FFFFFF.

Remove the gradient and the three vars feeding it
(--shell-background-base, --shell-background-weak,
--shell-highlight-overlay). The `bg-bg-base` Tailwind class on the shell
element now paints a flat var(--bg-base) surface, and the Electron
BrowserWindow's native backgroundColor (set from --background-base via
setBackgroundColor IPC) handles any transparent fallthrough. Both light
and dark blocks are cleaned up symmetrically. Shell border / frame /
titlebar vars are kept; they are color-mix inputs for OS window chrome,
not body dividers.

Verified: shell-frame-contract.test.ts (9/9), tsgo -b clean.
Light theme carried a 4-tier ink scale, a 3-tier border scale mixing
opaque hex and high alpha, and an unused --surface-list-hover token.
Dark already collapsed (PR #834) to 2-tier ink + 1-tier alpha border;
light is now symmetric:

- ink 4 → 2: --fg-base aliases --fg-strong, --fg-weaker aliases --fg-weak
- icon: --icon-weak aliases --icon-base (mirror of collapsed ink)
- border 3 → 1: all three tiers resolve to rgba(0, 0, 0, 0.08)
  (was rgba 0.162 / #ece6df / #f3ede6, an inconsistent mix)
- drop --surface-list-hover: no Tailwind callsite consumes it; the
  row-hover pattern lives on --row-hover-overlay

Token names stay as aliases so callsites do not need touching.
--surface-interactive-base / --surface-interactive-hover keep their
separate values: context-items.tsx uses both to differentiate default /
hover / selected states; collapsing them would force callsite invention.

Regenerated tailwind/colors.css from script/colors.txt.

Closes #840.
Verified: theme-parity (199/199), tsgo clean on app + ui.
@coderabbitai

coderabbitai Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This PR collapses the light-mode color token system to match dark theme's minimal structure: foreground, border, and icon tokens are consolidated to fewer visual tiers, the --surface-list-hover token is removed system-wide, desktop shell styling is updated to use new surface/border variables, and the send button is switched to CSS tokens.

Changes

Light Theme Color System Collapse

Layer / File(s) Summary
Desktop shell surface and border styling
packages/app/src/index.css
Light and dark modes of the desktop shell no longer paint background; instead they use new --shell-surface-*, --shell-border-*, and frame/titlebar border/shadow/gradient variables with updated values for both schemes.
Light theme ink, border, and icon consolidation
packages/ui/src/styles/theme.css, packages/ui/src/theme/themes/pawwork.json
Light-mode foreground and border tokens are collapsed to fewer tiers: --fg-base and --fg-strong are unified, --fg-weaker and --fg-weak are paired, borders converge to a single rgba alpha, and --icon-weak is updated accordingly; corresponding PawWork light-mode overrides are adjusted to match.
Removal of surface-list-hover token
packages/ui/src/styles/theme.css, packages/ui/src/styles/tailwind/colors.css
The --surface-list-hover token is removed from three scopes in theme.css (light :root, dark :root[data-color-scheme="dark"], and @media (prefers-color-scheme: dark) first-paint block), and the corresponding Tailwind theme color variable declaration is removed.
Color palette source and dark mode overrides update
packages/ui/script/colors.txt, packages/ui/src/theme/themes/pawwork.json
The base UI color palette is updated to remove --surface-list-hover and adjust foreground, border, and icon token values; the PawWork theme's dark-mode overrides are updated to remove the --surface-list-hover override.
Send button tokenization
packages/app/src/components/prompt-input/send-button.tsx
The SendButton inline styles now use CSS design tokens (var(...)) for background and icon color instead of hardcoded/conditional colors.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

  • #709 — The dark-mode token updates in earlier work touched similar --surface-* / --border-* / --fg-* variables; this PR applies analogous collapses and removals in the light palette.

Possibly related PRs

  • Astro-Han/pawwork#834 — Introduced the dark-mode token pattern and related removals/recalibrations that this PR mirrors for light mode.
  • Astro-Han/pawwork#198 — Previously adjusted desktop-shell theming and related token shapes that overlap with the current shell updates.
  • Astro-Han/pawwork#217 — Related work on tokenizing prompt input/send-button styling.

Suggested labels

platform

🐰 I hopped through tokens, tidy and bright,
Collapsed the hues to make things right.
Surface-hover waved goodbye with cheer,
Shell frames shimmer, icons clear —
A sprightly patch, now light and spry.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately summarizes the main changes: refactoring the light UI theme by collapsing the surface system and removing the shell gradient, matching the primary objectives.
Linked Issues check ✅ Passed The PR implementation aligns with issue #840 objectives: light theme tokens collapsed from 4→2 ink tiers and 3→1 border tier, --surface-list-hover removed, shell gradient dropped, and snap verification completed as required.
Out of Scope Changes check ✅ Passed All file changes (index.css, theme.css, colors.txt, colors.css, pawwork.json, send-button.tsx) directly support the two core objectives: dropping the shell gradient and collapsing light theme tokens. The send-button.tsx fix addresses a direct consequence of token merges, making it in-scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The pull request description follows the required template structure with all essential sections completed: Summary clearly describes the three surface system changes; Why explains the pixel-sampled off-spec issue and token drift; Related Issue links #840; Human Review Status is set to Pending; Review Focus identifies key files and changes for reviewers; Risk Notes document visual impact and dead token removal; How To Verify provides specific verification steps with expected outcomes; Screenshots are included for visible UI changes; and the Checklist is substantially complete with 11 of 12 items ticked (the single unticked conditional item is appropriately explained).

✏️ 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 claude/i840-light-collapse

Warning

Review ran into problems

🔥 Problems

Stopped waiting for pipeline failures after 30000ms. One of your pipelines takes longer than our 30000ms fetch window to run, so review may not consider pipeline-failure results for inline comments if any failures occurred after the fetch window. Increase the timeout if you want to wait longer or run a @coderabbit review after the pipeline has finished.


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 added app Application behavior and product flows ui Design system and user interface P2 Medium priority labels May 21, 2026

@github-actions github-actions 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.

Suggested priority: P2 (includes user-path files (packages/app/src/index.css)).

P1/P0 are reserved for maintainer confirmation. Please relabel manually if this is a release blocker, security issue, data-loss risk, or updater/runtime failure.

@Astro-Han Astro-Han added the enhancement New feature or request label May 21, 2026

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request streamlines the application's theme system by collapsing color tiers for ink, borders, and icons, and removing the surface-list-hover token across multiple configuration files. It also removes the background painting from the desktop shell to prevent visual artifacts in transparent regions. A review comment identifies a typo in a CSS comment where --background-base should be corrected to --bg-base to ensure semantic consistency with the actual theme tokens.

Comment thread packages/app/src/index.css
@github-actions

github-actions Bot commented May 22, 2026

Copy link
Copy Markdown

Perf delta summary

Comparator: pass

Profile / Scenario interaction median interaction worst long task max tbt frame gap p95 frame gap max jank count cls status
default / homepage-cold 32 -> 32 (0) 56 -> 32 (-24) 68 -> 64 (-4) 18 -> 14 (-4) 33.3 -> 16.8 (-16.5) 100 -> 116.7 (+16.7) 3 -> 4 (+1) 0 -> 0 (0) pass
default / long-session-input-lag 48 -> 48 (0) 56 -> 64 (+8) 0 -> 0 (0) 0 -> 0 (0) 16.7 -> 16.7 (0) 16.8 -> 16.8 (0) 0 -> 0 (0) 0 -> 0 (0) pass
default / session-streaming-long 48 -> 48 (0) 56 -> 72 (+16) 0 -> 0 (0) 0 -> 0 (0) 16.8 -> 16.8 (0) 16.8 -> 16.8 (0) 0 -> 0 (0) 0 -> 0 (0) pass
default / tool-call-expand 16 -> 24 (+8) 16 -> 40 (+24) 0 -> 0 (0) 0 -> 0 (0) 16.8 -> 16.8 (0) 16.8 -> 16.8 (0) 0 -> 0 (0) 0 -> 0 (0) pass
default / tool-default-open-heavy-bash 24 -> 16 (-8) 32 -> 32 (0) 62 -> 66 (+4) 12 -> 26 (+14) 33.4 -> 50 (+16.6) 100 -> 116.7 (+16.7) 3 -> 2 (-1) 0 -> 0 (0) pass
default / terminal-side-panel-open 48 -> 48 (0) 48 -> 56 (+8) 0 -> 0 (0) 0 -> 0 (0) 33.3 -> 33.3 (0) 33.3 -> 33.4 (+0.1) 0 -> 0 (0) 0 -> 0 (0) pass
default / session-scroll-reading 32 -> 24 (-8) 40 -> 32 (-8) 0 -> 0 (0) 0 -> 0 (0) 33.3 -> 33.3 (0) 33.3 -> 33.3 (0) 0 -> 0 (0) 0 -> 0 (0) pass

Icon color was conditional on disabled state (white when active, fg-weak
when disabled). After the light surface collapse merged --icon-weak and
--fg-weak to the same #8c817a, the disabled-state arrow rendered the
same color as its own background, becoming invisible.

Preview source (docs/design/preview/composer.html L264-273) locks the
icon at var(--bg-base) unconditionally and uses var(--brand-primary) /
var(--fg-strong) for enabled / stopping backgrounds. Drop the
conditional icon color and the hardcoded #1A1613 / --button-brand-base
literals so the runtime matches the preview spec across all three
states.
@Astro-Han

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 22, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Astro-Han Astro-Han merged commit 0834d86 into dev May 22, 2026
30 checks passed
@Astro-Han Astro-Han deleted the claude/i840-light-collapse branch May 22, 2026 08:13
Astro-Han added a commit that referenced this pull request May 22, 2026
# Conflicts:
#	packages/opencode/src/session/compaction.ts
Astro-Han added a commit that referenced this pull request May 22, 2026
…845)

## Summary

Restore the 1px hairline between the sidebar column and the thread column, and unify the dark hairline alpha to match light. After the surface collapses in #834 and #841, both themes lost a visible boundary at the sidebar↔thread seam: dark sidebar and canvas resolve to the same `#1A1917`, and light's 6-unit brightness gap reads as "panels glued together" without a hairline.

Two changes:

1. Add `border-r border-border-weaker` to the sidebar `<aside>` in `packages/app/src/pages/layout.tsx`. The class swaps via the existing `:root[data-color-scheme="dark"]` rule, no Tailwind `dark:` variant needed.
2. Unify dark `--border-base / --border-weak / --border-weaker` from `rgba(255,255,255,0.06)` to `rgba(255,255,255,0.08)`. Light side stays at `rgba(0,0,0,0.08)`; both themes now resolve to alpha 0.08, mirroring the same intent on both sides.

A new `theme-parity` test locks the value in all three theme blocks (`:root`, `:root[data-color-scheme="dark"]`, `@media (prefers-color-scheme: dark)`) so a silent rollback fails CI.

## Why

`docs/DESIGN.md` L226/L228 already specifies "internal divisions use 1px `--border-weaker`" and "the 1px hairline between columns is the only divider — no color contrast". The spec was correct; the code never rendered the `border-right` on the sidebar. Direct user report after #841: "侧边会话栏和会话流黏在一起,看不清了" — both themes confirmed in side-by-side preview.

On the alpha unification: 0.06 (dark) vs 0.08 (light) was a perceptual-asymmetry argument that does not hold up at this scale — the two values are visually indistinguishable in a real side-by-side. Keeping two numbers when one suffices is unjustified drift, and the bumped dark value carries the divider role better in the one place where the alpha is the *only* boundary signal.

## Related Issue

No tracking issue. Reported direct, fixed direct.

## Human Review Status

Pending

## Review Focus

- `packages/ui/src/styles/theme.css` L300-307 and L445-447 — dark border alpha bump. Affects every dark border in the app (tool cards, popovers, code fences, button ghosts), not just the sidebar divider. Snap diff against current dev shows they read slightly more defined and stay calm.
- `packages/ui/src/theme/themes/pawwork.json` L148-150 — dark border alpha bump mirrored in the theme JSON registration path.
- `packages/app/src/pages/layout.tsx` L2486 — the only callsite change. Adding `border-r border-border-weaker` to the sidebar `<aside>`; the resize handle and main pane geometry are untouched.
- `packages/ui/test/theme-parity.test.ts` — new describe block locks both themes at 0.08 across all three theme blocks.
- `packages/app/e2e/snap/sidebar-divider.snap.ts` — new focused snap as a human-eye preview anchor, not a regression gate. The test only writes the PNG and asserts the buffer is non-empty; token-level regressions are caught by `theme-parity`. App-shell covers the full composition; this one zooms in on the 80px window straddling the seam so reviewers can see the hairline. Crop is anchored to the sidebar bounding box (y/height from `box.y` / `box.height`) so the titlebar above the sidebar does not leak into the frame.

## Risk Notes

- **Dark border bump is global.** Every dark `border-border-*` callsite reads ~33% stronger (0.06 → 0.08 white alpha). Verified in three snap grids: `app-shell` (full shell stack), `sidebar` (popover and sort menu borders), `session-turn-changes` (tool card and diff card borders). All read cleaner, none read "hard".
- **DESIGN.md L194 / L228 numeric prose is now stale.** `docs/DESIGN.md` is local-only in this checkout per AGENTS.md ("`docs/` are local-only in this checkout and excluded via `.git/info/exclude`"), so no in-PR doc edit; the maintainer will sync the prose after merge as part of normal doc upkeep.
- **No platform / packaging surface touched.** Pure CSS tokens + one className. Electron native window background path is unchanged.

## How To Verify

```text
cd packages/ui && bun test theme-parity      — 200 pass / 403 expects (includes new lock)
cd packages/app && bun test shell-frame-contract — 9 pass / 95 expects (unchanged)
bun --cwd packages/ui run typecheck           — clean
bun --cwd packages/app run typecheck          — clean
bun --cwd packages/opencode run typecheck     — clean
bun run snap app-shell sidebar session-turn-changes sidebar-divider — 4 grids regenerated, divider visible both themes, no surface regressions
```

## Screenshots or Recordings

`docs/design/preview/screenshots/sidebar-divider.png` — focused crop of the new hairline in both themes.

`docs/design/preview/screenshots/app-shell.png` — full shell composition, divider visible at the sidebar right edge in both themes.

`docs/design/preview/screenshots/session-turn-changes.png` — tool / diff cards in dark with the bumped 0.08 border, still calm.

## Checklist

- [x] **Type label** — this PR carries exactly one of `bug`, `enhancement`, `task`, `documentation`. Type labels are author-added; the labeler bot does NOT assign them. Add the label in the GitHub UI, then tick this.
- [x] **Routing labels** — this PR carries at least one of `app`, `ui`, `platform`, `harness`, `ci`. The labeler bot assigns these on PR open based on changed paths. Confirm the bot's choice (or override if wrong), then tick this.
- [x] **Priority label** — this PR carries exactly one of `P0`, `P1`, `P2`, `P3`. The priority-triage bot suggests one on PR open. Confirm or override, then tick this.
- [x] Human Review Status above is set to `Pending`, `Approved by @<reviewer>`, or `Not required: <reason>` (default is `Pending`; "not required" is restricted to bot-authored low-risk PRs).
- [x] I linked the related issue, or stated in Summary why there is no issue.
- [x] I described the review focus and any meaningful risks.
- [x] I replaced the example block in How To Verify with the real verification steps and the key result for each.
- [x] I did not introduce unrelated refactors, dependencies, generated files, or file changes beyond the stated scope.
- [x] **(conditional)** I manually checked visible UI or copy changes when needed, with screenshots or recordings. Leave unticked only if no visible UI or copy changed.
- [ ] **(conditional)** I considered macOS and Windows impact for platform, packaging, updater, signing, paths, shell, or permissions changes. Leave unticked only if no platform/packaging surface was touched.
- [x] **(conditional)** I called out docs, release notes, dependencies, permissions, credentials, deletion behavior, generated content, or local file changes when relevant. Leave unticked only if none of those surfaces was touched.
- [x] I reviewed the final diff for unrelated changes and suspicious dependency changes.
- [x] I am targeting `dev`, and my PR title and commit messages use Conventional Commits in English.


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

* **New Features**
  * Added a visible border divider between the sidebar and main content area.

* **Style**
  * Enhanced border visibility in dark mode with improved opacity.

* **Tests**
  * Added snapshot tests for sidebar divider appearance across light and dark themes.
  * Added tests to ensure border token consistency across theme definitions.

<!-- review_stack_entry_start -->

[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/Astro-Han/pawwork/pull/845?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app Application behavior and product flows enhancement New feature or request P2 Medium priority ui Design system and user interface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Collapse light theme surface system to match dark

1 participant