From 8ce308ed36651481e7718b0237c6fbbc618d0263 Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 08:55:49 +0530 Subject: [PATCH 1/9] =?UTF-8?q?=F0=9F=94=A7=20Update=20bits-ui=20to=20vers?= =?UTF-8?q?ion=202.11.3=20and=20svelte-toolbelt=20to=20version=200.10.5=20?= =?UTF-8?q?in=20package.json=20and=20pnpm-lock.yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 44 +++++++++++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 2be0eba24..5a0afac5f 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@sveltejs/vite-plugin-svelte": "6.1.3", "@tailwindcss/vite": "4.1.12", "@types/node": "24.3.0", - "bits-ui": "2.9.4", + "bits-ui": "2.11.3", "clsx": "2.1.1", "eslint": "9.33.0", "eslint-config-prettier": "10.1.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e2b84a73..e1eab5a0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,8 +79,8 @@ importers: specifier: 24.3.0 version: 24.3.0 bits-ui: - specifier: 2.9.4 - version: 2.9.4(@internationalized/date@3.8.2)(svelte@5.38.2) + specifier: 2.11.3 + version: 2.11.3(@internationalized/date@3.8.2)(svelte@5.38.2) clsx: specifier: 2.1.1 version: 2.1.1 @@ -1127,8 +1127,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bits-ui@2.9.4: - resolution: {integrity: sha512-Cqn685P6DDuEyBZT/CWMyS5+8JAnYbctvoEVPcmiut+HUpG3SozVgjoDaUib5VG4ZYUKEi1FPwHxiXo9c6J0PA==} + bits-ui@2.11.3: + resolution: {integrity: sha512-XhTuOgcgFatw2qxd+hIlu3EqfYu9R2FFMeJg8srZo3UVKBdOVWHbT0L3GBH46XsaESkTz3aEjU+BiGVoI/2rnQ==} engines: {node: '>=20'} peerDependencies: '@internationalized/date': ^3.8.1 @@ -2661,6 +2661,11 @@ packages: peerDependencies: svelte: ^5.7.0 + runed@0.31.1: + resolution: {integrity: sha512-v3czcTnO+EJjiPvD4dwIqfTdHLZ8oH0zJheKqAHh9QMViY7Qb29UlAMRpX7ZtHh7AFqV60KmfxaJ9QMy+L1igQ==} + peerDependencies: + svelte: ^5.7.0 + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -2863,17 +2868,17 @@ packages: peerDependencies: svelte: ^5.0.0 - svelte-toolbelt@0.7.1: - resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + svelte-toolbelt@0.10.5: + resolution: {integrity: sha512-8e+eWTgxw1aiLxhDE8Rb1X6AoLitqpJz+WhAul2W7W58C8KoLoJQf1TgQdFPBiCPJ0Jg5y0Zi1uyua9em4VS0w==} engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: - svelte: ^5.0.0 + svelte: ^5.30.2 - svelte-toolbelt@0.9.3: - resolution: {integrity: sha512-HCSWxCtVmv+c6g1ACb8LTwHVbDqLKJvHpo6J8TaqwUme2hj9ATJCpjCPNISR1OCq2Q4U1KT41if9ON0isINQZw==} + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: - svelte: ^5.30.2 + svelte: ^5.0.0 svelte@5.38.2: resolution: {integrity: sha512-iAcp/oFAWauVSGILdD67n7DiwgLHXZzWZIdzl7araRxu72jUr7PFAo2Iie7gXt0IbnlYvhxCb9GT3ZJUquO3PA==} @@ -4173,15 +4178,15 @@ snapshots: balanced-match@1.0.2: {} - bits-ui@2.9.4(@internationalized/date@3.8.2)(svelte@5.38.2): + bits-ui@2.11.3(@internationalized/date@3.8.2)(svelte@5.38.2): dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/dom': 1.7.4 '@internationalized/date': 3.8.2 esm-env: 1.2.2 - runed: 0.29.2(svelte@5.38.2) + runed: 0.31.1(svelte@5.38.2) svelte: 5.38.2 - svelte-toolbelt: 0.9.3(svelte@5.38.2) + svelte-toolbelt: 0.10.5(svelte@5.38.2) tabbable: 6.2.0 body-parser@2.2.0: @@ -5775,6 +5780,11 @@ snapshots: esm-env: 1.2.2 svelte: 5.38.2 + runed@0.31.1(svelte@5.38.2): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.2 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -6023,17 +6033,17 @@ snapshots: runed: 0.28.0(svelte@5.38.2) svelte: 5.38.2 - svelte-toolbelt@0.7.1(svelte@5.38.2): + svelte-toolbelt@0.10.5(svelte@5.38.2): dependencies: clsx: 2.1.1 - runed: 0.23.4(svelte@5.38.2) + runed: 0.29.2(svelte@5.38.2) style-to-object: 1.0.9 svelte: 5.38.2 - svelte-toolbelt@0.9.3(svelte@5.38.2): + svelte-toolbelt@0.7.1(svelte@5.38.2): dependencies: clsx: 2.1.1 - runed: 0.29.2(svelte@5.38.2) + runed: 0.23.4(svelte@5.38.2) style-to-object: 1.0.9 svelte: 5.38.2 From 3c56cb6b55ac9a2a68b2d2edf4b52410620c58a0 Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 08:57:46 +0530 Subject: [PATCH 2/9] =?UTF-8?q?=E2=9C=A8=20Add=20useHasPrimaryTouch=20hook?= =?UTF-8?q?=20to=20detect=20primary=20touch=20capability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/use-has-primary-touch.ts | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/hooks/use-has-primary-touch.ts diff --git a/src/hooks/use-has-primary-touch.ts b/src/hooks/use-has-primary-touch.ts new file mode 100644 index 000000000..80a5e56c5 --- /dev/null +++ b/src/hooks/use-has-primary-touch.ts @@ -0,0 +1,31 @@ +import { browser } from "$app/environment"; +import { writable } from "svelte/store"; + +export function useHasPrimaryTouch() { + const { subscribe, set } = writable(false); + if (!browser) { + return { + subscribe, + destroy: () => {}, + }; + } + const controller = new AbortController(); + const { signal } = controller; + + const handleTouch = () => { + const hasTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0; + const prefersTouch = window.matchMedia("(pointer: coarse)").matches; + set(hasTouch && prefersTouch); + }; + + const mq = window.matchMedia("(pointer: coarse)"); + mq.addEventListener("change", handleTouch, { signal }); + window.addEventListener("pointerdown", handleTouch, { signal }); + + handleTouch(); + + return { + subscribe, + destroy: () => controller.abort(), + }; +} From a4232532bd9f57ae8bfde10691955faf9461eeb1 Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 08:57:56 +0530 Subject: [PATCH 3/9] =?UTF-8?q?=E2=9C=A8=20Enhance=20utility=20types=20in?= =?UTF-8?q?=20cn.ts=20for=20improved=20type=20safety=20and=20flexibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/cn.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/utils/cn.ts b/src/utils/cn.ts index a5ef19350..cf65760e9 100644 --- a/src/utils/cn.ts +++ b/src/utils/cn.ts @@ -1,6 +1,17 @@ -import { clsx, type ClassValue } from "clsx"; +import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; - + export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); + return twMerge(clsx(inputs)); } + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } + ? Omit + : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { + ref?: U | null; +}; \ No newline at end of file From c4cfc1017f40a2e3da57f27f6404c2a87758dc09 Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 08:59:15 +0530 Subject: [PATCH 4/9] =?UTF-8?q?=E2=9C=A8=20Add=20ScrollArea=20and=20Scroll?= =?UTF-8?q?bar=20components=20for=20enhanced=20scroll=20functionality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scroll-area/scroll-area-scrollbar.svelte | 44 ++++++ .../ui/scroll-area/scroll-area.svelte | 141 ++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/components/ui/scroll-area/scroll-area-scrollbar.svelte create mode 100644 src/components/ui/scroll-area/scroll-area.svelte diff --git a/src/components/ui/scroll-area/scroll-area-scrollbar.svelte b/src/components/ui/scroll-area/scroll-area-scrollbar.svelte new file mode 100644 index 000000000..cf6207020 --- /dev/null +++ b/src/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,44 @@ + + +{#if !$hasPrimaryTouch} + + {@render children?.()} + + +{/if} diff --git a/src/components/ui/scroll-area/scroll-area.svelte b/src/components/ui/scroll-area/scroll-area.svelte new file mode 100644 index 000000000..3e0b10a1a --- /dev/null +++ b/src/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,141 @@ + + +{#if $hasPrimaryTouchStore} +
+
+ {@render children?.()} +
+ + {#if maskHeight > 0} + {/if} +
+{:else} + + + {@render children?.()} + + + {#if maskHeight > 0} + + {/if} + + {#if orientation === "vertical" || orientation === "both"} + + {/if} + + {#if orientation === "horizontal" || orientation === "both"} + + {/if} + + +{/if} From 4f5137ba6ec86992276aac02e46dad3c55cd0afa Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 08:59:30 +0530 Subject: [PATCH 5/9] =?UTF-8?q?=E2=9C=A8=20Add=20ScrollAreaMask=20componen?= =?UTF-8?q?t=20for=20customizable=20scroll=20masking=20effects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/scroll-area/scroll-area-mask.svelte | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/components/ui/scroll-area/scroll-area-mask.svelte diff --git a/src/components/ui/scroll-area/scroll-area-mask.svelte b/src/components/ui/scroll-area/scroll-area-mask.svelte new file mode 100644 index 000000000..baf5120f6 --- /dev/null +++ b/src/components/ui/scroll-area/scroll-area-mask.svelte @@ -0,0 +1,50 @@ + + + + From e8d42a7055caf3eddadbde9c92099e55ee4f3778 Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 08:59:35 +0530 Subject: [PATCH 6/9] =?UTF-8?q?=E2=9C=A8=20Introduce=20ScrollArea=20compon?= =?UTF-8?q?ents=20for=20structured=20scroll=20functionality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ui/scroll-area/index.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/components/ui/scroll-area/index.ts diff --git a/src/components/ui/scroll-area/index.ts b/src/components/ui/scroll-area/index.ts new file mode 100644 index 000000000..9ed62cf8f --- /dev/null +++ b/src/components/ui/scroll-area/index.ts @@ -0,0 +1,13 @@ +import Scrollbar from "./scroll-area-scrollbar.svelte"; +import Root from "./scroll-area.svelte"; +import Mask from "./scroll-area-mask.svelte"; + +export { + Root, + Scrollbar, + Mask, + // + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar, + Mask as ScrollAreaMask, +}; From 6264d775cb0b5ec3868c5c8f8338c71dda42cf8d Mon Sep 17 00:00:00 2001 From: SameerJS6 Date: Fri, 26 Sep 2025 09:00:06 +0530 Subject: [PATCH 7/9] =?UTF-8?q?=E2=9C=A8=20Refactor=20PageCard=20to=20inte?= =?UTF-8?q?grate=20Lina=20(ScrollArea)=20for=20improved=20scrolling=20expe?= =?UTF-8?q?rience?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/pageCard.svelte | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/pageCard.svelte b/src/components/pageCard.svelte index bae893897..870f874f3 100644 --- a/src/components/pageCard.svelte +++ b/src/components/pageCard.svelte @@ -1,6 +1,8 @@
@@ -11,17 +13,25 @@ class={cn( "md:fixed md:left-1 md:h-[calc(100vh-4.5rem)]", "overflow-x-hidden", - "w-54 pr-2 pl-2", + "w-54", "hidden flex-col space-y-3 md:flex", "bg-neutral-100 dark:bg-neutral-950", )} > -