-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
454 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,12 @@ | ||
<template> | ||
<div> | ||
<NuxtWelcome /> | ||
<NuxtLayout> | ||
<NuxtPage /> | ||
</NuxtLayout> | ||
<Toaster /> | ||
</div> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import Toaster from '@/components/ui/toast/Toaster.vue' | ||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
<template> | ||
<button @click="click">{{ props.name }}</button> | ||
</template> | ||
|
||
<script setup> | ||
import { useToast } from '@/components/ui/toast/use-toast' | ||
import { ToastAction } from '@/components/ui/toast' | ||
const { toast } = useToast() | ||
const props = defineProps({ | ||
name: { | ||
type: String, | ||
required: true | ||
}, | ||
title: { | ||
type: String, | ||
required: true | ||
}, | ||
description: { | ||
type: String, | ||
required: true | ||
}, | ||
}) | ||
const click = () => { | ||
toast({ | ||
title: props.title, | ||
description: props.description, | ||
action: h(ToastAction, { | ||
altText: 'Try again', | ||
}, { | ||
default: () => 'Try again', | ||
}), | ||
}); | ||
} | ||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
<script setup lang="ts"> | ||
import { computed } from 'vue' | ||
import { ToastRoot, type ToastRootEmits, useForwardPropsEmits } from 'radix-vue' | ||
import { type ToastProps, toastVariants } from '.' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<ToastProps>() | ||
const emits = defineEmits<ToastRootEmits>() | ||
const delegatedProps = computed(() => { | ||
const { class: _, ...delegated } = props | ||
return delegated | ||
}) | ||
const forwarded = useForwardPropsEmits(delegatedProps, emits) | ||
</script> | ||
|
||
<template> | ||
<ToastRoot | ||
v-bind="forwarded" | ||
:class="cn(toastVariants({ variant }), props.class)" | ||
@update:open="onOpenChange" | ||
> | ||
<slot /> | ||
</ToastRoot> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
<script setup lang="ts"> | ||
import { type HTMLAttributes, computed } from 'vue' | ||
import { ToastAction, type ToastActionProps } from 'radix-vue' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<ToastActionProps & { class?: HTMLAttributes['class'] }>() | ||
const delegatedProps = computed(() => { | ||
const { class: _, ...delegated } = props | ||
return delegated | ||
}) | ||
</script> | ||
|
||
<template> | ||
<ToastAction v-bind="delegatedProps" :class="cn('inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-slate-200 bg-transparent px-3 text-sm font-medium ring-offset-white transition-colors hover:bg-slate-100 focus:outline-none focus:ring-2 focus:ring-slate-950 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-slate-100/40 group-[.destructive]:hover:border-red-500/30 group-[.destructive]:hover:bg-red-500 group-[.destructive]:hover:text-slate-50 group-[.destructive]:focus:ring-red-500 dark:border-slate-800 dark:ring-offset-slate-950 dark:hover:bg-slate-800 dark:focus:ring-slate-300 dark:group-[.destructive]:border-slate-800/40 dark:group-[.destructive]:hover:border-red-900/30 dark:group-[.destructive]:hover:bg-red-900 dark:group-[.destructive]:hover:text-slate-50 dark:group-[.destructive]:focus:ring-red-900', props.class)"> | ||
<slot /> | ||
</ToastAction> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<script setup lang="ts"> | ||
import { type HTMLAttributes, computed } from 'vue' | ||
import { ToastClose, type ToastCloseProps } from 'radix-vue' | ||
import { X } from 'lucide-vue-next' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<ToastCloseProps & { | ||
class?: HTMLAttributes['class'] | ||
}>() | ||
const delegatedProps = computed(() => { | ||
const { class: _, ...delegated } = props | ||
return delegated | ||
}) | ||
</script> | ||
|
||
<template> | ||
<ToastClose v-bind="delegatedProps" :class="cn('absolute right-2 top-2 rounded-md p-1 text-slate-950/50 opacity-0 transition-opacity hover:text-slate-950 focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600 dark:text-slate-50/50 dark:hover:text-slate-50', props.class)"> | ||
<X class="h-4 w-4" /> | ||
</ToastClose> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
<script setup lang="ts"> | ||
import { type HTMLAttributes, computed } from 'vue' | ||
import { ToastDescription, type ToastDescriptionProps } from 'radix-vue' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<ToastDescriptionProps & { class?: HTMLAttributes['class'] }>() | ||
const delegatedProps = computed(() => { | ||
const { class: _, ...delegated } = props | ||
return delegated | ||
}) | ||
</script> | ||
|
||
<template> | ||
<ToastDescription :class="cn('text-sm opacity-90', props.class)" v-bind="delegatedProps"> | ||
<slot /> | ||
</ToastDescription> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
<script setup lang="ts"> | ||
import { ToastProvider, type ToastProviderProps } from 'radix-vue' | ||
const props = defineProps<ToastProviderProps>() | ||
</script> | ||
|
||
<template> | ||
<ToastProvider v-bind="props"> | ||
<slot /> | ||
</ToastProvider> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
<script setup lang="ts"> | ||
import { type HTMLAttributes, computed } from 'vue' | ||
import { ToastTitle, type ToastTitleProps } from 'radix-vue' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<ToastTitleProps & { class?: HTMLAttributes['class'] }>() | ||
const delegatedProps = computed(() => { | ||
const { class: _, ...delegated } = props | ||
return delegated | ||
}) | ||
</script> | ||
|
||
<template> | ||
<ToastTitle v-bind="delegatedProps" :class="cn('text-sm font-semibold', props.class)"> | ||
<slot /> | ||
</ToastTitle> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<script setup lang="ts"> | ||
import { type HTMLAttributes, computed } from 'vue' | ||
import { ToastViewport, type ToastViewportProps } from 'radix-vue' | ||
import { cn } from '@/lib/utils' | ||
const props = defineProps<ToastViewportProps & { class?: HTMLAttributes['class'] }>() | ||
const delegatedProps = computed(() => { | ||
const { class: _, ...delegated } = props | ||
return delegated | ||
}) | ||
</script> | ||
|
||
<template> | ||
<ToastViewport v-bind="delegatedProps" :class="cn('fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]', props.class)" /> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<script setup lang="ts"> | ||
import { isVNode } from 'vue' | ||
import { useToast } from './use-toast' | ||
import { Toast, ToastClose, ToastDescription, ToastProvider, ToastTitle, ToastViewport } from '.' | ||
const { toasts } = useToast() | ||
</script> | ||
|
||
<template> | ||
<ToastProvider> | ||
<Toast v-for="toast in toasts" :key="toast.id" v-bind="toast" class="bg-black text-white"> | ||
<div class="grid gap-1"> | ||
<ToastTitle v-if="toast.title"> | ||
{{ toast.title }} | ||
</ToastTitle> | ||
<template v-if="toast.description"> | ||
<ToastDescription v-if="isVNode(toast.description)"> | ||
<component :is="toast.description" /> | ||
</ToastDescription> | ||
<ToastDescription v-else> | ||
{{ toast.description }} | ||
</ToastDescription> | ||
</template> | ||
<ToastClose /> | ||
</div> | ||
<component class="hover:bg-white hover:text-black" :is="toast.action" /> | ||
</Toast> | ||
<ToastViewport /> | ||
</ToastProvider> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import type { ToastRootProps } from 'radix-vue' | ||
import type { HTMLAttributes } from 'vue' | ||
|
||
export { default as Toaster } from './Toaster.vue' | ||
export { default as Toast } from './Toast.vue' | ||
export { default as ToastViewport } from './ToastViewport.vue' | ||
export { default as ToastAction } from './ToastAction.vue' | ||
export { default as ToastClose } from './ToastClose.vue' | ||
export { default as ToastTitle } from './ToastTitle.vue' | ||
export { default as ToastDescription } from './ToastDescription.vue' | ||
export { default as ToastProvider } from './ToastProvider.vue' | ||
export { toast, useToast } from './use-toast' | ||
|
||
import { type VariantProps, cva } from 'class-variance-authority' | ||
|
||
export const toastVariants = cva( | ||
'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border border-slate-200 p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[--radix-toast-swipe-end-x] data-[swipe=move]:translate-x-[--radix-toast-swipe-move-x] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full dark:border-slate-800', | ||
{ | ||
variants: { | ||
variant: { | ||
default: 'border bg-white text-slate-950 dark:bg-slate-950 dark:text-slate-50', | ||
destructive: | ||
'destructive group border-red-500 bg-red-500 text-slate-50 dark:border-red-900 dark:bg-red-900 dark:text-slate-50', | ||
}, | ||
}, | ||
defaultVariants: { | ||
variant: 'default', | ||
}, | ||
}, | ||
) | ||
|
||
type ToastVariants = VariantProps<typeof toastVariants> | ||
|
||
export interface ToastProps extends ToastRootProps { | ||
class?: HTMLAttributes['class'] | ||
variant?: ToastVariants['variant'] | ||
onOpenChange?: ((value: boolean) => void) | undefined | ||
} |
Oops, something went wrong.