Conversation
Surface: the mobile app (apps/mobile). fix(mobile): stop theme-token opacity modifiers from silently dropping ## Problem The repo documents that Tailwind's `/opacity` modifier does not work on the CSS-variable theme colors. `apps/mobile/src/global.css` (lines 5-9 and 55-58) says the `/opacity` modifier 'still does NOT work with these CSS-variable tokens' and ships pre-baked alpha pairs for that reason; `apps/mobile/AGENTS.md` states 'Opacity modifiers do not work on theme colors (CSS variables): `bg-destructive/10` fails.' NativeWind v5 cannot decompose the variables, so the declaration is dropped and the element paints nothing, with no build error or warning. The repo already provides the fix tokens (`--danger-tile-bg` / `--danger-tile-border`, mapped to `bg-danger-tile-bg` / `border-danger-tile-border`), and `tools/nativewind/check-classes.mjs` exists to catch 'patterns that go wrong in a way nothing else reports' and runs in `.github/workflows/kilo-app-ci.yml`, but it has no rule for theme-token opacity, so instances survived and regressed (see commits 0921e4f, 8244809, 3a811fc). ## Evidence - `apps/mobile/src/components/agents/permission-card.tsx:113` - `<View className="border-b border-border bg-destructive/10 px-4 py-2">`: the permission-error banner renders with no destructive tint. - `apps/mobile/src/components/agents/question-card.tsx:210` - the same `bg-destructive/10` banner for question-submit errors. - `apps/mobile/src/components/agents/attachment-previe
Contributor
Code Review SummaryStatus: 1 Issue Found | Recommendation: Address before merge Executive SummaryThe three Overview
Issue Details (click to expand)WARNING
Files Reviewed (5 files)
Fix these issues in Kilo Cloud Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
iscekic
marked this pull request as draft
September 19, 2026 06:09
iscekic
marked this pull request as ready for review
September 19, 2026 06:37
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changelog for users
Changelog for maintainers
apps/mobile/src/components/agents/permission-card.tsx:113— accepted:bg-destructive/10was dropped on the CSS-variable token and painted no tint; nowbg-danger-tile-bg.apps/mobile/src/components/agents/question-card.tsx:210— accepted: the question-submit banner had the same dropped tint; nowbg-danger-tile-bg.apps/mobile/src/components/agents/attachment-preview-strip.tsx:386— accepted: an errored non-retryable chip fell back toborder-border; nowborder-danger-tile-border, while the retryable case keeps fullborder-destructive./opacitymodifier on the CSS-variable theme tokens (background, foreground, card, popover, primary, secondary, muted, muted-soft, accent, accent-soft, destructive, border, input, ring, ink2, good, warn, info, danger, agent-*) and advises the paired*-tile-bg/*-tile-bordertoken or a concrete colour.neutral-500/20alone, and the separate*-black/<alpha>ban is unchanged.checkCompilerStillDropsThese(): it fails and the rule can be removed oncecolor-mixover an@theme inlinevariable stops deferring.apps/mobile/srcandpackages/app-shared/src, so violations outside the agent components are caught too.pr-review-overview-parts.tsx; no behaviour change.E2E proof
[e6] ux-check: Error strip layout: showing and hiding the permission/question error strip does not move, blank, or jump the card body vs. — android emulator-5606: failing the question submit (nextjs faulted down) shows the strip — e6-question-error.digest 'android.widget.TextView Failed to submit answer. Please try again. tappable [76,1588][1004,1625]' — and the card body is not blanked (question 'Which option should I pick?' [77,1683][1005,1729], Skip [68,2173][534,2288], Retry [552,2173][1013,2288]) vs. the error-free run in e6-question-error-free.digest ('SCENE e6-question-error-free OK'); the same strip+body state is captured in dark in e6-question-error-dark.digest ('SCENE e6-question-error-dark OK'), with screenshots…
[e6] ux-check: Error strip layout: showing and hiding the permission/question error strip does not move, blank, or jump the card body vs.
[e4] ux-check: Failed permission response shows a destructive-tint error strip, light and dark — android emulator-5554: the failed permission response rendered the error strip with copy 'Failed to respond to permission. Please try again.' between the card header and body in light (e4-failed-permission-light.png, e4-failed-permission-light.log) and dark (e4-failed-permission-dark.png, e4-failed-permission-dark.log), with a 'Retry' action; after the injected stall cleared, retry resolved the request ('Show git status in short format tool, completed', 'Working tree is clean.' in e4-recovery.log). Fault injected with fault.sh stall cloudflare-session-ingest --hold 150 (device network verbs…
[e4] ux-check: Failed permission response shows a destructive-tint error strip, light and dark
[e8] ux-check: No false destructive tint on healthy cards and chips — android emulator-5554: healthy permission card (e8-permission-card-light.png, 'Allow Bash?' in e8-permission-card-light.log), healthy question card (e8-question-card.png, 'Agent needs input' in e8-question-card.log) and a healthy non-errored attachment chip (e8-attachment-chip.png, 'e8-attach.png, Uploaded' in e8-attachment-chip.log) all render without error copy; destructive background/border tint is judged by the visual reviewer from these captures.
[e8] ux-check: No false destructive tint on healthy cards and chips
E2E proof — log excerpts
/home/igor_kilocode_ai/.local/share/kwf/sections/janitor-2026-09-19-experience-and-design-74b8/e2e-mobile-app/e1-failed-submit-light.log/home/igor_kilocode_ai/.local/share/kwf/sections/janitor-2026-09-19-experience-and-design-74b8/e2e-mobile-app/e1-theme-light.log/home/igor_kilocode_ai/.local/share/kwf/sections/janitor-2026-09-19-experience-and-design-74b8/e2e-mobile-app/e1-failed-submit-dark.log/home/igor_kilocode_ai/.local/share/kwf/sections/janitor-2026-09-19-experience-and-design-74b8/e2e-mobile-app/e1-theme-dark.log/home/igor_kilocode_ai/.local/share/kwf/sections/janitor-2026-09-19-experience-and-design-74b8/e2e-mobile-app/e1-stall-nextjs-light.logOwner request
[e3] Terminal-error attachment chip renders the tinted destructive border in light and dark themes — android/emulator-5554; the harvested replay (files/replay-e3.json, state session-open) now lands on the committed terminal-error chip and both runs report 'SCENE e3 OK' with digest line 'android.widget.Button report.pdf, This file can't be uploaded.' in e3-scene-light.log and e3-scene-dark.log (dark via KILO_E2E_NIGHT=yes), captures e3-terminal-chip-light.png / e3-terminal-chip-dark.png; the chip's tint colour is the visual reviewer's call, and the plan's demanded 'sanitized log line for the rejected upload' does not exist because the plan itself states there is no live trigger (the picker…
[e3] Terminal-error attachment chip renders the tinted destructive border in light and dark themes
[e6] ux-check: Error strip layout: showing and hiding the permission/question error strip does not move, blank, or jump the card body vs. — android emulator-5606: failing the question submit (nextjs faulted down) shows the strip — e6-question-error.digest 'android.widget.TextView Failed to submit answer. Please try again. tappable [76,1588][1004,1625]' — and the card body is not blanked (question 'Which option should I pick?' [77,1683][1005,1729], Skip [68,2173][534,2288], Retry [552,2173][1013,2288]) vs. the error-free run in e6-question-error-free.digest ('SCENE e6-question-error-free OK'); the same strip+body state is captured in dark in e6-question-error-dark.digest ('SCENE e6-question-error-dark OK'), with screenshots…
[e6] ux-check: Error strip layout: showing and hiding the permission/question error strip does not move, blank, or jump the card body vs.
[e7] ux-check: Attachment chips: an errored non-retryable chip's border reads as red-tinted and clearly distinct from a healthy chip's neutral border, while an errored retryable chip still shows the… — android/emulator-5554; the same composer shows the three branches distinctly in e7-chips.log — 'android.widget.Button report.pdf, This file can't be uploaded.' (terminal, non-retryable: no retry control, only Remove), 'android.widget.Button Retry uploading diagram.png' (errored retryable: retry control present) and 'android.widget.Button notes.txt, Uploaded' (healthy) — so each state is labelled, gives a next action (Retry / Remove / open), and shows no missing feedback, lost work or broken recovery: no UX-DEFECT found; the light-vs-dark red-tint comparison itself is a pixel claim that…
Follow-ups (not changed here)