From 0a95ef2a97f91a77a530bce5d12a48fa0b92d0a3 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 01/27] feat(motion): add shared easing tokens and reduce-motion handling --- src/app.css | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/app.css b/src/app.css index 73e4afea..9553809c 100644 --- a/src/app.css +++ b/src/app.css @@ -21,6 +21,13 @@ "editor font" and everything else. JetBrains Mono is a true code typeface: heavier, even rhythm, designed ligatures. */ --editor-font-family: "JetBrains Mono Variable", "Geist Mono Variable", ui-monospace, monospace; + /* Motion tokens — stronger-than-default curves (Emil Kowalski). These override + Tailwind's built-in --ease-out / --ease-in-out so the `ease-out` / `ease-in-out` + utilities (and tw-animate-css enter/exit keyframes, which read --tw-ease) all + inherit the punchier curves. Only transform/opacity should ride these. */ + --ease-out: cubic-bezier(0.23, 1, 0.32, 1); + --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); + --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); } /* JSON colorizer tokens (highlightJson) — dark-friendly defaults, light override @@ -100,6 +107,28 @@ html[data-os="linux"] { --window-radius: 8px; } @apply border-border outline-ring/50; } + /* Reduced motion — reduced, not zero (Emil / WCAG). Keep opacity + colour + fades that aid comprehension; strip movement. Neutralising tw-animate-css's + enter/exit transform vars makes overlays fade in place instead of + sliding/zooming, and clamping durations keeps any remaining transition brief. */ + @media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + --tw-enter-translate-x: 0 !important; + --tw-enter-translate-y: 0 !important; + --tw-exit-translate-x: 0 !important; + --tw-exit-translate-y: 0 !important; + --tw-enter-scale: 1 !important; + --tw-exit-scale: 1 !important; + --tw-enter-rotate: 0 !important; + --tw-exit-rotate: 0 !important; + animation-duration: 0.12s !important; + transition-duration: 0.12s !important; + scroll-behavior: auto !important; + } + } + /* Disable OS word suggestions, autocorrect, and spellcheck on all inputs. */ input:not([type="file"]), textarea { From eb2e0e24c33924c30bef02a0b6f6eafc09fe21f5 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 02/27] feat(ui): add press feedback to buttons --- src/lib/components/ui/button/button.svelte | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte index 0174c978..49f9a3bf 100644 --- a/src/lib/components/ui/button/button.svelte +++ b/src/lib/components/ui/button/button.svelte @@ -3,14 +3,14 @@ import { tv } from "tailwind-variants"; export const buttonVariants = tv({ - base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-lg border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 active:not-aria-[haspopup]:translate-y-px aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-all outline-none select-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", + base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-lg border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 active:not-aria-[haspopup]:translate-y-px aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-[transform,color,background-color,border-color,box-shadow] duration-150 ease-out outline-none select-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", variants: { variant: { - default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", - outline: "border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground", - secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80 active:scale-[0.97]", + outline: "border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground active:scale-[0.97]", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground active:scale-[0.97]", ghost: "hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground", - destructive: "bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30", + destructive: "bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30 active:scale-[0.97]", link: "text-primary underline-offset-4 hover:underline", }, size: { From 99f0af7b7bffac2cd3117e3dde4c74b2bc529423 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 03/27] feat(ui): crisp single-ring input focus state --- src/lib/components/ui/input/input.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte index 23efba38..43fa6108 100644 --- a/src/lib/components/ui/input/input.svelte +++ b/src/lib/components/ui/input/input.svelte @@ -19,7 +19,7 @@ bind:this={ref} data-slot={dataSlot} class={cn( - "dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/25 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-9 rounded-lg border bg-transparent px-3 py-1 text-base transition-[color,box-shadow,border-color] hover:border-ring/40 file:h-6 file:text-sm file:font-medium focus-visible:ring-2 aria-invalid:ring-1 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", + "dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/60 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-9 rounded-lg border bg-transparent px-3 py-1 text-base transition-[color,box-shadow,border-color] hover:border-ring/40 file:h-6 file:text-sm file:font-medium focus-visible:ring-1 aria-invalid:ring-1 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", className )} type="file" @@ -32,7 +32,7 @@ bind:this={ref} data-slot={dataSlot} class={cn( - "dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/25 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-9 rounded-lg border bg-transparent px-3 py-1 text-base transition-[color,box-shadow,border-color] hover:border-ring/40 file:h-6 file:text-sm file:font-medium focus-visible:ring-2 aria-invalid:ring-1 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", + "dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/60 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-9 rounded-lg border bg-transparent px-3 py-1 text-base transition-[color,box-shadow,border-color] hover:border-ring/40 file:h-6 file:text-sm file:font-medium focus-visible:ring-1 aria-invalid:ring-1 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", className )} {type} From 9c05c3075983ba80a43d9f3dd9c01017c43c6b7f Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 04/27] feat(ui): origin-aware dropdown menu motion --- .../components/ui/dropdown-menu/dropdown-menu-content.svelte | 2 +- .../ui/dropdown-menu/dropdown-menu-sub-content.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte index 16e9a960..4c1a53ba 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -19,7 +19,7 @@ {sideOffset} {align} class={cn( - "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 border border-border/60 bg-popover text-popover-foreground min-w-36 rounded-lg p-1 shadow-sm duration-100 data-[side=inline-start]:slide-in-from-right-1 data-[side=inline-end]:slide-in-from-left-1 z-50 w-(--bits-dropdown-menu-anchor-width) overflow-x-hidden overflow-y-auto outline-none data-closed:overflow-hidden", + "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-open:zoom-in-[0.96] data-closed:zoom-out-[0.96] [transform-origin:var(--bits-floating-transform-origin)] ease-out duration-150 border border-border/60 bg-popover text-popover-foreground min-w-36 rounded-lg p-1 shadow-sm z-50 w-(--bits-dropdown-menu-anchor-width) overflow-x-hidden overflow-y-auto outline-none data-closed:overflow-hidden", className )} {...restProps} diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte index 71871e3b..9e258a7d 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -12,6 +12,6 @@ \ No newline at end of file From 282d6bb91c6f7368ffb6f737099dc7c86d66844f Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 05/27] feat(ui): origin-aware select motion --- src/lib/components/ui/select/select-content.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte index d840440a..5eb19ad2 100644 --- a/src/lib/components/ui/select/select-content.svelte +++ b/src/lib/components/ui/select/select-content.svelte @@ -22,7 +22,7 @@ {preventScroll} data-slot="select-content" class={cn( - "bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 border border-border/60 min-w-36 rounded-lg shadow-sm duration-100 data-[side=inline-start]:slide-in-from-right-1 data-[side=inline-end]:slide-in-from-left-1 relative isolate z-50 overflow-x-hidden overflow-y-auto", + "bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-open:zoom-in-[0.96] data-closed:zoom-out-[0.96] [transform-origin:var(--bits-floating-transform-origin)] ease-out duration-150 border border-border/60 min-w-36 rounded-lg shadow-sm relative isolate z-50 overflow-x-hidden overflow-y-auto", className )} {...restProps} From 10b652545a15fbf7e1984044bfd4b7d440ee84f6 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 06/27] feat(ui): origin-aware popover motion --- src/lib/components/ui/popover/popover-content.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/ui/popover/popover-content.svelte b/src/lib/components/ui/popover/popover-content.svelte index e06c9a90..cd63f470 100644 --- a/src/lib/components/ui/popover/popover-content.svelte +++ b/src/lib/components/ui/popover/popover-content.svelte @@ -17,7 +17,7 @@ {sideOffset} {align} class={cn( - "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 z-50 rounded-lg border border-border/60 bg-popover p-0 shadow-sm outline-none duration-100", + "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-open:zoom-in-[0.96] data-closed:zoom-out-[0.96] [transform-origin:var(--bits-floating-transform-origin)] ease-out duration-150 z-50 rounded-lg border border-border/60 bg-popover p-0 shadow-sm outline-none", className )} {...restProps} From f4cb4412b35b137c69b173b376e4b3eee151f4f1 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 07/27] feat(ui): quicker tooltip motion --- src/lib/components/ui/tooltip/tooltip-content.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/ui/tooltip/tooltip-content.svelte b/src/lib/components/ui/tooltip/tooltip-content.svelte index 001b3e70..e418db26 100644 --- a/src/lib/components/ui/tooltip/tooltip-content.svelte +++ b/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -17,7 +17,7 @@ {side} {sideOffset} class={cn( - "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 z-50 rounded-lg border border-border/60 bg-popover px-2.5 py-2 shadow-md outline-none duration-100", + "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-open:zoom-in-[0.96] data-closed:zoom-out-[0.96] [transform-origin:var(--bits-floating-transform-origin)] ease-out duration-[125ms] z-50 rounded-lg border border-border/60 bg-popover px-2.5 py-2 shadow-md outline-none", className )} {...restProps} From 3ff138d5cd2cf9fbb7c2e4db16966fda2eff5333 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 08/27] feat(ui): refine dialog enter/exit and overlay fade --- src/lib/components/ui/dialog/dialog-content.svelte | 2 +- src/lib/components/ui/dialog/dialog-overlay.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte index eba4e573..fe48f5e1 100644 --- a/src/lib/components/ui/dialog/dialog-content.svelte +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -42,7 +42,7 @@ data-slot="dialog-content" onCloseAutoFocus={handleCloseAutoFocus} class={cn( - "bg-background text-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-[0.98] data-open:zoom-in-[0.98] flex flex-col gap-4 rounded-xl border border-border/60 p-5 text-sm shadow-lg duration-100 w-full max-w-[calc(100%-2rem)] fixed top-1/2 left-1/2 z-50 -translate-x-1/2 -translate-y-1/2 outline-none", + "bg-background text-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-[0.95] data-open:zoom-in-[0.95] ease-out duration-200 flex flex-col gap-4 rounded-xl border border-border/60 p-5 text-sm shadow-lg w-full max-w-[calc(100%-2rem)] fixed top-1/2 left-1/2 z-50 -translate-x-1/2 -translate-y-1/2 outline-none", className )} {...restProps} diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte index 81da4b1e..bf5007a3 100644 --- a/src/lib/components/ui/dialog/dialog-overlay.svelte +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -13,7 +13,7 @@ bind:ref data-slot="dialog-overlay" class={cn( - "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/65 duration-150 fixed inset-0 isolate z-50", + "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 ease-out bg-black/65 duration-150 fixed inset-0 isolate z-50", className )} {...restProps} From 5bf92a527b87953be9e2d85bc79ca46faa880880 Mon Sep 17 00:00:00 2001 From: broisnischal Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 09/27] perf(ui): keep command palette open/close snappy --- src/lib/components/ui/command/command-dialog.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/ui/command/command-dialog.svelte b/src/lib/components/ui/command/command-dialog.svelte index 47a1525c..1343c921 100644 --- a/src/lib/components/ui/command/command-dialog.svelte +++ b/src/lib/components/ui/command/command-dialog.svelte @@ -26,7 +26,7 @@ Date: Fri, 10 Jul 2026 12:10:15 +0545 Subject: [PATCH 10/27] feat(sidebar): baseline-align rows, raise contrast, refine section headers --- src/lib/components/Sidebar.svelte | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/lib/components/Sidebar.svelte b/src/lib/components/Sidebar.svelte index 768da45f..6a1c16e9 100644 --- a/src/lib/components/Sidebar.svelte +++ b/src/lib/components/Sidebar.svelte @@ -419,7 +419,7 @@ /** Shared field chrome for schema select + table filter (aligned in sidebar grid) */ const sidebarFieldClass = - "h-7 w-full min-w-0 rounded-md border border-border bg-background/40 text-ui-sm text-foreground shadow-none transition-colors hover:bg-background/55 focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/30"; + "h-7 w-full min-w-0 rounded-md border border-border bg-background/40 text-ui-sm text-foreground shadow-none transition-colors hover:bg-background/55 focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring"; { @@ -734,7 +734,7 @@ )} /> - Recent + Recent {Math.min(recentTabs.length, 5)} @@ -1260,7 +1260,7 @@ )} /> Materialized Views {#if matViews.length > 0} @@ -1289,7 +1289,7 @@ ? "bg-primary/10 text-foreground" : activeTable === mv.name ? "bg-sidebar-accent text-sidebar-accent-foreground" - : "text-muted-foreground hover:bg-sidebar-accent/50 hover:text-foreground", + : "text-foreground/70 hover:bg-sidebar-accent/50 hover:text-foreground", )} onclick={() => ontableselect(mv.name)} > @@ -1308,9 +1308,9 @@