) {
return (
{
expect(html).toContain('data-slot="sidebar-menu-button"');
expect(html).toContain("cursor-pointer");
+ expect(html).toContain("rounded-[var(--control-radius)]");
+ expect(html).toContain("gap-[var(--sidebar-control-gap)]");
+ expect(html).toContain("p-[var(--sidebar-content-inset)]");
});
it("lets project drag handles override the default pointer cursor", () => {
diff --git a/apps/web/src/components/ui/sidebar.tsx b/apps/web/src/components/ui/sidebar.tsx
index af90a7cc65b..0f07b76a6bf 100644
--- a/apps/web/src/components/ui/sidebar.tsx
+++ b/apps/web/src/components/ui/sidebar.tsx
@@ -783,7 +783,7 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
}
const sidebarMenuButtonVariants = cva(
- "peer/menu-button flex w-full cursor-pointer items-center gap-2 overflow-hidden rounded-lg p-2 text-left text-sm outline-hidden ring-ring transition-[width,height,padding] hover:bg-sidebar-row-hover hover:text-sidebar-foreground focus-visible:ring-2 active:bg-sidebar-row-active active:text-sidebar-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pe-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-row-selected data-[active=true]:font-medium data-[active=true]:text-sidebar-foreground data-[state=open]:hover:bg-sidebar-row-hover data-[state=open]:hover:text-sidebar-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg:not([class*='size-'])]:size-4 [&>svg]:shrink-0",
+ "peer/menu-button flex w-full cursor-pointer items-center gap-[var(--sidebar-control-gap)] overflow-hidden rounded-[var(--control-radius)] p-[var(--sidebar-content-inset)] text-left text-sm outline-hidden ring-ring transition-[width,height,padding] hover:bg-sidebar-row-hover hover:text-sidebar-foreground focus-visible:ring-2 active:bg-sidebar-row-active active:text-sidebar-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pe-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-row-selected data-[active=true]:font-medium data-[active=true]:text-sidebar-foreground data-[state=open]:hover:bg-sidebar-row-hover data-[state=open]:hover:text-sidebar-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-[var(--sidebar-content-inset)]! [&>span:last-child]:truncate [&>svg:not([class*='size-'])]:size-4 [&>svg]:shrink-0",
{
defaultVariants: {
size: "default",
diff --git a/apps/web/src/index.css b/apps/web/src/index.css
index 29dd99b8e6d..a856ab1502a 100644
--- a/apps/web/src/index.css
+++ b/apps/web/src/index.css
@@ -77,6 +77,18 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil
:root {
--app-scrollbar-width: 6px;
+ /*
+ * Compact UI geometry. Keep these values semantic so sidebar, palette,
+ * tooltip, and toolbar controls cannot quietly drift apart.
+ */
+ --control-radius: 0.5rem;
+ --sidebar-content-inset: 0.5rem;
+ --sidebar-control-gap: 0.5rem;
+ --sidebar-icon-color: color-mix(in srgb, var(--sidebar-muted-foreground) 60%, var(--sidebar));
+ --sidebar-row-content-inset: 0.5rem;
+ --command-shell-inset: 0.5rem;
+ --command-content-inset: 1rem;
+ --floating-content-inset: 0.75rem;
--glass-blur: 12px;
--glass-opacity: 80%;
--glass-saturation: 1.14;