Files
multica/apps/mobile/global.css
Naiyuan Qing dbb8c0ade0 refactor(mobile): 5-tier surface elevation scale — fixes comment-bubble nested contrast + inline-code link confusion
Two related fixes that share root cause: shadcn's neutral palette
collapses `secondary` / `muted` / `accent` to the SAME L 96.1% value
intentionally — it's a single tonal slot whose semantic name varies by
use case, not three different colors. Stacking a bg-muted child on a
bg-secondary parent (which is what we were doing for code/table headers
inside the comment bubble) made the inner element visually disappear.

Introduce a proper 5-tier elevation scale calibrated to Refactoring UI
and Material 3 guidance:

  L 100   page bg / card / popover            (page floor)
  L 98    surface-1   NEW                     (subtle elevated — comment
                                               bubbles, iOS settings-cell
                                               feel: visible boundary
                                               via radius + border, fill
                                               is almost-page)
  L 96.1  secondary / muted / accent          (shadcn default, untouched —
                                               button hover, chips, skeleton)
  L 90    surface-2   NEW                     (nested inside surface-1 —
                                               table headers + code blocks
                                               inside comment bubbles, 8% L
                                               step over surface-1)
  L 84    border      (was 89.8% → 84%)       (visible across every tier,
                                               6-16% darker than adjacent
                                               surface, within Refactoring
                                               UI's 5-10% guideline)

Dark mirror flips the lightness direction (higher elevation = lighter):
page 3.9 → surface-1 8 → secondary 14.9 → surface-2 19 → border 25.

Applied across three files:

  - global.css + tailwind.config.js + lib/theme.ts mirror the new tokens
    (CSS variables, Tailwind class map, TypeScript export — they must
    stay in sync per CLAUDE.md §5).

  - components/issue/comment-card.tsx switches the bubble bg from
    `bg-secondary` (too prominent, same color as inner muted elements)
    to `bg-surface-1` (subtle, 8% lighter than inner surface-2).

  - lib/markdown/markdown-style.ts:
      - table.headerBackgroundColor + codeBlock.backgroundColor:
        `t.muted` → `t.surface2`, so they're framed against the bubble.
      - inline `code:`: REVERT 2026-05-19's `color: t.brand` workaround
        for upstream enriched-markdown #255. The brand-tint avoided the
        chip's top-heavy padding artifact but broke Refactoring UI's #1
        rule (color carries semantic meaning — brand IS the link color,
        users reported tapping inline code thinking it was a link).
        Re-enable bg-chip + foreground text, matching GitHub mobile /
        Slack / Notion / Apple Notes. The padding artifact is the lesser
        evil; in surface-2 (L 90%) on surface-1 (L 98%) the chip is
        subtle enough that the few pixels of asymmetry are unobtrusive.

The shadcn `secondary` / `muted` / `accent` tokens stay at L 96.1%
unchanged — other call sites (button hover, skeleton, avatar fallback,
chips) all work fine on their own and were never the problem.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:32:41 +08:00

143 lines
5.6 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
/*
* Theme tokens — RNR template (verbatim) + Multica custom tokens appended.
*
* When changing any variable here, also update apps/mobile/lib/theme.ts —
* they mirror each other. See apps/mobile/docs/rnr-migration.md §5.
*
* Dark-mode values for the Multica custom tokens currently mirror their
* light values — they will be tuned when a screen using them actually
* needs dark-mode treatment. Don't pre-author (per §3.1 "defaults first").
*/
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 0 0% 3.9%;
--card: 0 0% 100%;
--card-foreground: 0 0% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 0 0% 3.9%;
--primary: 0 0% 9%;
--primary-foreground: 0 0% 98%;
--secondary: 0 0% 96.1%;
--secondary-foreground: 0 0% 9%;
--muted: 0 0% 96.1%;
--muted-foreground: 0 0% 45.1%;
--accent: 0 0% 96.1%;
--accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
/* Border tuned to L 84% — gives a 6% darker step from surface-2 (the
* darkest elevated tier above page) and 16% from page, so borders are
* visible across every tier in the elevation scale (surface-1 / -2 /
* secondary). Within Refactoring UI's "border 5-10% darker than
* adjacent surface" guidance. */
--border: 0 0% 84%;
--input: 0 0% 84%;
--ring: 0 0% 63%;
--radius: 0.625rem;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
/* Multica custom tokens */
--brand: 225 71% 58%;
--brand-foreground: 0 0% 98%;
--success: 142 71% 45%;
--warning: 48 89% 47%;
--info: 217 91% 60%;
--priority: 25 95% 53%;
--code-surface: 240 4% 92%;
/* Surface elevation scale — a 5-tier ladder above page bg, calibrated
* to Refactoring UI's "≥5% L difference is the perceptibility threshold"
* + Material 3 surface-container scale. shadcn's `secondary` /
* `muted` / `accent` slot (L 96.1%) stays untouched; we sandwich
* `surface-1` above it and `surface-2` below for cases shadcn doesn't
* cover (notably nested elevated cards like comment bubbles + their
* internal code/table elements).
*
* L 100 page bg / card / popover (page floor)
* L 98 surface-1 subtle elevated (comment bubble — feels
* like an iOS settings cell:
* visible boundary but the
* fill is almost-page)
* L 96.1 secondary / muted / accent (shadcn default — button
* hover, chips, skeleton)
* L 90 surface-2 nested in surface-1 (code block / table header
* inside a comment bubble —
* 8% darker than the bubble
* so the inner box is
* clearly delineated)
* L 84 border (visible across all tiers)
*
* Future tiers extend as surface-3 etc. Dark mode mirrors this scale
* inverted (lighter = higher elevation), see .dark:root below. */
--surface-1: 0 0% 98%;
--surface-2: 0 0% 90%;
}
.dark:root {
--background: 0 0% 3.9%;
--foreground: 0 0% 98%;
--card: 0 0% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 0 0% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 0 0% 9%;
--secondary: 0 0% 14.9%;
--secondary-foreground: 0 0% 98%;
--muted: 0 0% 14.9%;
--muted-foreground: 0 0% 63.9%;
--accent: 0 0% 14.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 70.9% 59.4%;
--destructive-foreground: 0 0% 98%;
/* Border at L 25% — mirrors the light-mode logic: 6% lighter than
* surface-2 (the topmost elevated tier), 21% lighter than page (3.9%).
* Visible across every tier of the dark elevation scale. */
--border: 0 0% 25%;
--input: 0 0% 25%;
--ring: 300 0% 45%;
--chart-1: 220 70% 50%;
--chart-2: 160 60% 45%;
--chart-3: 30 80% 55%;
--chart-4: 280 65% 60%;
--chart-5: 340 75% 55%;
/* Multica custom tokens — dark mirrors light until a screen demands tuning */
--brand: 225 71% 58%;
--brand-foreground: 0 0% 98%;
--success: 142 71% 45%;
--warning: 48 89% 47%;
--info: 217 91% 60%;
--priority: 25 95% 53%;
/* code-surface is the ONE exception that needs a real dark value —
* the light value (240 4% 92%) is near-white and would render code
* blocks with a brighter background than the page in dark mode. */
--code-surface: 240 4% 18%;
/* Dark elevation scale — mirrors the light scale but lightness
* INCREASES with elevation (shadows don't read on dark, so tonal
* lift is the elevation cue). Comment bubble uses surface-1 (L 8%);
* nested code/table inside the bubble uses surface-2 (L 19%, 11%
* lighter than the bubble — well over Refactoring UI's 5% threshold).
*
* L 3.9 page bg / card / popover
* L 8 surface-1 subtle elevated (comment bubble)
* L 14.9 secondary / muted / accent (shadcn default)
* L 19 surface-2 nested in surface-1 (code/table inside bubble)
* L 25 border (visible across all tiers)
*/
--surface-1: 0 0% 8%;
--surface-2: 0 0% 19%;
}
}