Skip to content

Commit 33a5415

Browse files
committed
Merge branch 'feat/system-preference-theme' into feat/light-theme
# Conflicts: # apps/webapp/app/routes/account._index/route.tsx
2 parents 8b64da9 + 62c3d4f commit 33a5415

177 files changed

Lines changed: 20602 additions & 6256 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: improvement
4+
---
5+
6+
The agent detail page now matches the shared metrics-page layout: the time filter and pagination sit in a filter row at the top, the activity charts form a tile row beneath it, and the tabs and table flow below in a single page scroll, with the agent config panel as a resizable sidebar on the right.

.server-changes/light-theme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ area: webapp
33
type: feature
44
---
55

6-
Adds an opt-in light theme behind a feature flag. When enabled, an Interface theme setting appears on the account page (dark stays the default). Code editors and syntax highlighting use the trigger.light palette.
6+
Adds an opt-in Interface theme setting on the account page behind a feature flag. Choose Classic (the default), System preference (follows your OS), Dark, or Light, and fine-tune the new themes with a contrast slider. System preference switches automatically when your OS appearance changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: feature
4+
---
5+
6+
Queue metrics and health on the Queues page: per-queue depth, throughput, concurrency, throttling, and scheduling-delay charts, plus a per-queue detail view, live queue stats and a backlog chart on the task detail page, and a waiting-in-queue explainer in the run inspector for runs that have not started yet. Off by default; enabled per organization.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: breaking
4+
---
5+
6+
Setting a queue's concurrency limit above the environment limit is now rejected with a clear error instead of being silently capped. Existing overrides are unaffected.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: improvement
4+
---
5+
6+
Queue pages now refresh their live numbers automatically, and the charts are clearer: better axis labels, hover explanations for the headline stats, and the busiest concurrency key named on the chart.

