Skip to content

feat(webapp): Themes + contrast settings update#4206

Open
kathiekiwi wants to merge 93 commits into
feat/queue-metrics-and-healthfrom
feat/light-theme
Open

feat(webapp): Themes + contrast settings update#4206
kathiekiwi wants to merge 93 commits into
feat/queue-metrics-and-healthfrom
feat/light-theme

Conversation

@kathiekiwi

@kathiekiwi kathiekiwi commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Adds System Preferences, Dark and Light themes, gated by the hasThemeSwitcher feature flag (off by default — dark stays the default theme for everyone).

Old theme is now "Classic"and set as default.
"System preferences" theme has both Light and Dark modes and uses your laptop settings to use a correct one.
It has less color accents (specifically less colored text), and they are the same for both modes, only grayscale values change between them. And Light/Dark themes can be used separately.

New Contrast setting is available for System Preferences, Dark and Light themes - it changes the contrast for the whole app. All new visual Settings live in Account.

Screenshot 2026-07-23 at 22 34 17 Screenshot 2026-07-23 at 22 38 13

Light theme with 0 -> 100 Contrast

Screenshot 2026-07-23 at 22 42 35 Screenshot 2026-07-23 at 22 42 17

Dark theme with 0 -> 100 Contrast

Screenshot 2026-07-23 at 22 43 06 Screenshot 2026-07-23 at 22 42 00

@changeset-bot

changeset-bot Bot commented Jul 9, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b0484e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 27 packages
Name Type
@trigger.dev/sdk Patch
@trigger.dev/python Patch
@internal/dashboard-agent Patch
@internal/sdk-compat-tests Patch
@trigger.dev/build Patch
@trigger.dev/core Patch
@trigger.dev/react-hooks Patch
@trigger.dev/redis-worker Patch
@trigger.dev/rsc Patch
@trigger.dev/schema-to-json Patch
@trigger.dev/database Patch
@trigger.dev/otlp-importer Patch
@trigger.dev/rbac Patch
@trigger.dev/sso Patch
trigger.dev Patch
@internal/cache Patch
@internal/clickhouse Patch
@internal/llm-model-catalog Patch
@internal/metrics-pipeline Patch
@internal/redis Patch
@internal/replication Patch
@internal/run-engine Patch
@internal/run-store Patch
@internal/schedule-engine Patch
@internal/testcontainers Patch
@internal/tracing Patch
@internal/tsql Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 205629f1-fcbd-4c5b-a95f-54eff81b23aa

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description is missing the required template sections like Closes #, checklist, Testing, Changelog, and Screenshots headings. Rewrite the PR description to match the repository template and add Closes #, checklist items, Testing steps, Changelog, and a Screenshots section.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and clearly points to the theme-related UI update, which matches the main change set.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/light-theme

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.

@samejr samejr added the preview label Jul 9, 2026
@trigger-dot-bot

trigger-dot-bot Bot commented Jul 9, 2026

Copy link
Copy Markdown

Preview Deployment

Status Preview Commit Updated
🟢 Ready feat-light-theme.triggerlabs.dev 6b0484e Jul 27, 08:02 UTC

@pkg-pr-new

pkg-pr-new Bot commented Jul 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@trigger.dev/build

npm i https://pkg.pr.new/@trigger.dev/build@41bd30c

trigger.dev

npm i https://pkg.pr.new/trigger.dev@41bd30c

@trigger.dev/core

npm i https://pkg.pr.new/@trigger.dev/core@41bd30c

@trigger.dev/python

npm i https://pkg.pr.new/@trigger.dev/python@41bd30c

@trigger.dev/react-hooks

npm i https://pkg.pr.new/@trigger.dev/react-hooks@41bd30c

@trigger.dev/redis-worker

npm i https://pkg.pr.new/@trigger.dev/redis-worker@41bd30c

@trigger.dev/rsc

npm i https://pkg.pr.new/@trigger.dev/rsc@41bd30c

@trigger.dev/schema-to-json

npm i https://pkg.pr.new/@trigger.dev/schema-to-json@41bd30c

@trigger.dev/sdk

npm i https://pkg.pr.new/@trigger.dev/sdk@41bd30c

commit: 41bd30c

coderabbitai[bot]

This comment was marked as resolved.

@kathiekiwi
kathiekiwi marked this pull request as ready for review July 11, 2026 22:04
devin-ai-integration[bot]

This comment was marked as resolved.

