From 07ce8dea90ec1980dc4c032e11d8371773983507 Mon Sep 17 00:00:00 2001 From: April Hall Date: Tue, 4 Mar 2025 10:30:55 -0500 Subject: [PATCH] build: Update to ShadCN-Svelte V5 --- bun.lockb | Bin 241190 -> 241719 bytes components.json | 9 ++- package.json | 7 +- src/app.css | 55 ++++++++----- src/lib/components/message.svelte | 2 +- src/lib/components/modeSwitcher.svelte | 24 +++--- src/lib/components/prose.svelte | 2 +- src/lib/components/ui/badge/badge.svelte | 45 ++++++++--- src/lib/components/ui/badge/index.ts | 19 +---- src/lib/components/ui/button/button.svelte | 73 ++++++++++++++---- src/lib/components/ui/button/index.ts | 46 ++--------- .../components/ui/card/card-content.svelte | 10 +-- .../ui/card/card-description.svelte | 10 +-- src/lib/components/ui/card/card-footer.svelte | 10 +-- src/lib/components/ui/card/card-header.svelte | 10 +-- src/lib/components/ui/card/card-title.svelte | 24 +++--- src/lib/components/ui/card/card.svelte | 19 +---- src/lib/components/ui/card/index.ts | 2 - .../context-menu-checkbox-item.svelte | 49 ++++++------ .../context-menu/context-menu-content.svelte | 32 ++++---- .../context-menu-group-heading.svelte | 19 +++++ .../ui/context-menu/context-menu-item.svelte | 28 +++---- .../context-menu-radio-item.svelte | 36 ++++----- .../context-menu-separator.svelte | 7 +- .../context-menu/context-menu-shortcut.svelte | 10 +-- .../context-menu-sub-content.svelte | 21 ++--- .../context-menu-sub-trigger.svelte | 32 ++++---- src/lib/components/ui/context-menu/index.ts | 16 ++-- .../ui/dialog/dialog-content.svelte | 38 ++++----- .../ui/dialog/dialog-description.svelte | 9 +-- .../components/ui/dialog/dialog-footer.svelte | 10 +-- .../components/ui/dialog/dialog-header.svelte | 10 +-- .../ui/dialog/dialog-overlay.svelte | 20 ++--- .../components/ui/dialog/dialog-title.svelte | 9 +-- src/lib/components/ui/dialog/index.ts | 8 +- .../dropdown-menu-checkbox-item.svelte | 49 ++++++------ .../dropdown-menu-content.svelte | 40 +++++----- .../dropdown-menu-group-heading.svelte | 15 ++++ .../dropdown-menu/dropdown-menu-item.svelte | 32 +++----- .../dropdown-menu/dropdown-menu-label.svelte | 23 +++--- .../dropdown-menu-radio-item.svelte | 41 +++++----- .../dropdown-menu-separator.svelte | 7 +- .../dropdown-menu-shortcut.svelte | 10 +-- .../dropdown-menu-sub-content.svelte | 24 ++---- .../dropdown-menu-sub-trigger.svelte | 34 ++++---- src/lib/components/ui/dropdown-menu/index.ts | 52 +++++++------ src/lib/components/ui/input/index.ts | 22 ------ src/lib/components/ui/input/input.svelte | 64 +++++++-------- src/lib/components/ui/label/label.svelte | 12 +-- src/lib/components/ui/select/index.ts | 18 ++--- .../ui/select/select-content.svelte | 62 +++++++-------- .../ui/select/select-group-heading.svelte | 8 ++ .../components/ui/select/select-item.svelte | 48 ++++++------ .../select/select-scroll-down-button.svelte | 11 +++ .../ui/select/select-scroll-up-button.svelte | 11 +++ .../ui/select/select-separator.svelte | 10 +-- .../ui/select/select-trigger.svelte | 21 ++--- src/lib/components/ui/separator/index.ts | 7 ++ .../components/ui/separator/separator.svelte | 13 ++++ src/lib/components/ui/sheet/index.ts | 71 +---------------- .../components/ui/sheet/sheet-content.svelte | 71 ++++++++++------- .../ui/sheet/sheet-description.svelte | 9 +-- .../components/ui/sheet/sheet-footer.svelte | 10 +-- .../components/ui/sheet/sheet-header.svelte | 10 +-- .../components/ui/sheet/sheet-overlay.svelte | 20 ++--- .../components/ui/sheet/sheet-title.svelte | 9 +-- src/lib/components/ui/tooltip/index.ts | 3 + .../ui/tooltip/tooltip-content.svelte | 27 +++---- src/lib/components/user.svelte | 18 +++-- src/lib/utils.ts | 47 ----------- .../(main)/channel/[channel]/+page.svelte | 55 +++++++------ tailwind.config.ts | 45 +++++++---- 72 files changed, 822 insertions(+), 928 deletions(-) create mode 100644 src/lib/components/ui/context-menu/context-menu-group-heading.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte create mode 100644 src/lib/components/ui/select/select-group-heading.svelte create mode 100644 src/lib/components/ui/select/select-scroll-down-button.svelte create mode 100644 src/lib/components/ui/select/select-scroll-up-button.svelte create mode 100644 src/lib/components/ui/separator/index.ts create mode 100644 src/lib/components/ui/separator/separator.svelte diff --git a/bun.lockb b/bun.lockb index 87c3dab527fed1706349eacb5c94849d074b8916..4aba811dfba5dedd3f029e12d4aa474581589ca5 100755 GIT binary patch delta 35330 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