apps/webapp/app/assets/icons/MachineIcon.tsx

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,33 @@ export function MachineDefaultIcon({ className }: { className?: string }) {
4848

4949
function MachineIconNoMachine({ className }: { className?: string }) {
5050
return (
51-
<svg className={className} viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
51+
<svg
52+
className={cn("text-[#D7D9DD] light:text-charcoal-500", className)}
53+
viewBox="0 0 20 20"
54+
fill="none"
55+
xmlns="http://www.w3.org/2000/svg"
56+
>
5257
<path
5358
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"
54-
fill="#D7D9DD"
59+
fill="currentColor"
5560
fillOpacity="0.4"
5661
/>
5762
<path
5863
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"
59-
fill="#D7D9DD"
64+
fill="currentColor"
6065
fillOpacity="0.4"
6166
/>
6267
<path
6368
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"
64-
fill="#D7D9DD"
69+
fill="currentColor"
6570
fillOpacity="0.4"
6671
/>
6772
<line
6873
x1="3"
6974
y1="16.9998"
7075
x2="17.0018"
7176
y2="2.99805"
72-
stroke="#D7D9DD"
77+
stroke="currentColor"
7378
strokeOpacity="0.4"
7479
strokeWidth="2"
7580
strokeLinecap="round"
@@ -83,17 +88,17 @@ function MachineIconMicro({ className }: { className?: string }) {
8388
<svg className={className} viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
8489
<path
8590
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"
86-
fill="#D7D9DD"
91+
fill="currentColor"
8792
fillOpacity="0.4"
8893
/>
8994
<path
9095
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"
91-
fill="#D7D9DD"
96+
fill="currentColor"
9297
fillOpacity="0.4"
9398
/>
9499
<path
95100
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"
96-
fill="#D7D9DD"
101+
fill="currentColor"
97102
fillOpacity="0.4"
98103
/>
99104
</svg>
@@ -109,12 +114,12 @@ function MachineIconSmall1x({ className }: { className?: string }) {
109114
/>
110115
<path
111116
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"
112-
fill="#D7D9DD"
117+
fill="currentColor"
113118
fillOpacity="0.4"
114119
/>
115120
<path
116121
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"
117-
fill="#D7D9DD"
122+
fill="currentColor"
118123
fillOpacity="0.4"
119124
/>
120125
</svg>
@@ -130,12 +135,12 @@ function MachineIconSmall2x({ className }: { className?: string }) {
130135
/>
131136
<path
132137
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"
133-
fill="#D7D9DD"
138+
fill="currentColor"
134139
fillOpacity="0.4"
135140
/>
136141
<path
137142
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"
138-
fill="#D7D9DD"
143+
fill="currentColor"
139144
fillOpacity="0.4"
140145
/>
141146
</svg>
@@ -155,7 +160,7 @@ function MachineIconMedium1x({ className }: { className?: string }) {
155160
/>
156161
<path
157162
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"
158-
fill="#D7D9DD"
163+
fill="currentColor"
159164
fillOpacity="0.4"
160165
/>
161166
</svg>
@@ -175,7 +180,7 @@ function MachineIconMedium2x({ className }: { className?: string }) {
175180
/>
176181
<path
177182
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"
178-
fill="#D7D9DD"
183+
fill="currentColor"
179184
fillOpacity="0.4"
180185
/>
181186
</svg>
790 Bytes
Loading
3.5 KB
Loading
17.6 KB
Loading

apps/webapp/app/components/BackgroundWrapper.tsx

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,72 @@
11
import { type ReactNode } from "react";
22
import blurredDashboardBackgroundMenuTop from "~/assets/images/blurred-dashboard-background-menu-top.jpg";
3+
import blurredDashboardBackgroundMenuTopLight from "~/assets/images/blurred-dashboard-background-menu-top-light.jpg";
34
import blurredDashboardBackgroundMenuBottom from "~/assets/images/blurred-dashboard-background-menu-bottom.jpg";
5+
import blurredDashboardBackgroundMenuBottomLight from "~/assets/images/blurred-dashboard-background-menu-bottom-light.jpg";
46
import blurredDashboardBackgroundTable from "~/assets/images/blurred-dashboard-background-table.jpg";
7+
import blurredDashboardBackgroundTableLight from "~/assets/images/blurred-dashboard-background-table-light.jpg";
8+
9+
/* Blurred dashboard screenshots; the -light set is the same artwork with the
10+
lightness inverted for the light theme. */
11+
const BACKDROPS = [
12+
{
13+
images: {
14+
menuTop: blurredDashboardBackgroundMenuTop,
15+
menuBottom: blurredDashboardBackgroundMenuBottom,
16+
table: blurredDashboardBackgroundTable,
17+
},
18+
tableFill: "#101214",
19+
className: "hidden lg:block light:lg:hidden",
20+
},
21+
{
22+
images: {
23+
menuTop: blurredDashboardBackgroundMenuTopLight,
24+
menuBottom: blurredDashboardBackgroundMenuBottomLight,
25+
table: blurredDashboardBackgroundTableLight,
26+
},
27+
tableFill: "#f4f5f7",
28+
className: "hidden light:lg:block",
29+
},
30+
];
531

632
export function BackgroundWrapper({ children }: { children: ReactNode }) {
733
return (
834
<div className="relative h-full w-full overflow-hidden bg-background-dimmed lg:bg-transparent">
9-
<div
10-
className="absolute left-0 top-0 hidden w-[260px] bg-contain bg-top-left bg-no-repeat lg:block"
11-
style={{
12-
backgroundImage: `url(${blurredDashboardBackgroundMenuTop})`,
13-
aspectRatio: "auto",
14-
height: "100vh",
15-
backgroundSize: "260px auto",
16-
}}
17-
/>
35+
{BACKDROPS.map(({ images, tableFill, className }) => (
36+
<div key={tableFill} className={className}>
37+
<div
38+
className="absolute left-0 top-0 w-[260px] bg-contain bg-top-left bg-no-repeat"
39+
style={{
40+
backgroundImage: `url(${images.menuTop})`,
41+
aspectRatio: "auto",
42+
height: "100vh",
43+
backgroundSize: "260px auto",
44+
}}
45+
/>
1846

19-
<div
20-
className="absolute bottom-0 left-0 hidden w-[260px] bg-contain bg-bottom-left bg-no-repeat lg:block"
21-
style={{
22-
backgroundImage: `url(${blurredDashboardBackgroundMenuBottom})`,
23-
aspectRatio: "auto",
24-
height: "100vh",
25-
backgroundSize: "260px auto",
26-
}}
27-
/>
47+
<div
48+
className="absolute bottom-0 left-0 w-[260px] bg-contain bg-bottom-left bg-no-repeat"
49+
style={{
50+
backgroundImage: `url(${images.menuBottom})`,
51+
aspectRatio: "auto",
52+
height: "100vh",
53+
backgroundSize: "260px auto",
54+
}}
55+
/>
2856

29-
<div
30-
className="absolute top-0 hidden bg-top-left bg-no-repeat lg:block"
31-
style={{
32-
left: "260px",
33-
backgroundImage: `url(${blurredDashboardBackgroundTable})`,
34-
width: "100%",
35-
height: "100vh",
36-
backgroundSize: "1200px auto",
37-
backgroundColor: "#101214",
38-
}}
39-
/>
57+
<div
58+
className="absolute top-0 bg-top-left bg-no-repeat"
59+
style={{
60+
left: "260px",
61+
backgroundImage: `url(${images.table})`,
62+
width: "100%",
63+
height: "100vh",
64+
backgroundSize: "1200px auto",
65+
backgroundColor: tableFill,
66+
}}
67+
/>
68+
</div>
69+
))}
4070

4171
<div className="relative z-10 h-full w-full">{children}</div>
4272
</div>

0 commit comments

Comments
 (0)