diff --git a/apps/web/src/components/chat/OpenInPicker.tsx b/apps/web/src/components/chat/OpenInPicker.tsx
index c86ad92038639..90fc9f1a4f332 100644
--- a/apps/web/src/components/chat/OpenInPicker.tsx
+++ b/apps/web/src/components/chat/OpenInPicker.tsx
@@ -412,11 +412,11 @@ export const OpenInPicker = memo(function OpenInPicker({
getOpenInIconClass(primaryOption.kind),
// Full-color app icons outshout the panel's line icons until the row is in use.
isPanel &&
- "grayscale dark:opacity-70 group-hover/details-split:opacity-100 group-hover/details-split:grayscale-0 group-has-[[data-popup-open]]/details-split:opacity-100 group-has-[[data-popup-open]]/details-split:grayscale-0",
+ "redesign:grayscale redesign:dark:opacity-70 redesign:group-hover/details-split:opacity-100 redesign:group-hover/details-split:grayscale-0 redesign:group-has-[[data-popup-open]]/details-split:opacity-100 redesign:group-has-[[data-popup-open]]/details-split:grayscale-0",
// A hairline keeps pale app icons from dissolving into the card.
isPanel &&
primaryOption.kind === "brand" &&
- "rounded-sm ring-1 ring-black/10 dark:ring-white/15",
+ "redesign:rounded-sm redesign:ring-1 redesign:ring-black/10 redesign:dark:ring-white/15",
)}
/>
) : isPanel ? (
diff --git a/apps/web/src/components/chat/TraitsPicker.tsx b/apps/web/src/components/chat/TraitsPicker.tsx
index 68580c39a1e3e..f6d099dfbb059 100644
--- a/apps/web/src/components/chat/TraitsPicker.tsx
+++ b/apps/web/src/components/chat/TraitsPicker.tsx
@@ -24,7 +24,7 @@ import {
normalizeModelSlug,
} from "@t3tools/shared/model";
import { memo } from "react";
-import { GaugeIcon } from "lucide-react";
+import { BrainIcon, GaugeIcon } from "lucide-react";
import {
Menu,
MenuGroup,
@@ -600,7 +600,8 @@ export const TraitsPicker = memo(function TraitsPicker({
size === "xs" ? "gap-1" : "gap-1.5",
)}
>
-
+
+
{triggerLabel}
@@ -608,7 +609,8 @@ export const TraitsPicker = memo(function TraitsPicker({
) : (
<>
-
+
+
{triggerLabel}
>
diff --git a/apps/web/src/components/settings/AppearanceSettingsPanel.tsx b/apps/web/src/components/settings/AppearanceSettingsPanel.tsx
index a7b0756f64464..437061ccfdd10 100644
--- a/apps/web/src/components/settings/AppearanceSettingsPanel.tsx
+++ b/apps/web/src/components/settings/AppearanceSettingsPanel.tsx
@@ -351,32 +351,35 @@ export function AppearanceSettingsPanel() {
}
/>
-
- updateSettings({
- sidebarProjectIconColors: DEFAULT_UNIFIED_SETTINGS.sidebarProjectIconColors,
- })
+ {/* Only the new design grays project icons, so the option only exists there. */}
+ {settings.redesignEnabled ? (
+
+ updateSettings({
+ sidebarProjectIconColors: DEFAULT_UNIFIED_SETTINGS.sidebarProjectIconColors,
+ })
+ }
+ />
+ ) : null
+ }
+ control={
+
+ updateSettings({ sidebarProjectIconColors: Boolean(checked) })
}
+ aria-label="Colored project icons"
/>
- ) : null
- }
- control={
-
- updateSettings({ sidebarProjectIconColors: Boolean(checked) })
- }
- aria-label="Colored project icons"
- />
- }
- />
+ }
+ />
+ ) : null}
+
+ updateSettings({ redesignEnabled: DEFAULT_UNIFIED_SETTINGS.redesignEnabled })
+ }
+ />
+ ) : null
+ }
+ control={
+ updateSettings({ redesignEnabled: Boolean(checked) })}
+ aria-label="New design"
+ />
+ }
+ />
s.redesignEnabled);
+ const collapsedCount = props.toggle.expanded ? null : props.count;
return (
{props.count}
- )
+ redesign && collapsedCount !== null ? (
+ {collapsedCount}
+ ) : null
}
>
{props.label}
+ {!redesign && collapsedCount !== null ? ` (${collapsedCount})` : null}
);
diff --git a/apps/web/src/components/sidebar/SidebarThreadRow.tsx b/apps/web/src/components/sidebar/SidebarThreadRow.tsx
index f5ad695d975bc..c2393f3fe9b7b 100644
--- a/apps/web/src/components/sidebar/SidebarThreadRow.tsx
+++ b/apps/web/src/components/sidebar/SidebarThreadRow.tsx
@@ -198,7 +198,7 @@ function SidebarProviderStack(props: {
acpRegistryIconUrl={currentEntry.acpRegistryIconUrl}
showBadge={showInstanceBadge}
size="compact"
- iconClassName="opacity-50 grayscale"
+ iconClassName="opacity-60 redesign:opacity-50 redesign:grayscale"
/>
);
if (stack.length === 1) {
@@ -978,12 +978,12 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP
? cn(
"truncate",
shouldRecede
- ? "text-foreground/75 group-hover/sidebar-row:text-foreground group-focus-visible/sidebar-row:text-foreground"
+ ? "text-secondary-label redesign:text-foreground/75 redesign:group-hover/sidebar-row:text-foreground redesign:group-focus-visible/sidebar-row:text-foreground"
: isUnread || isWoke || status === "input" || status === "request"
? "text-foreground"
: status === "failed"
? "text-foreground/95"
- : "text-foreground",
+ : "text-foreground/90 redesign:text-foreground",
)
: cn(
"truncate group-focus-within/sidebar-row:text-foreground group-hover/sidebar-row:text-foreground",
@@ -1284,7 +1284,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP
// Repeated brand colors outshout titles; color returns on the row in focus.
!props.isActive &&
!projectIconColors &&
- "opacity-60 grayscale group-focus-visible/sidebar-row:opacity-100 group-focus-visible/sidebar-row:grayscale-0 group-any-hover/sidebar-row:opacity-100 group-any-hover/sidebar-row:grayscale-0",
+ "redesign:opacity-60 redesign:grayscale redesign:group-focus-visible/sidebar-row:opacity-100 redesign:group-focus-visible/sidebar-row:grayscale-0 redesign:group-any-hover/sidebar-row:opacity-100 redesign:group-any-hover/sidebar-row:grayscale-0",
)}
/>
) : null}
@@ -1292,7 +1292,12 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP
label for the wider row controls. */}
{pinIndicator}
{props.projectDisplayName ? (
-
+
{props.projectDisplayName}
) : (
@@ -1449,7 +1454,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP
{thread.branch ? (
<>
-
+
>
@@ -1458,9 +1463,11 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowP
- {props.scratchMachineLabel}
+
+ {props.scratchMachineLabel}
+
>
) : (
diff --git a/apps/web/src/components/ui/button.tsx b/apps/web/src/components/ui/button.tsx
index 803a6fa04b7ec..5637baf28abbc 100644
--- a/apps/web/src/components/ui/button.tsx
+++ b/apps/web/src/components/ui/button.tsx
@@ -106,7 +106,7 @@ const inlineButtonVariants = cva(
muted: "text-muted-foreground hover:text-foreground",
destructive: "text-destructive/80 hover:text-destructive",
picker:
- "gap-1 text-foreground decoration-from-font underline-offset-4 hover:underline data-popup-open:underline",
+ "gap-1 text-foreground underline decoration-foreground/30 decoration-dotted decoration-from-font underline-offset-4 hover:decoration-foreground hover:decoration-solid data-popup-open:decoration-foreground data-popup-open:decoration-solid redesign:no-underline redesign:hover:underline redesign:data-popup-open:underline",
},
},
},
diff --git a/apps/web/src/components/ui/collapsible-section-header.tsx b/apps/web/src/components/ui/collapsible-section-header.tsx
index 14b0ad4465bc6..4dd632c469d70 100644
--- a/apps/web/src/components/ui/collapsible-section-header.tsx
+++ b/apps/web/src/components/ui/collapsible-section-header.tsx
@@ -62,7 +62,7 @@ export function CollapsibleSectionHeader({
className={cn(
"shrink-0 transition-transform",
variant === "row" ? "size-4 text-muted-foreground" : "size-3",
- !expanded && "-rotate-90",
+ !expanded && "rotate-180 redesign:-rotate-90",
)}
/>