v@*)2eI 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 B7rg)g delta 35098 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 diff --git a/components.json b/components.json index 20958c8..6ffaef8 100644 --- a/components.json +++ b/components.json @@ -1,5 +1,5 @@ { - "$schema": "https://shadcn-svelte.com/schema.json", + "$schema": "https://next.shadcn-svelte.com/schema.json", "style": "new-york", "tailwind": { "config": "tailwind.config.ts", @@ -8,7 +8,10 @@ }, "aliases": { "components": "$lib/components", - "utils": "$lib/utils" + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks" }, - "typescript": true + "typescript": true, + "registry": "https://next.shadcn-svelte.com/registry" } diff --git a/package.json b/package.json index dfc67e2..abb5003 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "prettier-plugin-tailwindcss": "^0.6.11", "svelte": "^5.0.0", "svelte-check": "^4.0.0", + "tailwindcss-animate": "^1.0.7", "typescript": "^5.0.0", "typescript-eslint": "^8.20.0" }, @@ -49,11 +50,11 @@ "autoprefixer": "^10.4.20", "better-auth": "^1.1.16", "better-sqlite3": "^11.8.1", - "bits-ui": "0.22.0", + "bits-ui": "^1.3.5", "cassandra-driver": "^4.7.2", "dotenv": "^16.4.7", "express": "^4.21.2", - "lucide-svelte": "^0.474.0", + "lucide-svelte": "^0.477.0", "markdown-it": "^14.1.0", "markdown-it-highlightjs": "^4.2.0", "markdown-it-link-attributes": "^4.0.1", @@ -63,7 +64,7 @@ "socket.io-client": "^4.8.1", "svelte-radix": "^2.0.1", "sveltekit-superforms": "^2.23.1", - "tailwind-merge": "^3.0.1", + "tailwind-merge": "^3.0.2", "tailwind-variants": "^0.3.1", "tailwindcss": "^3.4.17", "tsm": "^2.3.0", diff --git a/src/app.css b/src/app.css index e496cfd..a7811ca 100644 --- a/src/app.css +++ b/src/app.css @@ -1,5 +1,3 @@ -@import '../node_modules/highlight.js/styles/github-dark.min.css'; - @tailwind base; @tailwind components; @tailwind utilities; @@ -15,45 +13,62 @@ :root { --background: 0 0% 100%; --foreground: 20 14.3% 4.1%; - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - --primary: 24 9.8% 10%; - --primary-foreground: 60 9.1% 97.8%; - --secondary: 240 6% 90%; - --secondary-foreground: 24 9.8% 10%; --muted: 60 4.8% 95.9%; --muted-foreground: 25 5.3% 44.7%; - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - --destructive: 0 72.22% 50.59%; - --destructive-foreground: 60 9.1% 97.8%; + --popover: 0 0% 100%; + --popover-foreground: 20 14.3% 4.1%; + --card: 0 0% 100%; + --card-foreground: 20 14.3% 4.1%; --border: 20 5.9% 90%; --input: 20 5.9% 90%; + --primary: 24 9.8% 10%; + --primary-foreground: 60 9.1% 97.8%; + --secondary: 60 4.8% 95.9%; + --secondary-foreground: 24 9.8% 10%; + --accent: 60 4.8% 95.9%; + --accent-foreground: 24 9.8% 10%; + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 60 9.1% 97.8%; --ring: 20 14.3% 4.1%; --radius: 0.5rem; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; } + .dark { --background: 20 14.3% 4.1%; --foreground: 60 9.1% 97.8%; - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; + --muted: 12 6.5% 15.1%; + --muted-foreground: 24 5.4% 63.9%; --popover: 20 14.3% 4.1%; --popover-foreground: 60 9.1% 97.8%; + --card: 20 14.3% 4.1%; + --card-foreground: 60 9.1% 97.8%; + --border: 12 6.5% 15.1%; + --input: 12 6.5% 15.1%; --primary: 60 9.1% 97.8%; --primary-foreground: 24 9.8% 10%; --secondary: 12 6.5% 15.1%; --secondary-foreground: 60 9.1% 97.8%; - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; --accent: 12 6.5% 15.1%; --accent-foreground: 60 9.1% 97.8%; --destructive: 0 62.8% 30.6%; --destructive-foreground: 60 9.1% 97.8%; - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; --ring: 24 5.7% 82.9%; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; } } diff --git a/src/lib/components/message.svelte b/src/lib/components/message.svelte index 0220cf8..1ab6f29 100644 --- a/src/lib/components/message.svelte +++ b/src/lib/components/message.svelte @@ -15,7 +15,7 @@ i: number; } - let { message, imageSrc, user, timestamp, uid, open = $bindable(), closeDialogs, i }: TypeMessage & Props = $props(); + let { message, imageSrc, user, timestamp, uid, open = $bindable(false), closeDialogs, i }: TypeMessage & Props = $props(); function copy(itemName: string, content: string | number) { navigator.clipboard diff --git a/src/lib/components/modeSwitcher.svelte b/src/lib/components/modeSwitcher.svelte index 5ebd49a..1f5a228 100644 --- a/src/lib/components/modeSwitcher.svelte +++ b/src/lib/components/modeSwitcher.svelte @@ -6,14 +6,16 @@ import { toggleMode } from 'mode-watcher'; - - -

- - -

Toggle theme

-
- + + + +
+ + +
+
+ +

Toggle theme

+
+
+
diff --git a/src/lib/components/prose.svelte b/src/lib/components/prose.svelte index a0e860e..17d1f71 100644 --- a/src/lib/components/prose.svelte +++ b/src/lib/components/prose.svelte @@ -9,6 +9,6 @@ const { children, class: className = '' }: Props = $props(); -
+
{@render children()}
diff --git a/src/lib/components/ui/badge/badge.svelte b/src/lib/components/ui/badge/badge.svelte index c2eae1c..cec53de 100644 --- a/src/lib/components/ui/badge/badge.svelte +++ b/src/lib/components/ui/badge/badge.svelte @@ -1,13 +1,40 @@ - - - + + + + {@render children?.()} diff --git a/src/lib/components/ui/badge/index.ts b/src/lib/components/ui/badge/index.ts index 502ad3e..f05fb87 100644 --- a/src/lib/components/ui/badge/index.ts +++ b/src/lib/components/ui/badge/index.ts @@ -1,19 +1,2 @@ -import { type VariantProps, tv } from 'tailwind-variants'; - export { default as Badge } from './badge.svelte'; -export const badgeVariants = tv({ - base: 'focus:ring-ring inline-flex select-none items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2', - variants: { - variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/80 border-transparent shadow', - secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 border-transparent', - destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/80 border-transparent shadow', - outline: 'text-foreground', - }, - }, - defaultVariants: { - variant: 'default', - }, -}); - -export type Variant = VariantProps['variant']; +export { badgeVariants, type BadgeVariant } from './badge.svelte'; diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte index 2e4b156..c327632 100644 --- a/src/lib/components/ui/button/button.svelte +++ b/src/lib/components/ui/button/button.svelte @@ -1,18 +1,63 @@ - - - - + + +{#if href} +
+ {@render children?.()} + +{:else} + +{/if} diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts index affba83..7ceb12a 100644 --- a/src/lib/components/ui/button/index.ts +++ b/src/lib/components/ui/button/index.ts @@ -1,48 +1,12 @@ -import type { Button as ButtonPrimitive } from 'bits-ui'; -import { type VariantProps, tv } from 'tailwind-variants'; -import Root from './button.svelte'; - -const buttonVariants = tv({ - base: 'focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50', - variants: { - variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/90 shadow', - destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm', - outline: 'border-input bg-background hover:bg-accent hover:text-accent-foreground border shadow-sm', - secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-sm', - ghost: 'hover:bg-accent hover:text-accent-foreground', - link: 'text-primary underline-offset-4 hover:underline', - }, - size: { - default: 'h-9 px-4 py-2', - sm: 'h-8 rounded-md px-3 text-xs', - lg: 'h-10 rounded-md px-8', - icon: 'h-9 w-9', - }, - }, - defaultVariants: { - variant: 'default', - size: 'default', - }, -}); - -type Variant = VariantProps['variant']; -type Size = VariantProps['size']; - -type Props = ButtonPrimitive.Props & { - variant?: Variant; - size?: Size; -}; - -type Events = ButtonPrimitive.Events; +import Root, { type ButtonProps, type ButtonSize, type ButtonVariant, buttonVariants } from './button.svelte'; export { Root, - type Props, - type Events, + type ButtonProps as Props, // Root as Button, - type Props as ButtonProps, - type Events as ButtonEvents, buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, }; diff --git a/src/lib/components/ui/card/card-content.svelte b/src/lib/components/ui/card/card-content.svelte index e2dce55..efe3f66 100644 --- a/src/lib/components/ui/card/card-content.svelte +++ b/src/lib/components/ui/card/card-content.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/card/card-description.svelte b/src/lib/components/ui/card/card-description.svelte index bbe3e27..17c4c59 100644 --- a/src/lib/components/ui/card/card-description.svelte +++ b/src/lib/components/ui/card/card-description.svelte @@ -1,13 +1,11 @@ -

- +

+ {@render children?.()}

diff --git a/src/lib/components/ui/card/card-footer.svelte b/src/lib/components/ui/card/card-footer.svelte index 3d6a4b6..3235d77 100644 --- a/src/lib/components/ui/card/card-footer.svelte +++ b/src/lib/components/ui/card/card-footer.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/card/card-header.svelte b/src/lib/components/ui/card/card-header.svelte index c9822c5..53f03c2 100644 --- a/src/lib/components/ui/card/card-header.svelte +++ b/src/lib/components/ui/card/card-header.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/card/card-title.svelte b/src/lib/components/ui/card/card-title.svelte index bed9ca4..203ca81 100644 --- a/src/lib/components/ui/card/card-title.svelte +++ b/src/lib/components/ui/card/card-title.svelte @@ -1,17 +1,19 @@ - - - +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card.svelte b/src/lib/components/ui/card/card.svelte index 617e8d8..ec7e90a 100644 --- a/src/lib/components/ui/card/card.svelte +++ b/src/lib/components/ui/card/card.svelte @@ -1,22 +1,11 @@ - -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts index 1432839..e59c113 100644 --- a/src/lib/components/ui/card/index.ts +++ b/src/lib/components/ui/card/index.ts @@ -20,5 +20,3 @@ export { Header as CardHeader, Title as CardTitle, }; - -export type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; diff --git a/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte b/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte index 2a9dd32..84e6718 100644 --- a/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte +++ b/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte @@ -1,35 +1,40 @@ - - - - - - + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else} + + {/if} + + {@render childrenProp?.()} + {/snippet} diff --git a/src/lib/components/ui/context-menu/context-menu-content.svelte b/src/lib/components/ui/context-menu/context-menu-content.svelte index 1854d60..9d0797f 100644 --- a/src/lib/components/ui/context-menu/context-menu-content.svelte +++ b/src/lib/components/ui/context-menu/context-menu-content.svelte @@ -1,21 +1,21 @@ - - - + + + diff --git a/src/lib/components/ui/context-menu/context-menu-group-heading.svelte b/src/lib/components/ui/context-menu/context-menu-group-heading.svelte new file mode 100644 index 0000000..fcbd758 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-group-heading.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-item.svelte b/src/lib/components/ui/context-menu/context-menu-item.svelte index 3116b73..bb166be 100644 --- a/src/lib/components/ui/context-menu/context-menu-item.svelte +++ b/src/lib/components/ui/context-menu/context-menu-item.svelte @@ -2,14 +2,14 @@ import { ContextMenu as ContextMenuPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = ContextMenuPrimitive.ItemProps & { + let { + ref = $bindable(null), + class: className, + inset, + ...restProps + }: ContextMenuPrimitive.ItemProps & { inset?: boolean; - }; - type $$Events = ContextMenuPrimitive.ItemEvents; - - let className: $$Props['class'] = undefined; - export let inset: $$Props['inset'] = undefined; - export { className as class }; + } = $props(); - - + bind:ref + {...restProps} +/> diff --git a/src/lib/components/ui/context-menu/context-menu-radio-item.svelte b/src/lib/components/ui/context-menu/context-menu-radio-item.svelte index d54c2df..a368982 100644 --- a/src/lib/components/ui/context-menu/context-menu-radio-item.svelte +++ b/src/lib/components/ui/context-menu/context-menu-radio-item.svelte @@ -1,35 +1,25 @@ - - - - - - + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} diff --git a/src/lib/components/ui/context-menu/context-menu-separator.svelte b/src/lib/components/ui/context-menu/context-menu-separator.svelte index c09b2a6..a946601 100644 --- a/src/lib/components/ui/context-menu/context-menu-separator.svelte +++ b/src/lib/components/ui/context-menu/context-menu-separator.svelte @@ -2,10 +2,7 @@ import { ContextMenu as ContextMenuPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = ContextMenuPrimitive.SeparatorProps; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: ContextMenuPrimitive.SeparatorProps = $props(); - + diff --git a/src/lib/components/ui/context-menu/context-menu-shortcut.svelte b/src/lib/components/ui/context-menu/context-menu-shortcut.svelte index 0d54df5..5b82690 100644 --- a/src/lib/components/ui/context-menu/context-menu-shortcut.svelte +++ b/src/lib/components/ui/context-menu/context-menu-shortcut.svelte @@ -1,13 +1,11 @@ - - + + {@render children?.()} diff --git a/src/lib/components/ui/context-menu/context-menu-sub-content.svelte b/src/lib/components/ui/context-menu/context-menu-sub-content.svelte index 424570a..a8647d7 100644 --- a/src/lib/components/ui/context-menu/context-menu-sub-content.svelte +++ b/src/lib/components/ui/context-menu/context-menu-sub-content.svelte @@ -1,23 +1,12 @@ - - + {...restProps} +/> diff --git a/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte b/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte index dfca522..cc8fe7f 100644 --- a/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte +++ b/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte @@ -1,32 +1,28 @@ - - + {@render children?.()} + diff --git a/src/lib/components/ui/context-menu/index.ts b/src/lib/components/ui/context-menu/index.ts index 20b7e98..420c577 100644 --- a/src/lib/components/ui/context-menu/index.ts +++ b/src/lib/components/ui/context-menu/index.ts @@ -1,32 +1,32 @@ import { ContextMenu as ContextMenuPrimitive } from 'bits-ui'; import Item from './context-menu-item.svelte'; -import Label from './context-menu-label.svelte'; +import GroupHeading from './context-menu-group-heading.svelte'; import Content from './context-menu-content.svelte'; import Shortcut from './context-menu-shortcut.svelte'; import RadioItem from './context-menu-radio-item.svelte'; import Separator from './context-menu-separator.svelte'; -import RadioGroup from './context-menu-radio-group.svelte'; import SubContent from './context-menu-sub-content.svelte'; import SubTrigger from './context-menu-sub-trigger.svelte'; import CheckboxItem from './context-menu-checkbox-item.svelte'; -const Sub = ContextMenuPrimitive.Sub; -const Root = ContextMenuPrimitive.Root; -const Trigger = ContextMenuPrimitive.Trigger; -const Group = ContextMenuPrimitive.Group; +const Sub: typeof ContextMenuPrimitive.Sub = ContextMenuPrimitive.Sub; +const Root: typeof ContextMenuPrimitive.Root = ContextMenuPrimitive.Root; +const Trigger: typeof ContextMenuPrimitive.Trigger = ContextMenuPrimitive.Trigger; +const Group: typeof ContextMenuPrimitive.Group = ContextMenuPrimitive.Group; +const RadioGroup: typeof ContextMenuPrimitive.RadioGroup = ContextMenuPrimitive.RadioGroup; export { Sub, Root, Item, - Label, Group, Trigger, Content, Shortcut, Separator, RadioItem, + GroupHeading, SubContent, SubTrigger, RadioGroup, @@ -35,13 +35,13 @@ export { Root as ContextMenu, Sub as ContextMenuSub, Item as ContextMenuItem, - Label as ContextMenuLabel, Group as ContextMenuGroup, Content as ContextMenuContent, Trigger as ContextMenuTrigger, Shortcut as ContextMenuShortcut, RadioItem as ContextMenuRadioItem, Separator as ContextMenuSeparator, + GroupHeading as ContextMenuGroupHeading, RadioGroup as ContextMenuRadioGroup, SubContent as ContextMenuSubContent, SubTrigger as ContextMenuSubTrigger, diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte index aa38f4b..bcba3da 100644 --- a/src/lib/components/ui/dialog/dialog-content.svelte +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -1,35 +1,37 @@ - + - + {@render children?.()} - + Close diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte index de03478..2734fac 100644 --- a/src/lib/components/ui/dialog/dialog-description.svelte +++ b/src/lib/components/ui/dialog/dialog-description.svelte @@ -2,12 +2,7 @@ import { Dialog as DialogPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = DialogPrimitive.DescriptionProps; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: DialogPrimitive.DescriptionProps = $props(); - - - + diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte index c625327..9807551 100644 --- a/src/lib/components/ui/dialog/dialog-footer.svelte +++ b/src/lib/components/ui/dialog/dialog-footer.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte index c0a1367..78b6848 100644 --- a/src/lib/components/ui/dialog/dialog-header.svelte +++ b/src/lib/components/ui/dialog/dialog-header.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte index bdf250c..0384cdf 100644 --- a/src/lib/components/ui/dialog/dialog-overlay.svelte +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -1,21 +1,15 @@ diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte index c514c31..be3b676 100644 --- a/src/lib/components/ui/dialog/dialog-title.svelte +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -2,12 +2,7 @@ import { Dialog as DialogPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = DialogPrimitive.TitleProps; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: DialogPrimitive.TitleProps = $props(); - - - + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts index 707a04e..0c8f363 100644 --- a/src/lib/components/ui/dialog/index.ts +++ b/src/lib/components/ui/dialog/index.ts @@ -1,16 +1,16 @@ import { Dialog as DialogPrimitive } from 'bits-ui'; import Title from './dialog-title.svelte'; -import Portal from './dialog-portal.svelte'; import Footer from './dialog-footer.svelte'; import Header from './dialog-header.svelte'; import Overlay from './dialog-overlay.svelte'; import Content from './dialog-content.svelte'; import Description from './dialog-description.svelte'; -const Root = DialogPrimitive.Root; -const Trigger = DialogPrimitive.Trigger; -const Close = DialogPrimitive.Close; +const Root: typeof DialogPrimitive.Root = DialogPrimitive.Root; +const Trigger: typeof DialogPrimitive.Trigger = DialogPrimitive.Trigger; +const Close: typeof DialogPrimitive.Close = DialogPrimitive.Close; +const Portal: typeof DialogPrimitive.Portal = DialogPrimitive.Portal; export { Root, diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte index 09e492b..e8ddeda 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -1,35 +1,40 @@ - - - - - - + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else} + + {/if} + + {@render childrenProp?.()} + {/snippet} 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 c1df3d6..bf00726 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -1,23 +1,27 @@ - - - + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte new file mode 100644 index 0000000..cb923b1 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte index 070937e..a69fe56 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -1,31 +1,23 @@ svg]:size-4 [&>svg]:shrink-0', inset && 'pl-8', className, )} - on:click - on:keydown - on:focusin - on:focusout - on:pointerdown - on:pointerleave - on:pointermove - {...$$restProps} -> - - + {...restProps} +/> diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte index 37647b6..f47636f 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -1,16 +1,19 @@ - - - +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte index dcf0e96..e7694a7 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -1,35 +1,30 @@ - - - - - - + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte index dbf2184..8aaff32 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -2,10 +2,7 @@ import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = DropdownMenuPrimitive.SeparatorProps; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: DropdownMenuPrimitive.SeparatorProps = $props(); - + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte index 454af6c..bc5acb0 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -1,13 +1,11 @@ - - + + {@render children?.()} 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 08402a9..087e948 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 @@ -1,26 +1,12 @@ - - + {...restProps} +/> diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte index bf826c9..f26e730 100644 --- a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -1,32 +1,28 @@ - - + {@render children?.()} + diff --git a/src/lib/components/ui/dropdown-menu/index.ts b/src/lib/components/ui/dropdown-menu/index.ts index 22001e4..d3fe7c9 100644 --- a/src/lib/components/ui/dropdown-menu/index.ts +++ b/src/lib/components/ui/dropdown-menu/index.ts @@ -1,48 +1,50 @@ import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui'; +import CheckboxItem from './dropdown-menu-checkbox-item.svelte'; +import Content from './dropdown-menu-content.svelte'; +import GroupHeading from './dropdown-menu-group-heading.svelte'; import Item from './dropdown-menu-item.svelte'; import Label from './dropdown-menu-label.svelte'; -import Content from './dropdown-menu-content.svelte'; -import Shortcut from './dropdown-menu-shortcut.svelte'; import RadioItem from './dropdown-menu-radio-item.svelte'; import Separator from './dropdown-menu-separator.svelte'; -import RadioGroup from './dropdown-menu-radio-group.svelte'; +import Shortcut from './dropdown-menu-shortcut.svelte'; import SubContent from './dropdown-menu-sub-content.svelte'; import SubTrigger from './dropdown-menu-sub-trigger.svelte'; -import CheckboxItem from './dropdown-menu-checkbox-item.svelte'; const Sub = DropdownMenuPrimitive.Sub; const Root = DropdownMenuPrimitive.Root; const Trigger = DropdownMenuPrimitive.Trigger; const Group = DropdownMenuPrimitive.Group; +const RadioGroup = DropdownMenuPrimitive.RadioGroup; export { - Sub, - Root, - Item, - Label, - Group, - Trigger, - Content, - Shortcut, - Separator, - RadioItem, - SubContent, - SubTrigger, - RadioGroup, CheckboxItem, - // + Content, Root as DropdownMenu, - Sub as DropdownMenuSub, + CheckboxItem as DropdownMenuCheckboxItem, + Content as DropdownMenuContent, + Group as DropdownMenuGroup, + GroupHeading as DropdownMenuGroupHeading, Item as DropdownMenuItem, Label as DropdownMenuLabel, - Group as DropdownMenuGroup, - Content as DropdownMenuContent, - Trigger as DropdownMenuTrigger, - Shortcut as DropdownMenuShortcut, + RadioGroup as DropdownMenuRadioGroup, RadioItem as DropdownMenuRadioItem, Separator as DropdownMenuSeparator, - RadioGroup as DropdownMenuRadioGroup, + Shortcut as DropdownMenuShortcut, + Sub as DropdownMenuSub, SubContent as DropdownMenuSubContent, SubTrigger as DropdownMenuSubTrigger, - CheckboxItem as DropdownMenuCheckboxItem, + Trigger as DropdownMenuTrigger, + Group, + GroupHeading, + Item, + Label, + RadioGroup, + RadioItem, + Root, + Separator, + Shortcut, + Sub, + SubContent, + SubTrigger, + Trigger, }; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts index 1d669f9..0888f0e 100644 --- a/src/lib/components/ui/input/index.ts +++ b/src/lib/components/ui/input/index.ts @@ -1,27 +1,5 @@ import Root from './input.svelte'; -export type FormInputEvent = T & { - currentTarget: EventTarget & HTMLInputElement; -}; -export type InputEvents = { - blur: FormInputEvent; - change: FormInputEvent; - click: FormInputEvent; - focus: FormInputEvent; - focusin: FormInputEvent; - focusout: FormInputEvent; - keydown: FormInputEvent; - keypress: FormInputEvent; - keyup: FormInputEvent; - mouseover: FormInputEvent; - mouseenter: FormInputEvent; - mouseleave: FormInputEvent; - mousemove: FormInputEvent; - paste: FormInputEvent; - input: FormInputEvent; - wheel: FormInputEvent; -}; - export { Root, // diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte index eaf3844..29a4ea6 100644 --- a/src/lib/components/ui/input/input.svelte +++ b/src/lib/components/ui/input/input.svelte @@ -1,42 +1,36 @@ - +{#if type === 'file'} + +{:else} + +{/if} diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte index 55573a5..0500d9b 100644 --- a/src/lib/components/ui/label/label.svelte +++ b/src/lib/components/ui/label/label.svelte @@ -2,15 +2,11 @@ import { Label as LabelPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = LabelPrimitive.Props; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: LabelPrimitive.RootProps = $props(); - - + {...restProps} +/> diff --git a/src/lib/components/ui/select/index.ts b/src/lib/components/ui/select/index.ts index d672aa6..4aa4c5f 100644 --- a/src/lib/components/ui/select/index.ts +++ b/src/lib/components/ui/select/index.ts @@ -1,34 +1,34 @@ import { Select as SelectPrimitive } from 'bits-ui'; -import Label from './select-label.svelte'; +import GroupHeading from './select-group-heading.svelte'; import Item from './select-item.svelte'; import Content from './select-content.svelte'; import Trigger from './select-trigger.svelte'; import Separator from './select-separator.svelte'; +import ScrollDownButton from './select-scroll-down-button.svelte'; +import ScrollUpButton from './select-scroll-up-button.svelte'; const Root = SelectPrimitive.Root; const Group = SelectPrimitive.Group; -const Input = SelectPrimitive.Input; -const Value = SelectPrimitive.Value; export { Root, Item, Group, - Input, - Label, - Value, + GroupHeading, Content, Trigger, Separator, + ScrollDownButton, + ScrollUpButton, // Root as Select, Item as SelectItem, Group as SelectGroup, - Input as SelectInput, - Label as SelectLabel, - Value as SelectValue, + GroupHeading as SelectGroupHeading, Content as SelectContent, Trigger as SelectTrigger, Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, }; diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte index c7183c4..a2feeb9 100644 --- a/src/lib/components/ui/select/select-content.svelte +++ b/src/lib/components/ui/select/select-content.svelte @@ -1,36 +1,34 @@ - -
- -
-
+ + + + + {@render children?.()} + + + + diff --git a/src/lib/components/ui/select/select-group-heading.svelte b/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 0000000..1f801b6 --- /dev/null +++ b/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/lib/components/ui/select/select-item.svelte b/src/lib/components/ui/select/select-item.svelte index 5314c33..aad5286 100644 --- a/src/lib/components/ui/select/select-item.svelte +++ b/src/lib/components/ui/select/select-item.svelte @@ -1,37 +1,37 @@ - - - - - - - {label || value} - + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} diff --git a/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 0000000..866364b --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 0000000..171228c --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/lib/components/ui/select/select-separator.svelte b/src/lib/components/ui/select/select-separator.svelte index 743a5ab..f4af89d 100644 --- a/src/lib/components/ui/select/select-separator.svelte +++ b/src/lib/components/ui/select/select-separator.svelte @@ -1,11 +1,9 @@ - + diff --git a/src/lib/components/ui/select/select-trigger.svelte b/src/lib/components/ui/select/select-trigger.svelte index bbc4722..ba3a768 100644 --- a/src/lib/components/ui/select/select-trigger.svelte +++ b/src/lib/components/ui/select/select-trigger.svelte @@ -1,24 +1,19 @@ span]:line-clamp-1 data-[placeholder]:[&>span]:text-muted-foreground', + 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1', className, )} - {...$$restProps} + {...restProps} > - -
- -
+ {@render children?.()} +
diff --git a/src/lib/components/ui/separator/index.ts b/src/lib/components/ui/separator/index.ts new file mode 100644 index 0000000..56b2767 --- /dev/null +++ b/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from './separator.svelte'; + +export { + Root, + // + Root as Separator, +}; diff --git a/src/lib/components/ui/separator/separator.svelte b/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 0000000..52d7e39 --- /dev/null +++ b/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,13 @@ + + + diff --git a/src/lib/components/ui/sheet/index.ts b/src/lib/components/ui/sheet/index.ts index ffd7444..36744d2 100644 --- a/src/lib/components/ui/sheet/index.ts +++ b/src/lib/components/ui/sheet/index.ts @@ -1,7 +1,5 @@ import { Dialog as SheetPrimitive } from 'bits-ui'; -import { type VariantProps, tv } from 'tailwind-variants'; -import Portal from './sheet-portal.svelte'; import Overlay from './sheet-overlay.svelte'; import Content from './sheet-content.svelte'; import Header from './sheet-header.svelte'; @@ -12,6 +10,7 @@ import Description from './sheet-description.svelte'; const Root = SheetPrimitive.Root; const Close = SheetPrimitive.Close; const Trigger = SheetPrimitive.Trigger; +const Portal = SheetPrimitive.Portal; export { Root, @@ -36,71 +35,3 @@ export { Title as SheetTitle, Description as SheetDescription, }; - -export const sheetVariants = tv({ - base: 'bg-background fixed z-50 gap-4 p-6 shadow-lg', - variants: { - side: { - top: 'inset-x-0 top-0 border-b ', - bottom: 'inset-x-0 bottom-0 border-t', - left: 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm', - right: 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm', - }, - }, - defaultVariants: { - side: 'right', - }, -}); - -export const sheetTransitions = { - top: { - in: { - y: '-100%', - duration: 500, - opacity: 1, - }, - out: { - y: '-100%', - duration: 300, - opacity: 1, - }, - }, - bottom: { - in: { - y: '100%', - duration: 500, - opacity: 1, - }, - out: { - y: '100%', - duration: 300, - opacity: 1, - }, - }, - left: { - in: { - x: '-100%', - duration: 500, - opacity: 1, - }, - out: { - x: '-100%', - duration: 300, - opacity: 1, - }, - }, - right: { - in: { - x: '100%', - duration: 500, - opacity: 1, - }, - out: { - x: '100%', - duration: 300, - opacity: 1, - }, - }, -}; - -export type Side = VariantProps['side']; diff --git a/src/lib/components/ui/sheet/sheet-content.svelte b/src/lib/components/ui/sheet/sheet-content.svelte index 4075dd6..cffc4d5 100644 --- a/src/lib/components/ui/sheet/sheet-content.svelte +++ b/src/lib/components/ui/sheet/sheet-content.svelte @@ -1,39 +1,54 @@ - - + + + - - + + {@render children?.()} - + Close - + diff --git a/src/lib/components/ui/sheet/sheet-description.svelte b/src/lib/components/ui/sheet/sheet-description.svelte index 99ed1b9..316e1de 100644 --- a/src/lib/components/ui/sheet/sheet-description.svelte +++ b/src/lib/components/ui/sheet/sheet-description.svelte @@ -2,12 +2,7 @@ import { Dialog as SheetPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = SheetPrimitive.DescriptionProps; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: SheetPrimitive.DescriptionProps = $props(); - - - + diff --git a/src/lib/components/ui/sheet/sheet-footer.svelte b/src/lib/components/ui/sheet/sheet-footer.svelte index c625327..9807551 100644 --- a/src/lib/components/ui/sheet/sheet-footer.svelte +++ b/src/lib/components/ui/sheet/sheet-footer.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/sheet/sheet-header.svelte b/src/lib/components/ui/sheet/sheet-header.svelte index ac2ca13..f504415 100644 --- a/src/lib/components/ui/sheet/sheet-header.svelte +++ b/src/lib/components/ui/sheet/sheet-header.svelte @@ -1,13 +1,11 @@ -
- +
+ {@render children?.()}
diff --git a/src/lib/components/ui/sheet/sheet-overlay.svelte b/src/lib/components/ui/sheet/sheet-overlay.svelte index 4aa6d29..4c195f3 100644 --- a/src/lib/components/ui/sheet/sheet-overlay.svelte +++ b/src/lib/components/ui/sheet/sheet-overlay.svelte @@ -1,21 +1,15 @@ diff --git a/src/lib/components/ui/sheet/sheet-title.svelte b/src/lib/components/ui/sheet/sheet-title.svelte index 11267e6..844f367 100644 --- a/src/lib/components/ui/sheet/sheet-title.svelte +++ b/src/lib/components/ui/sheet/sheet-title.svelte @@ -2,12 +2,7 @@ import { Dialog as SheetPrimitive } from 'bits-ui'; import { cn } from '$lib/utils.js'; - type $$Props = SheetPrimitive.TitleProps; - - let className: $$Props['class'] = undefined; - export { className as class }; + let { ref = $bindable(null), class: className, ...restProps }: SheetPrimitive.TitleProps = $props(); - - - + diff --git a/src/lib/components/ui/tooltip/index.ts b/src/lib/components/ui/tooltip/index.ts index 7e883a8..9e66d3a 100644 --- a/src/lib/components/ui/tooltip/index.ts +++ b/src/lib/components/ui/tooltip/index.ts @@ -3,13 +3,16 @@ import Content from './tooltip-content.svelte'; const Root = TooltipPrimitive.Root; const Trigger = TooltipPrimitive.Trigger; +const Provider = TooltipPrimitive.Provider; export { Root, Trigger, Content, + Provider, // Root as Tooltip, Content as TooltipContent, Trigger as TooltipTrigger, + Provider as TooltipProvider, }; diff --git a/src/lib/components/ui/tooltip/tooltip-content.svelte b/src/lib/components/ui/tooltip/tooltip-content.svelte index d4b55a7..accf202 100644 --- a/src/lib/components/ui/tooltip/tooltip-content.svelte +++ b/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -1,25 +1,16 @@ - - + class={cn( + 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + className, + )} + {...restProps} +/> diff --git a/src/lib/components/user.svelte b/src/lib/components/user.svelte index 37d6559..0a883b6 100644 --- a/src/lib/components/user.svelte +++ b/src/lib/components/user.svelte @@ -18,13 +18,15 @@

{data.user.username}

- - - - - -

Account Settings

-
-
+ + + + + + +

Account Settings

+
+
+
{/if} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index c41f31e..9ad0df4 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,53 +1,6 @@ import { type ClassValue, clsx } from 'clsx'; -import { cubicOut } from 'svelte/easing'; -import type { TransitionConfig } from 'svelte/transition'; import { twMerge } from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } - -type FlyAndScaleParams = { - y?: number; - x?: number; - start?: number; - duration?: number; -}; - -export const flyAndScale = (node: Element, params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }): TransitionConfig => { - const style = getComputedStyle(node); - const transform = style.transform === 'none' ? '' : style.transform; - - const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => { - const [minA, maxA] = scaleA; - const [minB, maxB] = scaleB; - - const percentage = (valueA - minA) / (maxA - minA); - const valueB = percentage * (maxB - minB) + minB; - - return valueB; - }; - - const styleToString = (style: Record): string => { - return Object.keys(style).reduce((str, key) => { - if (style[key] === undefined) return str; - return str + `${key}:${style[key]};`; - }, ''); - }; - - return { - duration: params.duration ?? 200, - delay: 0, - css: (t) => { - const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); - const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); - const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); - - return styleToString({ - transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, - opacity: t, - }); - }, - easing: cubicOut, - }; -}; diff --git a/src/routes/(main)/channel/[channel]/+page.svelte b/src/routes/(main)/channel/[channel]/+page.svelte index 3257a5e..db81cc6 100644 --- a/src/routes/(main)/channel/[channel]/+page.svelte +++ b/src/routes/(main)/channel/[channel]/+page.svelte @@ -20,7 +20,14 @@ const channel: string = $derived(page.params.channel); let textareaRef: HTMLTextAreaElement | undefined = $state(); let formref: HTMLFormElement | undefined = $state(); - let contextMenus: boolean[] = $state([]); + let contextMenus: boolean[] = $state(Array(data.messages.length).fill(false)); + + $effect(() => { + const totalMessages = (socket?.messages?.length || 0) + data.messages.length; + if (contextMenus.length !== totalMessages) { + contextMenus = Array(totalMessages).fill(false); + } + }); function askNotificationPermission() { // Check if the browser supports notifications @@ -84,19 +91,21 @@
{#if data.messages.length != 0 || socket?.messages.length != 0}
- - {#each [...(socket?.messages ?? []), ...data.messages] as message, i} - - {/each} + {#if contextMenus.length === (socket?.messages?.length || 0) + data.messages.length} + + {#each [...(socket?.messages ?? []), ...data.messages] as message, i} + + {/each} + {/if}
{:else} @@ -112,13 +121,15 @@ shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50" > - - - - - -

Send

-
-
+ + + + + + +

Send

+
+
+
diff --git a/tailwind.config.ts b/tailwind.config.ts index f2ec7f9..4e96cd4 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,6 +1,6 @@ import { fontFamily } from 'tailwindcss/defaultTheme'; import type { Config } from 'tailwindcss'; -import typography from '@tailwindcss/typography'; +import tailwindcssAnimate from 'tailwindcss-animate'; const config: Config = { darkMode: ['class'], @@ -49,31 +49,48 @@ const config: Config = { DEFAULT: 'hsl(var(--card) / )', foreground: 'hsl(var(--card-foreground) / )', }, + sidebar: { + DEFAULT: 'hsl(var(--sidebar-background))', + foreground: 'hsl(var(--sidebar-foreground))', + primary: 'hsl(var(--sidebar-primary))', + 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', + accent: 'hsl(var(--sidebar-accent))', + 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', + border: 'hsl(var(--sidebar-border))', + ring: 'hsl(var(--sidebar-ring))', + }, }, borderRadius: { + xl: 'calc(var(--radius) + 4px)', lg: 'var(--radius)', md: 'calc(var(--radius) - 2px)', - 'background-color': '#22272E', sm: 'calc(var(--radius) - 4px)', }, fontFamily: { sans: [...fontFamily.sans], }, - typography: () => ({ - DEFAULT: { - css: { - pre: { - 'background-color': '#22272E', - code: { - 'background-color': '#22272E', - }, - }, - }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--bits-accordion-content-height)' }, }, - }), + 'accordion-up': { + from: { height: 'var(--bits-accordion-content-height)' }, + to: { height: '0' }, + }, + 'caret-blink': { + '0%,70%,100%': { opacity: '1' }, + '20%,50%': { opacity: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + 'caret-blink': 'caret-blink 1.25s ease-out infinite', + }, }, }, - plugins: [typography], + plugins: [tailwindcssAnimate], }; export default config;