Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
ba9f6e7
feat(webapp): migrate from the classic Remix compiler to Vite
kathiekiwi Jul 7, 2026
9ae20e5
fix(webapp): move routeOperationsToRun into a server module
kathiekiwi Jul 8, 2026
42244ad
fix(webapp): guard prom metrics registration against vite dev HMR re-…
kathiekiwi Jul 8, 2026
653cb43
fix(webapp): export the builder loader from converted API routes
kathiekiwi Jul 8, 2026
9aadad2
fix(webapp): close vite dev server on shutdown
kathiekiwi Jul 12, 2026
140073d
feat(webapp): add light theme behind feature flag
kathiekiwi Jul 9, 2026
942c2b1
fix(webapp): address light theme review feedback
kathiekiwi Jul 12, 2026
030b9a5
fix(webapp): address light theme review round 2
kathiekiwi Jul 13, 2026
3f1731f
feat(metrics-pipeline): generic Redis-stream to ClickHouse metrics pi…
ericallam Jul 2, 2026
33562f5
feat(clickhouse): queue metrics tables and read queries
ericallam Jul 2, 2026
a3a2434
feat(run-engine): emit queue depth, throughput, and scheduling-delay …
ericallam Jul 2, 2026
c206e12
feat(webapp): queue metrics ingestion, admin controls, and emission s…
ericallam Jul 2, 2026
3581326
feat(tsql): opt-in gap-fill for time-bucketed series
ericallam Jul 2, 2026
2f294d3
feat(webapp): Queues dashboard and per-org metrics UI flag
ericallam Jul 2, 2026
412a385
chore(webapp): add server-changes note for queue metrics
ericallam Jul 2, 2026
7a26ca5
chore: apply oxfmt formatting
ericallam Jul 3, 2026
26e6972
chore: use import type for type-only imports
ericallam Jul 3, 2026
05a01df
fix(tsql): avoid polynomial backtracking in ORDER BY direction strip
ericallam Jul 3, 2026
6846079
fix(tsql): strip ORDER BY direction without a backtracking regex
ericallam Jul 3, 2026
635c9c7
fix(clickhouse): remove semicolons from queue metrics migration comments
ericallam Jul 3, 2026
6d2a357
test(clickhouse): rewrite queue metrics test for cumulative counters
ericallam Jul 3, 2026
5f6b7db
fix(metrics-pipeline): use BigInt order keys and namespaced odometer …
ericallam Jul 3, 2026
b3893a7
fix(clickhouse): filter zero waits from quantile view and accept stri…
ericallam Jul 3, 2026
5139255
fix(webapp): fail open on queue metrics and honor sparkline total ove…
ericallam Jul 3, 2026
9e8a8d7
test(run-engine): import describe from vitest in run-queue metrics test
ericallam Jul 3, 2026
ad3668b
fix(tsql): skip gap-fill on descending bucket order
ericallam Jul 3, 2026
e925979
fix(metrics-pipeline): widen order_key packing factor to 1e6
ericallam Jul 3, 2026
69600b3
feat(webapp,clickhouse): standard time filter for queue metrics pages
ericallam Jul 4, 2026
d4edb4c
fix(tsql): register the deltaSumTimestampMerge aggregate
ericallam Jul 4, 2026
b1dded7
chore(webapp): use shared primitives on the admin queue metrics page
ericallam Jul 4, 2026
5c372a1
feat(webapp): house style hero charts on the queues list
ericallam Jul 4, 2026
9f4f5e9
feat(clickhouse): queue activity ranking queries
ericallam Jul 4, 2026
ea0a4b2
feat(webapp): queue allocation view and relevance-ordered queue list
ericallam Jul 4, 2026
5e04145
fix(tsql): inject time fallbacks into FROM subqueries
ericallam Jul 4, 2026
d527796
feat(clickhouse,tsql): queue metrics rollups and single-scan ranking
ericallam Jul 4, 2026
7c77040
feat(webapp): serve queue metrics reads from rollups and fix env totals
ericallam Jul 4, 2026
5c7f7af
feat(clickhouse,webapp): keep 10-second resolution on the env metrics…
ericallam Jul 4, 2026
9f603ae
fix(webapp): include rollup tables in the queue metrics simulator reset
ericallam Jul 4, 2026
15e0e5f
fix(webapp): update the queue metrics simulator for cumulative counters
ericallam Jul 4, 2026
4be8159
feat(webapp): stage fake Redis usage from the queue metrics simulator
ericallam Jul 4, 2026
9bd77e8
fix(webapp): keep the search filter on the ranked queue list's tail
ericallam Jul 5, 2026
5d0cce5
fix(metrics-pipeline): drop metric emits while the metrics Redis is n…
ericallam Jul 5, 2026
1ed93e7
feat(webapp): remove auto-balance from the allocation view
ericallam Jul 5, 2026
2b866b8
feat(tsql,webapp): reject cross-queue merges of per-queue counter states
ericallam Jul 5, 2026
9c3b077
refactor(clickhouse,webapp): use the stored quantile list in all merg…
ericallam Jul 5, 2026
74f1979
fix(tsql): satisfy the tenant column type in the merge guard test schema
ericallam Jul 5, 2026
b8b4f2e
fix(clickhouse): dedup retried metric batches in the MV target tiers
ericallam Jul 5, 2026
465b361
fix(webapp,metrics-pipeline): review hardening for overflow counters,…
ericallam Jul 5, 2026
fcc27bc
feat(run-engine,clickhouse,webapp): concurrency-key health metrics an…
ericallam Jul 5, 2026
9233032
feat(webapp,run-engine,clickhouse,tsql): per-concurrency-key queue me…
ericallam Jul 5, 2026
046fcda
feat(webapp): move concurrency-key metrics to a tab on the queue deta…
ericallam Jul 5, 2026
c17b1cd
feat(webapp,tsql): hide the per-key metrics table from user-facing qu…
ericallam Jul 5, 2026
b53fbdb
fix(run-engine): anchor scheduling delay to the current queue stint o…
ericallam Jul 5, 2026
9781651
feat(webapp): surface queue metrics on task detail and run inspector
ericallam Jul 5, 2026
61931ab
chore(webapp): remove trailing blank line flagged by oxfmt
ericallam Jul 5, 2026
ddae31f
refactor(webapp): flatten the run inspector queue block and tab the t…
ericallam Jul 6, 2026
b666663
fix(clickhouse): renumber queue-metrics migration to 036 to avoid a v…
ericallam Jul 13, 2026
68a919c
fix(webapp): light theme polish for query, apikeys, alerts, regions, …
kathiekiwi Jul 14, 2026
000ccd1
chore(webapp): default theme switcher on for preview (drop before merge)
kathiekiwi Jul 12, 2026
81274f4
Queue metrics and health UI (#4289)
kathiekiwi Jul 21, 2026
6716463
Merge remote-tracking branch 'origin/main' into feat/queue-metrics-an…
kathiekiwi Jul 21, 2026
c6de9d4
feat(webapp): compact queue status block on waiting runs
kathiekiwi Jul 22, 2026
0dfaec2
fix(webapp): hide queue header charts when there are no queues to chart
kathiekiwi Jul 22, 2026
a7fb3e3
Merge remote-tracking branch 'origin/main' into feat/system-preferenc…
kathiekiwi Jul 22, 2026
0ef9d5b
feat(webapp): add Classic, System preference, Dark and Light interfac…
kathiekiwi Jul 22, 2026
6073943
fix(webapp): move theme preference helper out of the server-only module
kathiekiwi Jul 22, 2026
ceff1c7
fix(webapp): white delete icon on hover in light theme on env vars page
kathiekiwi Jul 22, 2026
69b7274
feat(webapp): unify System preference accents across dark and light m…
kathiekiwi Jul 23, 2026
6513d67
feat(webapp): move staging and preview env colors off orange/yellow i…
kathiekiwi Jul 23, 2026
6357c7d
feat(webapp): blue dev and teal staging env colors in System themes
kathiekiwi Jul 23, 2026
4c12264
feat(webapp): env colors take three - pink dev, orange staging, blue …
kathiekiwi Jul 23, 2026
fbb55b1
feat(webapp): monochrome side menu icons in System themes
kathiekiwi Jul 23, 2026
17f5492
feat(webapp): monochrome section icons on the limits page in System t…
kathiekiwi Jul 23, 2026
9f80186
feat(webapp): env names inherit text color in System themes, icons ke…
kathiekiwi Jul 23, 2026
78ed1e7
feat(webapp): status labels go monochrome in System themes, icons kee…
kathiekiwi Jul 23, 2026
66f79b0
fix(webapp): prompts blank state uses the nav's pen icon
kathiekiwi Jul 23, 2026
dbbe98e
Merge remote-tracking branch 'origin/feat/queue-metrics-and-health' i…
kathiekiwi Jul 23, 2026
c73b4e7
Merge remote-tracking branch 'origin/main' into feat/light-theme
kathiekiwi Jul 23, 2026
950688d
feat(webapp): queue charts go blue in System themes; burst and warnin…
kathiekiwi Jul 23, 2026
ddf3dbb
feat(webapp): filled status chips and badges in System themes; uncolo…
kathiekiwi Jul 23, 2026
0da446c
fix(webapp): sparkline totals readable in System themes
kathiekiwi Jul 23, 2026
d5373e5
fix(webapp): truncate the Model column on the models table
kathiekiwi Jul 23, 2026
69f9c05
fix(webapp): models table tooltip + no scroll; query schema names rea…
kathiekiwi Jul 23, 2026
c39adbb
feat(webapp): filled rate-limit type pills in System themes
kathiekiwi Jul 23, 2026
ee0179f
feat(webapp): docs buttons get a monochrome label in System themes, i…
kathiekiwi Jul 23, 2026
8bbd59a
feat(webapp): filled quota source badges in System themes
kathiekiwi Jul 23, 2026
7948127
fix(webapp): white count on the rounded badge in System themes
kathiekiwi Jul 23, 2026
945d28f
feat(webapp): monochrome run and span titles in System themes
kathiekiwi Jul 23, 2026
11e2770
fix(webapp): prompt override banner readable on the light theme
kathiekiwi Jul 23, 2026
8c75049
feat(webapp): amber-filled override controls and badges in System themes
kathiekiwi Jul 23, 2026
ab83648
fix(webapp): white override button labels; billing banner icon visibl…
kathiekiwi Jul 23, 2026
5e6a6af
feat(webapp): inverted icon buttons on queue live blocks in System th…
kathiekiwi Jul 23, 2026
d226c31
feat(webapp): BigNumber block buttons follow the standard primary hov…
kathiekiwi Jul 23, 2026
b387d5e
feat(webapp): default badges invert to a blue fill with white text in…
kathiekiwi Jul 23, 2026
99a8b08
fix(webapp): no-machine icon visible on the light theme
kathiekiwi Jul 23, 2026
4b6aa4c
fix(webapp): burst-runs suffix reliably uncolored in System themes
kathiekiwi Jul 23, 2026
188a211
feat(webapp): inverted number stepper buttons in System themes
kathiekiwi Jul 23, 2026
b1974e0
feat(webapp): filled error status chips in System themes
kathiekiwi Jul 23, 2026
68340d8
feat(webapp): settings logo globe icon; System-theme fixes for date g…
kathiekiwi Jul 23, 2026
0ab6217
feat(webapp): replace the wireframe globe icon with GlobeLinesIcon ap…
kathiekiwi Jul 23, 2026
4b56625
fix(webapp): untangle globe icon imports
kathiekiwi Jul 23, 2026
4e774a9
feat(webapp): two chip prominence levels - subtle in dense lists, bri…
kathiekiwi Jul 23, 2026
374b2e7
feat(webapp): subtle badges get a blue tint in System themes
kathiekiwi Jul 23, 2026
a38b1a7
feat(webapp): subtle badges try a colored border with monochrome text…
kathiekiwi Jul 23, 2026
bb38a1b
feat(webapp): lighter fills on queue live-block buttons
kathiekiwi Jul 23, 2026
d22221c
fix(webapp): keep the billing banner button on the darker amber
kathiekiwi Jul 23, 2026
c1ab98f
feat(webapp): error status chips use colored border with monochrome t…
kathiekiwi Jul 23, 2026
db3ca46
feat(webapp): live-block buttons follow the semantic accent tokens
kathiekiwi Jul 23, 2026
632bc23
feat(webapp): list chips settle on tinted background with colored text
kathiekiwi Jul 23, 2026
a1b8310
feat(webapp): all filled buttons use semantic accent tokens
kathiekiwi Jul 23, 2026
81b45cf
feat(webapp): drop the timeline label shadow in System themes
kathiekiwi Jul 23, 2026
80321c1
fix(webapp): filled buttons keep their fill on hover and darken
kathiekiwi Jul 23, 2026
44ab5b0
feat(webapp): queue health chips match the error status chip style an…
kathiekiwi Jul 23, 2026
5bc364b
feat(webapp): limits pills and source badges match the errors chip style
kathiekiwi Jul 23, 2026
819420b
feat(webapp): quota source badges join the tinted chip style
kathiekiwi Jul 23, 2026
7b03086
feat(webapp): centered add-connection button; secondary Remove on pro…
kathiekiwi Jul 23, 2026
9b6424e
feat(webapp): prompt override Remove becomes an outlined secondary bu…
kathiekiwi Jul 23, 2026
38ad170
fix(webapp): query editor toolbar sits on white in the light theme
kathiekiwi Jul 23, 2026
91f98a1
fix(webapp): private connection chips match the default style; white …
kathiekiwi Jul 23, 2026
3e7d5e3
fix(webapp): transparent query toolbar background on light
kathiekiwi Jul 23, 2026
ff1b3de
feat(webapp): lighter grey chart reference series in System themes
kathiekiwi Jul 23, 2026
0689066
feat(webapp): interface contrast slider for the System themes
kathiekiwi Jul 23, 2026
fc2b65f
feat(webapp): contrast overlay covers the full monochrome scale
kathiekiwi Jul 23, 2026
ffa3b52
fix(webapp): light-mode contrast pushes foregrounds, not backgrounds
kathiekiwi Jul 23, 2026
ae288da
feat(webapp): tinted status chips respond to the contrast control
kathiekiwi Jul 23, 2026
17d1a7c
fix(webapp): chips gain a currentColor ring with contrast instead of …
kathiekiwi Jul 23, 2026
7c548ea
feat(webapp): quiet slider variant for the contrast setting
kathiekiwi Jul 23, 2026
3f3c240
feat(webapp): borderless contrast slider thumb; release note covers t…
kathiekiwi Jul 23, 2026
1db252c
feat(webapp): borderless solid thumb on the contrast slider
kathiekiwi Jul 23, 2026
447a663
feat(webapp): contrast slider thumb matches the switch thumb
kathiekiwi Jul 23, 2026
c376521
fix(webapp): pinned theme applies immediately after leaving system pr…
kathiekiwi Jul 23, 2026
b41d0de
fix(webapp): contrast slider thumb visible on the light track
kathiekiwi Jul 23, 2026
4719b7a
fix(webapp): contrast slider thumb reuses the secondary button shadow
kathiekiwi Jul 23, 2026
2fada02
fix(webapp): stronger contrast slider thumb definition
kathiekiwi Jul 23, 2026
8b64da9
Merge remote-tracking branch 'origin/main' into feat/light-theme
kathiekiwi Jul 23, 2026
48f75c5
feat(webapp): logged-out pages follow the OS appearance
kathiekiwi Jul 23, 2026
b8813ce
fix(webapp): hide the dark dashboard backdrop on the light theme
kathiekiwi Jul 23, 2026
d8ce6d4
fix(webapp): logged-out pages stay on the branded Classic look
kathiekiwi Jul 23, 2026
d52c68a
feat(webapp): light blurred backdrop for the new-organization page
kathiekiwi Jul 23, 2026
62f38ae
feat(webapp): close the light-theme gaps from the final audit
kathiekiwi Jul 23, 2026
27172a1
fix(webapp): error screen keeps the dark animation, text stays readab…
kathiekiwi Jul 23, 2026
62c3d4f
revert(webapp): onboarding screenshots stay dark in every theme
kathiekiwi Jul 23, 2026
33a5415
Merge branch 'feat/system-preference-theme' into feat/light-theme
kathiekiwi Jul 23, 2026
a585dea
Queue metrics & health: UI polish (TRI-12068) (#4354)
samejr Jul 24, 2026
57ceb98
feat(webapp): new Dark theme is the default with a slight contrast bump
kathiekiwi Jul 27, 2026
76e3062
Merge remote-tracking branch 'origin/main' into feat/queue-metrics-an…
kathiekiwi Jul 27, 2026
41bd30c
Merge branch 'feat/queue-metrics-and-health' into feat/light-theme
kathiekiwi Jul 27, 2026
6b0484e
fix(webapp): merge the duplicated pause-button className from the que…
kathiekiwi Jul 27, 2026
92c1992
Merge remote-tracking branch 'origin/main' into feat/light-theme
kathiekiwi Jul 30, 2026
57769c5
chore(webapp): theme switcher back behind the feature flag
kathiekiwi Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/vite-ignore-optional-imports.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---

Annotate the optional `@ai-sdk/otel` dynamic import with `@vite-ignore` so Vite-based bundlers don't warn about an unanalyzable import.
6 changes: 6 additions & 0 deletions .server-changes/light-theme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
area: webapp
type: feature
---

Adds an opt-in Interface theme setting on the account page behind a feature flag. Choose Dark (the new default), System preference (follows your OS), Light, or the original Classic look, and fine-tune the new themes with a contrast slider. System preference switches automatically when your OS appearance changes.

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Keep the release note user-facing.

Remove “behind a feature flag”; this file is published verbatim, so it should describe the available theme behavior rather than an internal rollout mechanism.

Proposed wording
-Adds an opt-in Interface theme setting on the account page behind a feature flag. Choose Dark (the new default), System preference (follows your OS), Light, or the original Classic look, and fine-tune the new themes with a contrast slider. System preference switches automatically when your OS appearance changes.
+Adds Interface theme settings on the account page. Choose Dark, System preference, Light, or Classic, adjust contrast, and have System preference follow your OS appearance automatically.

Based on learnings, .server-changes/*.md entries are published verbatim as user release notes and should avoid implementation-oriented details such as feature flags.

📝 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
Adds an opt-in Interface theme setting on the account page behind a feature flag. Choose Dark (the new default), System preference (follows your OS), Light, or the original Classic look, and fine-tune the new themes with a contrast slider. System preference switches automatically when your OS appearance changes.
Adds Interface theme settings on the account page. Choose Dark, System preference, Light, or Classic, adjust contrast, and have System preference follow your OS appearance automatically.

Source: Learnings

33 changes: 19 additions & 14 deletions apps/webapp/app/assets/icons/MachineIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,33 @@ export function MachineDefaultIcon({ className }: { className?: string }) {

function MachineIconNoMachine({ className }: { className?: string }) {
return (
<svg className={className} viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<svg
className={cn("text-[#D7D9DD] light:text-charcoal-500", className)}
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M16.1875 13C16.6362 13 17 13.3638 17 13.8125V16.1875C17 16.6362 16.6362 17 16.1875 17H6.18945C6.25882 16.9453 6.32663 16.8872 6.39062 16.8232L10.2139 13H16.1875Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<path
d="M4.84961 12H3.8125C3.36377 12 3 11.6362 3 11.1875V8.8125C3 8.36377 3.36377 8 3.8125 8H8.84961L4.84961 12ZM16.1875 8C16.6362 8 17 8.36377 17 8.8125V11.1875C17 11.6362 16.6362 12 16.1875 12H11.2139L15.2139 8H16.1875Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<path
d="M9.85059 7H3.8125C3.36377 7 3 6.63623 3 6.1875V3.8125C3 3.36377 3.36377 3 3.8125 3H13.8506L9.85059 7Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<line
x1="3"
y1="16.9998"
x2="17.0018"
y2="2.99805"
stroke="#D7D9DD"
stroke="currentColor"
strokeOpacity="0.4"
strokeWidth="2"
strokeLinecap="round"
Expand All @@ -83,17 +88,17 @@ function MachineIconMicro({ className }: { className?: string }) {
<svg className={className} viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M16.1875 13C16.6362 13 17 13.3638 17 13.8125V16.1875C17 16.6362 16.6362 17 16.1875 17H3.8125C3.36377 17 3 16.6362 3 16.1875V13.8125C3 13.3638 3.36377 13 3.8125 13H16.1875ZM5 14C4.44772 14 4 14.4477 4 15C4 15.5523 4.44772 16 5 16C5.55228 16 6 15.5523 6 15C6 14.4477 5.55228 14 5 14Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<path
d="M16.1875 8C16.6362 8 17 8.36377 17 8.8125V11.1875C17 11.6362 16.6362 12 16.1875 12H3.8125C3.36377 12 3 11.6362 3 11.1875V8.8125C3 8.36377 3.36377 8 3.8125 8H16.1875ZM5 9C4.44772 9 4 9.44772 4 10C4 10.5523 4.44772 11 5 11C5.55228 11 6 10.5523 6 10C6 9.44772 5.55228 9 5 9Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<path
d="M16.1875 3C16.6362 3 17 3.36377 17 3.8125V6.1875C17 6.63623 16.6362 7 16.1875 7H3.8125C3.36377 7 3 6.63623 3 6.1875V3.8125C3 3.36377 3.36377 3 3.8125 3H16.1875ZM5 4C4.44772 4 4 4.44772 4 5C4 5.55228 4.44772 6 5 6C5.55228 6 6 5.55228 6 5C6 4.44772 5.55228 4 5 4Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
</svg>
Expand All @@ -109,12 +114,12 @@ function MachineIconSmall1x({ className }: { className?: string }) {
/>
<path
d="M16.1875 8C16.6362 8 17 8.36377 17 8.8125V11.1875C17 11.6362 16.6362 12 16.1875 12H3.8125C3.36377 12 3 11.6362 3 11.1875V8.8125C3 8.36377 3.36377 8 3.8125 8H16.1875ZM5 9C4.44772 9 4 9.44772 4 10C4 10.5523 4.44772 11 5 11C5.55228 11 6 10.5523 6 10C6 9.44772 5.55228 9 5 9Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<path
d="M16.1875 3C16.6362 3 17 3.36377 17 3.8125V6.1875C17 6.63623 16.6362 7 16.1875 7H3.8125C3.36377 7 3 6.63623 3 6.1875V3.8125C3 3.36377 3.36377 3 3.8125 3H16.1875ZM5 4C4.44772 4 4 4.44772 4 5C4 5.55228 4.44772 6 5 6C5.55228 6 6 5.55228 6 5C6 4.44772 5.55228 4 5 4Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
</svg>
Expand All @@ -130,12 +135,12 @@ function MachineIconSmall2x({ className }: { className?: string }) {
/>
<path
d="M16.1875 8C16.6362 8 17 8.36377 17 8.8125V11.1875C17 11.6362 16.6362 12 16.1875 12H3.8125C3.36377 12 3 11.6362 3 11.1875V8.8125C3 8.36377 3.36377 8 3.8125 8H16.1875ZM5 9C4.44772 9 4 9.44772 4 10C4 10.5523 4.44772 11 5 11C5.55228 11 6 10.5523 6 10C6 9.44772 5.55228 9 5 9Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
<path
d="M16.1875 3C16.6362 3 17 3.36377 17 3.8125V6.1875C17 6.63623 16.6362 7 16.1875 7H3.8125C3.36377 7 3 6.63623 3 6.1875V3.8125C3 3.36377 3.36377 3 3.8125 3H16.1875ZM5 4C4.44772 4 4 4.44772 4 5C4 5.55228 4.44772 6 5 6C5.55228 6 6 5.55228 6 5C6 4.44772 5.55228 4 5 4Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
</svg>
Expand All @@ -155,7 +160,7 @@ function MachineIconMedium1x({ className }: { className?: string }) {
/>
<path
d="M16.1875 3C16.6362 3 17 3.36377 17 3.8125V6.1875C17 6.63623 16.6362 7 16.1875 7H3.8125C3.36377 7 3 6.63623 3 6.1875V3.8125C3 3.36377 3.36377 3 3.8125 3H16.1875ZM5 4C4.44772 4 4 4.44772 4 5C4 5.55228 4.44772 6 5 6C5.55228 6 6 5.55228 6 5C6 4.44772 5.55228 4 5 4Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
</svg>
Expand All @@ -175,7 +180,7 @@ function MachineIconMedium2x({ className }: { className?: string }) {
/>
<path
d="M16.1875 3C16.6362 3 17 3.36377 17 3.8125V6.1875C17 6.63623 16.6362 7 16.1875 7H3.8125C3.36377 7 3 6.63623 3 6.1875V3.8125C3 3.36377 3.36377 3 3.8125 3H16.1875ZM5 4C4.44772 4 4 4.44772 4 5C4 5.55228 4.44772 6 5 6C5.55228 6 6 5.55228 6 5C6 4.44772 5.55228 4 5 4Z"
fill="#D7D9DD"
fill="currentColor"
fillOpacity="0.4"
/>
</svg>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion apps/webapp/app/components/AskAI.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ function ChatMessages({
<div className="flex flex-col">
<Callout variant="error" className="mb-4">
<Paragraph className="font-semibold text-error">Error generating answer:</Paragraph>
<Paragraph className="text-rose-300">
<Paragraph className="text-rose-500 dark:text-rose-300">
{error} If the problem persists after retrying, please contact support.
</Paragraph>
</Callout>
Expand Down
88 changes: 59 additions & 29 deletions apps/webapp/app/components/BackgroundWrapper.tsx
Original file line number Diff line number Diff line change
@@ -1,42 +1,72 @@
import { type ReactNode } from "react";
import blurredDashboardBackgroundMenuTop from "~/assets/images/blurred-dashboard-background-menu-top.jpg";
import blurredDashboardBackgroundMenuTopLight from "~/assets/images/blurred-dashboard-background-menu-top-light.jpg";
import blurredDashboardBackgroundMenuBottom from "~/assets/images/blurred-dashboard-background-menu-bottom.jpg";
import blurredDashboardBackgroundMenuBottomLight from "~/assets/images/blurred-dashboard-background-menu-bottom-light.jpg";
import blurredDashboardBackgroundTable from "~/assets/images/blurred-dashboard-background-table.jpg";
import blurredDashboardBackgroundTableLight from "~/assets/images/blurred-dashboard-background-table-light.jpg";

/* Blurred dashboard screenshots; the -light set is the same artwork with the
lightness inverted for the light theme. */
const BACKDROPS = [
{
images: {
menuTop: blurredDashboardBackgroundMenuTop,
menuBottom: blurredDashboardBackgroundMenuBottom,
table: blurredDashboardBackgroundTable,
},
tableFill: "#101214",
className: "hidden lg:block light:lg:hidden",
},
{
images: {
menuTop: blurredDashboardBackgroundMenuTopLight,
menuBottom: blurredDashboardBackgroundMenuBottomLight,
table: blurredDashboardBackgroundTableLight,
},
tableFill: "#f4f5f7",
className: "hidden light:lg:block",
Comment on lines +19 to +28

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.

🔍 Light/dark backdrop visibility relies on class-order, not specificity

The two backdrop layers are distinguished only by "hidden lg:block light:lg:hidden" vs "hidden light:lg:block" (apps/webapp/app/components/BackgroundWrapper.tsx:19,28). The light custom variant is defined with :where(...) (apps/webapp/app/tailwind.css:433), which contributes zero specificity, so light:lg:hidden and lg:block are equally specific and the winner depends purely on the order Tailwind emits the two utilities. If lg:block sorts last, the dark backdrop stays visible on top of the light one in the Light theme. Worth a quick visual check of /orgs/new and /invites at lg width in Light theme.

Open in Devin Review

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

},
];

export function BackgroundWrapper({ children }: { children: ReactNode }) {
return (
<div className="relative h-full w-full overflow-hidden bg-background-dimmed lg:bg-transparent">
<div
className="absolute left-0 top-0 hidden w-[260px] bg-contain bg-top-left bg-no-repeat lg:block"
style={{
backgroundImage: `url(${blurredDashboardBackgroundMenuTop})`,
aspectRatio: "auto",
height: "100vh",
backgroundSize: "260px auto",
}}
/>
{BACKDROPS.map(({ images, tableFill, className }) => (
<div key={tableFill} className={className}>
<div
className="absolute left-0 top-0 w-[260px] bg-contain bg-top-left bg-no-repeat"
style={{
backgroundImage: `url(${images.menuTop})`,
aspectRatio: "auto",
height: "100vh",
backgroundSize: "260px auto",
}}
/>

<div
className="absolute bottom-0 left-0 hidden w-[260px] bg-contain bg-bottom-left bg-no-repeat lg:block"
style={{
backgroundImage: `url(${blurredDashboardBackgroundMenuBottom})`,
aspectRatio: "auto",
height: "100vh",
backgroundSize: "260px auto",
}}
/>
<div
className="absolute bottom-0 left-0 w-[260px] bg-contain bg-bottom-left bg-no-repeat"
style={{
backgroundImage: `url(${images.menuBottom})`,
aspectRatio: "auto",
height: "100vh",
backgroundSize: "260px auto",
}}
/>

<div
className="absolute top-0 hidden bg-top-left bg-no-repeat lg:block"
style={{
left: "260px",
backgroundImage: `url(${blurredDashboardBackgroundTable})`,
width: "100%",
height: "100vh",
backgroundSize: "1200px auto",
backgroundColor: "#101214",
}}
/>
<div
className="absolute top-0 bg-top-left bg-no-repeat"
style={{
left: "260px",
backgroundImage: `url(${images.table})`,
width: "100%",
height: "100vh",
backgroundSize: "1200px auto",
backgroundColor: tableFill,
}}
/>
</div>
))}

<div className="relative z-10 h-full w-full">{children}</div>
</div>
Expand Down
3 changes: 2 additions & 1 deletion apps/webapp/app/components/BlankStatePanels.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
} from "@heroicons/react/20/solid";
import { useLocation } from "react-use";
import { AIChatIcon } from "~/assets/icons/AIChatIcon";
import { AIPenIcon } from "~/assets/icons/AIPenIcon";
import { BranchEnvironmentIconSmall } from "~/assets/icons/EnvironmentIcons";
import { WaitpointTokenIcon } from "~/assets/icons/WaitpointTokenIcon";
import openBulkActionsPanel from "~/assets/images/open-bulk-actions-panel.png";
Expand Down Expand Up @@ -742,7 +743,7 @@ export function PromptsNone() {
return (
<InfoPanel
title="Define your first prompt"
icon={AIChatIcon}
icon={AIPenIcon}
iconClassName="text-aiPrompts"
panelClassName="max-w-lg"
accessory={
Expand Down
4 changes: 2 additions & 2 deletions apps/webapp/app/components/BulkActionFilterSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { Paragraph } from "./primitives/Paragraph";
import simplur from "simplur";
import { appliedSummary, dateFromString, timeFilterRenderValues } from "./runs/v3/SharedFilters";
import { formatNumber } from "~/utils/numberFormatter";
import { SpinnerWhite } from "./primitives/Spinner";
import { Spinner } from "./primitives/Spinner";
import { ArrowPathIcon, CheckIcon, XCircleIcon } from "@heroicons/react/20/solid";
import { XCircleIcon as XCircleIconOutline } from "@heroicons/react/24/outline";
import assertNever from "assert-never";
Expand Down Expand Up @@ -306,5 +306,5 @@ export function EstimatedCount({ count }: { count?: number }) {
return <>~{formatNumber(count)}</>;
}

return <SpinnerWhite className="mx-0.5 -mt-0.5 inline size-3" />;
return <Spinner color="blue" className="mx-0.5 -mt-0.5 inline size-3" />;
}
6 changes: 5 additions & 1 deletion apps/webapp/app/components/DevPresence.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import disconnectedImage from "../assets/images/cli-disconnected.png";
import { InlineCode } from "./code/InlineCode";
import { Button } from "./primitives/Buttons";
import { Dialog, DialogContent, DialogHeader, DialogTrigger } from "./primitives/Dialog";
import { cn } from "~/utils/cn";
import { Paragraph } from "./primitives/Paragraph";
import { TextLink } from "./primitives/TextLink";
import { PackageManagerProvider, TriggerDevStepV3 } from "./SetupCommands";
Expand Down Expand Up @@ -165,7 +166,10 @@ export function DevPresencePanel({ isConnected }: { isConnected: boolean | undef
width={282}
height={45}
/>
<Paragraph variant="small" className={isConnected ? "text-success" : "text-error"}>
<Paragraph
variant="small"
className={cn("system-mono-label", isConnected ? "text-success" : "text-error")}
>
{isConnected === undefined
? "Checking connection..."
: isConnected
Expand Down
6 changes: 4 additions & 2 deletions apps/webapp/app/components/ErrorDisplay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,12 @@ type DisplayOptionsProps = {

export function ErrorDisplay({ title, message, button }: DisplayOptionsProps) {
return (
// The backdrop stays dark in every theme (the rotating-logo animation is
// dark artwork), so the text pins to the dark-theme colors on light too.
<div className="fixed inset-0 z-50 flex flex-col items-center justify-center overflow-y-auto bg-[#16181C]">
<div className="z-10 mt-[30vh] flex shrink-0 flex-col items-center gap-8">
<Header1>{title}</Header1>
{message && <Paragraph>{message}</Paragraph>}
<Header1 className="light:text-charcoal-200">{title}</Header1>
{message && <Paragraph className="light:text-charcoal-400">{message}</Paragraph>}
<LinkButton
to={button ? button.to : "/"}
shortcut={{ key: "enter" }}
Expand Down
24 changes: 21 additions & 3 deletions apps/webapp/app/components/FeatureBadges.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,14 @@ export function AlphaBadge({
return (
<SimpleTooltip
button={
<Badge variant="extra-small" className={cn(inline ? "inline-grid" : "", className)}>
<Badge
variant="extra-small"
className={cn(
"system:border-transparent system:bg-blue-500 system:text-white",
inline ? "inline-grid" : "",
className
)}
>
Alpha
</Badge>
}
Expand All @@ -35,7 +42,14 @@ export function BetaBadge({ inline = false, className }: { inline?: boolean; cla
return (
<SimpleTooltip
button={
<Badge variant="extra-small" className={cn(inline ? "inline-grid" : "", className)}>
<Badge
variant="extra-small"
className={cn(
"system:border-transparent system:bg-blue-500 system:text-white",
inline ? "inline-grid" : "",
className
)}
>
Beta
</Badge>
}
Expand All @@ -58,7 +72,11 @@ export function NewBadge({ inline = false, className }: { inline?: boolean; clas
return (
<Badge
variant="extra-small"
className={cn("text-success", inline ? "inline-grid" : "", className)}
className={cn(
"text-success system:border-transparent system:bg-success system:text-white",
inline ? "inline-grid" : "",
className
)}
>
New
</Badge>
Expand Down
2 changes: 1 addition & 1 deletion apps/webapp/app/components/LoginPageLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export function LoginPageLayout({
{rightContent ?? (
<>
<div className="flex h-full flex-col items-center justify-center px-16">
<Header3 className="relative text-center text-2xl font-normal leading-8 text-text-dimmed transition before:relative before:right-1 before:top-0 before:text-6xl before:text-charcoal-750 before:content-['❝'] lg-height:text-xl md-height:text-lg">
<Header3 className="relative text-center text-2xl font-normal leading-8 text-text-dimmed transition before:relative before:right-1 before:top-0 before:text-6xl before:text-grid-bright before:content-['❝'] dark:before:text-charcoal-750 lg-height:text-xl md-height:text-lg">
{randomQuote?.quote}
</Header3>
<Paragraph className="mt-4 text-text-dimmed/60">{randomQuote?.person}</Paragraph>
Expand Down
2 changes: 1 addition & 1 deletion apps/webapp/app/components/admin/debugTooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ function Content({ children }: { children: React.ReactNode }) {
const user = useUser();

return (
<div className="flex flex-col gap-2 divide-y divide-slate-700">
<div className="flex flex-col gap-2 divide-y divide-grid-bright">
<Property.Table>
<Property.Item>
<Property.Label>User ID</Property.Label>
Expand Down
9 changes: 7 additions & 2 deletions apps/webapp/app/components/billing/AnimatedOrgBannerBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,16 @@ export function AnimatedOrgBannerBar({
<div className="flex items-center gap-2">
<Icon
icon={ExclamationCircleIcon}
className={cn("h-5 w-5", variant === "warning" ? "text-amber-400" : "text-error")}
className={cn(
"h-5 w-5",
variant === "warning" ? "text-amber-400 light:text-amber-600" : "text-error"
)}
/>
<Paragraph
variant="small"
className={variant === "warning" ? "text-amber-200" : "text-error"}
className={
variant === "warning" ? "text-amber-700 dark:text-amber-200" : "text-error"
}
>
{children}
</Paragraph>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export function BillingLimitRecoveryPanel({
<div className="border-b border-grid-dimmed pb-3">
<Header2 spacing>Action required</Header2>
<Callout variant="warning">
<Paragraph variant="small" className="text-yellow-200">
<Paragraph variant="small" className="text-callout-warning-text">
{isGrace ? (
<>
Your organization has reached its billing limit. Processing is paused and new runs
Expand Down
Loading
Loading