Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
c8a00ed
feat(web): establish redesign primitives and shell
maria-rcks Oct 31, 2026
0343b18
refactor(web): remove unused toggle pressed tokens
maria-rcks Oct 31, 2026
eb0c786
fix(web): match catalog button and type specimens
maria-rcks Oct 31, 2026
6e3f83e
fix(web): honor reduced motion in overlay primitives
maria-rcks Oct 31, 2026
57200c8
fix(web): match shell and overlay design geometry
maria-rcks Oct 31, 2026
ea24219
fix(web): align project search and sidebar badge sizes
maria-rcks Oct 31, 2026
4ea8738
fix(web): preserve shell type role and titlebar spacing
maria-rcks Oct 31, 2026
aec7aab
fix(web): give provider tiles room for icons and labels
maria-rcks Oct 31, 2026
2577ca9
fix(web): match browser address toolbar spacing to design
maria-rcks Oct 31, 2026
7edfdcb
fix(chat): match inline request cards to the timeline design
maria-rcks Oct 31, 2026
6d7092b
feat(ui): add relaxed picker spacing and compact key hints
maria-rcks Oct 31, 2026
fb6b0a6
fix(ui): use the inset field surface and format picker variants
maria-rcks Oct 31, 2026
c08e9c5
fix(ui): preserve web context menu widths
maria-rcks Oct 31, 2026
4ee7938
fix(ui): keep palette actions above provider notices
maria-rcks Oct 31, 2026
3415012
fix(ui): fit browser previews inside a landscape floating frame
maria-rcks Oct 31, 2026
75223e0
fix(web): restore compact panel controls and touch targets
maria-rcks Oct 31, 2026
7af87ff
fix(web): home screen project rows show the project they open (#29085)
flamboh Nov 2, 2026
0c5faca
fix(web): Snoozed and Settled rows drop the PR badge, and snooze time…
flamboh Nov 2, 2026
f77aaa0
fix(web): snoozed rows show the snooze time like main
maria-rcks Nov 2, 2026
824d6ef
fix(web): project groups show an icon if any checkout has one (#29199)
flamboh Nov 2, 2026
9c497ca
fix(web): open pull requests show the arrow icon again (#29213)
flamboh Nov 2, 2026
dab061f
fix(web): restore main sidebar thread rows
maria-rcks Nov 3, 2026
b7f98ab
fix(web): new-thread project rows inset their environment icon (#29985)
flamboh Nov 3, 2026
705bef0
fix(web): palette project rows show the location under the name (#29980)
flamboh Nov 3, 2026
4666411
fix(web): palette result titles use the 14px label role
maria-rcks Nov 6, 2026
d67c0d4
fix(web): sidebar New thread skips the project dialog (#29973)
flamboh Nov 3, 2026
9658a65
fix(web): preserve rebased server text and shortcut expectations
maria-rcks Nov 3, 2026
ed1780f
fix(web): sidebar rows no longer show a Merged status (#31105)
SunkenInTime Nov 5, 2026
5befb57
fix(web): sidebar PR badges use the same green as the rest of the red…
flamboh Nov 5, 2026
39fd862
fix(web): adapt main's dictation UI to the redesign primitives
maria-rcks Nov 6, 2026
bed6f75
fix(mobile): approvals and notices drop the all-caps headings (#32181)
flamboh Nov 7, 2026
e0e4ea6
fix(mobile): match the thread list timer to the web sidebar (#32893)
shivamhwp Nov 8, 2026
00bc012
fix(web): adapt main's new surfaces to the redesign primitives
maria-rcks Nov 8, 2026
608a914
test(web): drop low-signal tests the redesign added to the primitives…
maria-rcks Nov 9, 2026
76c259e
fix(web): fit main's latest shell changes into the redesign primitives
maria-rcks Nov 9, 2026
1f796fd
fix(web): fit main's text generator settings into the redesign primit…
maria-rcks Nov 9, 2026
cd4b553
fix(web): model mentions use the redesign's type roles
maria-rcks Nov 9, 2026
ad1bd4d
test(web): the palette intent test reads the redesign's placeholder
maria-rcks Nov 9, 2026
ea38354
fix(web): carry main updates through the redesign primitives
maria-rcks Nov 11, 2026
ded375e
test(web): isolate the palette's remembered project
maria-rcks Nov 11, 2026
9e9926e
fix(web): format the preserved git status notice
maria-rcks Nov 11, 2026
60d831e
fix(web): format main behavior in the redesigned shell
maria-rcks Nov 11, 2026
6411ad6
fix(web): retain main controls in the redesign shell
maria-rcks Nov 11, 2026
2613b8e
test(web): measure HTML reflow after the dialog opens
maria-rcks Nov 11, 2026
79e9f09
fix(web): keep machine names in provider restart notices
maria-rcks Nov 11, 2026
25470b7
fix(web): give main's quoted-response card the body type role
maria-rcks Nov 11, 2026
5f18d4c
test(web): name main's resolved-conversation toggle the way the redes…
maria-rcks Nov 12, 2026
1ca45d6
fix(web): carry main's reply banner, voice files and composer context…
maria-rcks Nov 12, 2026
e907024
fix(web): carry main's count labels, folder drop and provider field e…
maria-rcks Nov 12, 2026
cc1cf4e
fix: main's Update Codex button and HEAD watch test fit the redesign
maria-rcks Nov 12, 2026
dc0c044
fix(web): carry main's device approval, theme CSS editor and held pre…
maria-rcks Nov 14, 2026
f851f11
test: exercise main behaviors through redesigned app layout
maria-rcks Nov 14, 2026
df77ec3
fix(web,mobile): fit main's new code to the redesign's dividers, row …
maria-rcks Nov 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ Architecture and its constraints: `docs/internals/overview.md`. Glossary: `docs/
projection, tight loops) or duplicate an existing tracing boundary; explain that choice nearby.
Named `Effect.fn` creates a span; the unnamed form does not. Preserve existing span names and
options, and pass combinators as additional function-builder arguments.
- Before building UI, open `/design-system` in a dev build: it renders every primitive, variant and type role. Text takes a role (`<Text variant>` or `text-title` … `text-micro`), not `text-sm` or `font-medium`; a clickable thing is a `components/ui` control, not a styled `<button>` or `<a>`. `t3code/no-raw-type-classes` and `t3code/no-styled-raw-controls` fail lint, and their per-file ceilings in `vite.config.ts` only go down.
- Inferred types over annotations. `any` is the enemy.
- Default to no comment. Write one only for a constraint, an external quirk, or an invariant the code can't show, in one line where you can and four at most. Don't restate names or signatures, narrate steps, record history, or explain the fix you just made; the PR carries that. `t3code/no-low-value-comments` enforces the length cap and the mechanical cases.
- React effects are for synchronizing with something outside React. Derive in render and act in handlers instead of syncing state, but don't hide real lifecycle work in refs or stores to dodge one. The `t3code/no-unreasoned-state-sync` lint rule reports every effect; one that stays states its reason with `// oxlint-disable-next-line t3code/no-unreasoned-state-sync -- <why>`.
Expand Down
30 changes: 7 additions & 23 deletions apps/desktop/resources/dmg/dmg-background-latest.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
40 changes: 10 additions & 30 deletions apps/desktop/resources/dmg/dmg-background-nightly.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions apps/desktop/src/app/DesktopLifecycle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ function layerElectronApp(

const layerElectronTheme = Layer.succeed(ElectronTheme.ElectronTheme, {
shouldUseDarkColors: Effect.succeed(false),
shouldUseDarkChrome: Effect.succeed(false),
setSource: () => Effect.void,
setBlackChrome: () => Effect.void,
onUpdated: () => Effect.void,
});

Expand Down
21 changes: 21 additions & 0 deletions apps/desktop/src/electron/ElectronTheme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ export class ElectronTheme extends Context.Service<
ElectronTheme,
{
readonly shouldUseDarkColors: Effect.Effect<boolean>;
/**
* Whether the window chrome (native background, caption button symbols)
* is dark: the dark appearance, or the renderer's light, black chrome.
*/
readonly shouldUseDarkChrome: Effect.Effect<boolean>;
readonly setSource: (theme: DesktopTheme) => Effect.Effect<void, ElectronThemeSetSourceError>;
/** The renderer's light, black chrome appearance; notifies onUpdated listeners. */
readonly setBlackChrome: (enabled: boolean) => Effect.Effect<void>;
readonly onUpdated: (listener: () => void) => Effect.Effect<void, never, Scope.Scope>;
}
>()("@t3tools/desktop/electron/ElectronTheme") {}
Expand All @@ -38,6 +45,10 @@ type WatchSystemColorScheme = (onChange: (scheme: LinuxColorScheme) => void) =>
export const makeWith = Effect.fn("ElectronTheme.make")(function* (
watchSystemColorScheme: WatchSystemColorScheme | undefined,
) {
// Black chrome is renderer state, not a native theme source, so the service
// keeps it and fans changes out to the same listeners as native updates.
let blackChrome = false;
const blackChromeListeners = new Set<() => void>();
let source: DesktopTheme = Electron.nativeTheme.themeSource;
let systemScheme: LinuxColorScheme = null;
// On Linux, Electron reads the desktop color scheme once and then ignores the settings
Expand All @@ -64,6 +75,7 @@ export const makeWith = Effect.fn("ElectronTheme.make")(function* (

return ElectronTheme.of({
shouldUseDarkColors: Effect.sync(() => Electron.nativeTheme.shouldUseDarkColors),
shouldUseDarkChrome: Effect.sync(() => Electron.nativeTheme.shouldUseDarkColors || blackChrome),
setSource: Effect.fn("ElectronTheme.setSource")(function (theme) {
return Effect.try({
try: () => {
Expand All @@ -73,15 +85,24 @@ export const makeWith = Effect.fn("ElectronTheme.make")(function* (
catch: (cause) => new ElectronThemeSetSourceError({ source: theme, cause }),
});
}),
setBlackChrome: Effect.fn("ElectronTheme.setBlackChrome")(function (enabled) {
return Effect.sync(() => {
if (blackChrome === enabled) return;
blackChrome = enabled;
for (const listener of blackChromeListeners) listener();
});
}),
onUpdated: Effect.fn("ElectronTheme.onUpdated")(function (listener) {
return Effect.acquireRelease(
Effect.suspend(() => {
Electron.nativeTheme.on("updated", listener);
blackChromeListeners.add(listener);
return Effect.void;
}),
() =>
Effect.suspend(() => {
Electron.nativeTheme.removeListener("updated", listener);
blackChromeListeners.delete(listener);
return Effect.void;
}),
);
Expand Down
4 changes: 4 additions & 0 deletions apps/desktop/src/ipc/DesktopIpcHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ import {
toLocalBackendPath,
pickProjectFavicon,
pickThemeFiles,
setBlackChrome,
setTheme,
syncHtmlFullscreen,
setWindowButtonsVisible,
showContextMenu,
} from "./methods/window.ts";
import {
Expand Down Expand Up @@ -152,6 +154,7 @@ export const installDesktopIpcHandlers = Effect.fn("desktop.ipc.installHandlers"
yield* ipc.handle(pickProjectFavicon);
yield* ipc.handle(pickThemeFiles);
yield* ipc.handle(setTheme);
yield* ipc.handle(setBlackChrome);
yield* ipc.handle(showContextMenu);
yield* ipc.handle(openExternal);
yield* ipc.handle(readMedia);
Expand All @@ -162,6 +165,7 @@ export const installDesktopIpcHandlers = Effect.fn("desktop.ipc.installHandlers"
yield* ipc.handle(pasteAsText);
yield* ipc.handle(revealWindow);
yield* ipc.handle(syncHtmlFullscreen);
yield* ipc.handle(setWindowButtonsVisible);
yield* ipc.handle(probeRemoteEditors);
yield* ipc.handle(getUpdateState);
yield* ipc.handle(setUpdateChannel);
Expand Down
2 changes: 2 additions & 0 deletions apps/desktop/src/ipc/channels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export const SET_NOTIFICATION_BADGE_CHANNEL = "desktop:set-notification-badge";
export const PICK_PROJECT_FAVICON_CHANNEL = "desktop:pick-project-favicon";
export const PICK_THEME_FILES_CHANNEL = "desktop:pick-theme-files";
export const SET_THEME_CHANNEL = "desktop:set-theme";
export const SET_BLACK_CHROME_CHANNEL = "desktop:set-black-chrome";
export const CONTEXT_MENU_CHANNEL = "desktop:context-menu";
export const OPEN_EXTERNAL_CHANNEL = "desktop:open-external";
export const READ_MEDIA_CHANNEL = "desktop:read-media";
Expand All @@ -21,6 +22,7 @@ export const TRACKPAD_SCROLL_END_CHANNEL = "desktop:trackpad-scroll-end";
export const GET_WINDOW_FULLSCREEN_STATE_CHANNEL = "desktop:get-window-fullscreen-state";
export const WINDOW_FULLSCREEN_STATE_CHANNEL = "desktop:window-fullscreen-state";
export const SYNC_HTML_FULLSCREEN_CHANNEL = "desktop:sync-html-fullscreen";
export const SET_WINDOW_BUTTONS_VISIBLE_CHANNEL = "desktop:set-window-buttons-visible";
export const DESKTOP_APP_ACTIVATION_READY_CHANNEL = "desktop:app-activation-ready";
export const DESKTOP_APP_ACTIVATION_COMPLETE_CHANNEL = "desktop:app-activation-complete";
export const DESKTOP_APP_ACTIVATION_REQUEST_CHANNEL = "desktop:app-activation-request";
Expand Down
Loading
Loading