Workspace packages resolve to TS source via the @triggerdotdev/source
condition; server.ts keeps the Express/cluster/ws wiring with vite
middleware in dev and the ESM server bundle in prod. Fixes surfaced by
the stricter ESM pipeline: destructured route exports, server-only
imports in routes/components, CJS interop (redlock, cuid, regression),
browser node-global shims, font asset handling, and a websockets TDZ.
Restores the unit-testable export (removed to satisfy the Vite route
export rules) by extracting the helper out of the route file.
createActionApiRoute's loader handles CORS OPTIONS preflight; the
destructured exports never surfaced it (pre-existing), do it now.
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

- semantic token overrides for light, trigger.light editor/code palettes
- Interface theme dropdown on /account, gated by hasThemeSwitcher flag
- unify light surfaces: buttons, inputs, radios, checkboxes, tabs, clipboard fields
- fix checkbox :read-only override and useThemeColor hydration mismatch
- resolve Firefox panel animation check from request UA
- re-resolve theme colors when data-theme changes
- narrow jsonb_set write for theme preference
- opaque amber for reasoning text in light mode
- keep dark-theme switch/radio thumb colors, white only in light
- pick avatar letter color by background luminance
- seed required preference fields when jsonb column is null
devin-ai-integration[bot]

This comment was marked as resolved.

…billing

- white query editor and apikeys accordion surfaces
- white Cancel and Contact us buttons
- drop the doubled hover ring on the regions suggest button
- route the section-header menu through the shared ellipsis primitive
Base automatically changed from chore/vite-migration to main July 21, 2026 13:57
devin-ai-integration[bot]

This comment was marked as resolved.

Backgrounds deepen (dark) or lift (light), surfaces and all border steps
strengthen, text weights increase - task names and dimmed labels now respond
visibly to the slider in both modes.
Whites can't get whiter: dimmed/faint text goes near-black, borders and
controls darken hard, deep surfaces dip slightly for panel separation.
Shared contrast-chip marker on error/health/pill/source/connection chips
and subtle badges; a contrast+saturate filter driven by --theme-contrast
separates the tint and its colored text.
…eference

React skips the data-theme write when its virtual DOM already matched the
SSR fallback while the inline script had flipped the real attribute; the
sync hook now writes pinned themes explicitly.
@kathiekiwi kathiekiwi changed the title feat(webapp): light theme feat(webapp): Themes + contrast settings update Jul 23, 2026
@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

🧭 Helm Chart Prerelease Published

Version: 4.5.7-pr4206.33a5415

Install:

helm upgrade --install trigger \
  oci://ghcr.io/triggerdotdev/charts/trigger \
  --version "4.5.7-pr4206.33a5415"

⚠️ This is a prerelease for testing. Do not use in production.

Login, invites and other anonymous pages resolve the System preference
when the theme switcher flag is on; Classic stays the flag-off default.
The invites heading goes monochrome in System themes.
coderabbitai[bot]

This comment was marked as resolved.

The new-org background is built from dark-dashboard screenshots (plus a
hardcoded near-black fill); the light theme falls back to a flat surface.
Light variants generated from the dark screenshots by inverting lightness
(hues survive, so the accent smudges stay true); optimized progressive
JPEGs at a fraction of the original size.
Error boundary backdrop, prompt override editor pane, AI filter error
popover and chart-zoom tooltip get light: styling; standalone white
spinners go blue; bulk-action onboarding, blank-state and queues-upgrade
screenshots ship light variants (lightness-inverted, optimized).
# Conflicts:
#	apps/webapp/app/routes/account._index/route.tsx
Missing or legacy preferences resolve to the pinned Dark theme (not
system-resolved, so nobody is surprised by light mode) and the default
contrast is 50. Classic remains the flag-off look.

@devin-ai-integration devin-ai-integration Bot 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.

Devin Review found 1 new potential issue.

Open in Devin Review

Comment on lines +11 to +14
export function normalizeThemePreference(value: unknown): ThemePreference {
const result = ThemePreference.safeParse(value);
return result.success ? result.data : "dark";
}

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.

🔍 Theme default (dark) applies app-wide when flag defaults on

With hasThemeSwitcher defaulting on (see reported bug), a user who never picked a theme resolves to normalizeThemePreference(undefined) which returns "dark" (apps/webapp/app/utils/themePreference.ts:11-14), not "classic". So the practical consequence of the flag inversion is that the entire app renders the NEW Dark theme rather than the legacy Classic look for everyone. If the maintainers actually intend the switcher to ship on, they should confirm the new Dark theme (not Classic) is the desired global default, since that is what will happen.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

# Conflicts:
#	apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx
#	apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants