diff --git a/src/components/ui/accordion/accordion-content.svelte b/src/components/ui/accordion/accordion-content.svelte new file mode 100644 index 0000000..0805880 --- /dev/null +++ b/src/components/ui/accordion/accordion-content.svelte @@ -0,0 +1,25 @@ + + + +
+ +
+
diff --git a/src/components/ui/accordion/accordion-item.svelte b/src/components/ui/accordion/accordion-item.svelte new file mode 100644 index 0000000..e37503b --- /dev/null +++ b/src/components/ui/accordion/accordion-item.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/src/components/ui/accordion/accordion-trigger.svelte b/src/components/ui/accordion/accordion-trigger.svelte new file mode 100644 index 0000000..a225eb6 --- /dev/null +++ b/src/components/ui/accordion/accordion-trigger.svelte @@ -0,0 +1,26 @@ + + + + svg]:rotate-180", + className + )} + {...$$restProps} + on:click + > + + + + diff --git a/src/components/ui/accordion/index.ts b/src/components/ui/accordion/index.ts new file mode 100644 index 0000000..ed49213 --- /dev/null +++ b/src/components/ui/accordion/index.ts @@ -0,0 +1,17 @@ +import { Accordion as AccordionPrimitive } from "bits-ui"; +import Content from "./accordion-content.svelte"; +import Item from "./accordion-item.svelte"; +import Trigger from "./accordion-trigger.svelte"; +const Root = AccordionPrimitive.Root; + +export { + Root, + Content, + Item, + Trigger, + // + Root as Accordion, + Content as AccordionContent, + Item as AccordionItem, + Trigger as AccordionTrigger, +}; diff --git a/src/components/ui/alert-dialog/alert-dialog-action.svelte b/src/components/ui/alert-dialog/alert-dialog-action.svelte new file mode 100644 index 0000000..9b2dc2f --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-action.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/alert-dialog/alert-dialog-cancel.svelte b/src/components/ui/alert-dialog/alert-dialog-cancel.svelte new file mode 100644 index 0000000..160489c --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-cancel.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/alert-dialog/alert-dialog-content.svelte b/src/components/ui/alert-dialog/alert-dialog-content.svelte new file mode 100644 index 0000000..10b8679 --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-content.svelte @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/src/components/ui/alert-dialog/alert-dialog-description.svelte b/src/components/ui/alert-dialog/alert-dialog-description.svelte new file mode 100644 index 0000000..caa965c --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-description.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/alert-dialog/alert-dialog-footer.svelte b/src/components/ui/alert-dialog/alert-dialog-footer.svelte new file mode 100644 index 0000000..c489a48 --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-footer.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/src/components/ui/alert-dialog/alert-dialog-header.svelte b/src/components/ui/alert-dialog/alert-dialog-header.svelte new file mode 100644 index 0000000..67ae2e6 --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-header.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/src/components/ui/alert-dialog/alert-dialog-overlay.svelte b/src/components/ui/alert-dialog/alert-dialog-overlay.svelte new file mode 100644 index 0000000..a4933da --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/components/ui/alert-dialog/alert-dialog-portal.svelte b/src/components/ui/alert-dialog/alert-dialog-portal.svelte new file mode 100644 index 0000000..e227219 --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-portal.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/src/components/ui/alert-dialog/alert-dialog-title.svelte b/src/components/ui/alert-dialog/alert-dialog-title.svelte new file mode 100644 index 0000000..1eb9456 --- /dev/null +++ b/src/components/ui/alert-dialog/alert-dialog-title.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/src/components/ui/alert-dialog/index.ts b/src/components/ui/alert-dialog/index.ts new file mode 100644 index 0000000..be56dd7 --- /dev/null +++ b/src/components/ui/alert-dialog/index.ts @@ -0,0 +1,40 @@ +import { AlertDialog as AlertDialogPrimitive } from "bits-ui"; + +import Title from "./alert-dialog-title.svelte"; +import Action from "./alert-dialog-action.svelte"; +import Cancel from "./alert-dialog-cancel.svelte"; +import Portal from "./alert-dialog-portal.svelte"; +import Footer from "./alert-dialog-footer.svelte"; +import Header from "./alert-dialog-header.svelte"; +import Overlay from "./alert-dialog-overlay.svelte"; +import Content from "./alert-dialog-content.svelte"; +import Description from "./alert-dialog-description.svelte"; + +const Root = AlertDialogPrimitive.Root; +const Trigger = AlertDialogPrimitive.Trigger; + +export { + Root, + Title, + Action, + Cancel, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + // + Root as AlertDialog, + Title as AlertDialogTitle, + Action as AlertDialogAction, + Cancel as AlertDialogCancel, + Portal as AlertDialogPortal, + Footer as AlertDialogFooter, + Header as AlertDialogHeader, + Trigger as AlertDialogTrigger, + Overlay as AlertDialogOverlay, + Content as AlertDialogContent, + Description as AlertDialogDescription, +}; diff --git a/src/components/ui/alert/alert-description.svelte b/src/components/ui/alert/alert-description.svelte new file mode 100644 index 0000000..17dac18 --- /dev/null +++ b/src/components/ui/alert/alert-description.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/src/components/ui/alert/alert-title.svelte b/src/components/ui/alert/alert-title.svelte new file mode 100644 index 0000000..25ed375 --- /dev/null +++ b/src/components/ui/alert/alert-title.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/alert/alert.svelte b/src/components/ui/alert/alert.svelte new file mode 100644 index 0000000..d7d4b05 --- /dev/null +++ b/src/components/ui/alert/alert.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/alert/index.ts b/src/components/ui/alert/index.ts new file mode 100644 index 0000000..296f9e1 --- /dev/null +++ b/src/components/ui/alert/index.ts @@ -0,0 +1,33 @@ +import { type VariantProps, tv } from "tailwind-variants"; + +import Root from "./alert.svelte"; +import Description from "./alert-description.svelte"; +import Title from "./alert-title.svelte"; + +export const alertVariants = tv({ + base: "[&>svg]:text-foreground relative w-full rounded-lg border p-4 [&:has(svg)]:pl-11 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4", + + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, +}); + +export type Variant = VariantProps["variant"]; +export type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; + +export { + Root, + Description, + Title, + // + Root as Alert, + Description as AlertDescription, + Title as AlertTitle, +}; diff --git a/src/components/ui/aspect-ratio/aspect-ratio.svelte b/src/components/ui/aspect-ratio/aspect-ratio.svelte new file mode 100644 index 0000000..b3da1f3 --- /dev/null +++ b/src/components/ui/aspect-ratio/aspect-ratio.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/components/ui/aspect-ratio/index.ts b/src/components/ui/aspect-ratio/index.ts new file mode 100644 index 0000000..985c75f --- /dev/null +++ b/src/components/ui/aspect-ratio/index.ts @@ -0,0 +1,3 @@ +import Root from "./aspect-ratio.svelte"; + +export { Root, Root as AspectRatio }; diff --git a/src/components/ui/avatar/avatar-fallback.svelte b/src/components/ui/avatar/avatar-fallback.svelte new file mode 100644 index 0000000..02ef5ae --- /dev/null +++ b/src/components/ui/avatar/avatar-fallback.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/avatar/avatar-image.svelte b/src/components/ui/avatar/avatar-image.svelte new file mode 100644 index 0000000..f82764d --- /dev/null +++ b/src/components/ui/avatar/avatar-image.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/components/ui/avatar/avatar.svelte b/src/components/ui/avatar/avatar.svelte new file mode 100644 index 0000000..6ca4cb7 --- /dev/null +++ b/src/components/ui/avatar/avatar.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/ui/avatar/index.ts b/src/components/ui/avatar/index.ts new file mode 100644 index 0000000..d06457b --- /dev/null +++ b/src/components/ui/avatar/index.ts @@ -0,0 +1,13 @@ +import Root from "./avatar.svelte"; +import Image from "./avatar-image.svelte"; +import Fallback from "./avatar-fallback.svelte"; + +export { + Root, + Image, + Fallback, + // + Root as Avatar, + Image as AvatarImage, + Fallback as AvatarFallback, +}; diff --git a/src/components/ui/badge/badge.svelte b/src/components/ui/badge/badge.svelte new file mode 100644 index 0000000..957b98a --- /dev/null +++ b/src/components/ui/badge/badge.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/ui/badge/index.ts b/src/components/ui/badge/index.ts new file mode 100644 index 0000000..59c0767 --- /dev/null +++ b/src/components/ui/badge/index.ts @@ -0,0 +1,21 @@ +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-full 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", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80 border-transparent", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/80 border-transparent", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, +}); + +export type Variant = VariantProps["variant"]; diff --git a/src/components/ui/breadcrumb/breadcrumb-ellipsis.svelte b/src/components/ui/breadcrumb/breadcrumb-ellipsis.svelte new file mode 100644 index 0000000..fb025e5 --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb-ellipsis.svelte @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/breadcrumb/breadcrumb-item.svelte b/src/components/ui/breadcrumb/breadcrumb-item.svelte new file mode 100644 index 0000000..c4c38b4 --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb-item.svelte @@ -0,0 +1,16 @@ + + +
  • + +
  • diff --git a/src/components/ui/breadcrumb/breadcrumb-link.svelte b/src/components/ui/breadcrumb/breadcrumb-link.svelte new file mode 100644 index 0000000..d63204b --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb-link.svelte @@ -0,0 +1,31 @@ + + +{#if asChild} + +{:else} + + + +{/if} diff --git a/src/components/ui/breadcrumb/breadcrumb-list.svelte b/src/components/ui/breadcrumb/breadcrumb-list.svelte new file mode 100644 index 0000000..fe84243 --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb-list.svelte @@ -0,0 +1,23 @@ + + +
      + +
    diff --git a/src/components/ui/breadcrumb/breadcrumb-page.svelte b/src/components/ui/breadcrumb/breadcrumb-page.svelte new file mode 100644 index 0000000..672eac3 --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb-page.svelte @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/ui/breadcrumb/breadcrumb-separator.svelte b/src/components/ui/breadcrumb/breadcrumb-separator.svelte new file mode 100644 index 0000000..89ff754 --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb-separator.svelte @@ -0,0 +1,25 @@ + + + diff --git a/src/components/ui/breadcrumb/breadcrumb.svelte b/src/components/ui/breadcrumb/breadcrumb.svelte new file mode 100644 index 0000000..104f8b0 --- /dev/null +++ b/src/components/ui/breadcrumb/breadcrumb.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/components/ui/breadcrumb/index.ts b/src/components/ui/breadcrumb/index.ts new file mode 100644 index 0000000..dc914ec --- /dev/null +++ b/src/components/ui/breadcrumb/index.ts @@ -0,0 +1,25 @@ +import Root from "./breadcrumb.svelte"; +import Ellipsis from "./breadcrumb-ellipsis.svelte"; +import Item from "./breadcrumb-item.svelte"; +import Separator from "./breadcrumb-separator.svelte"; +import Link from "./breadcrumb-link.svelte"; +import List from "./breadcrumb-list.svelte"; +import Page from "./breadcrumb-page.svelte"; + +export { + Root, + Ellipsis, + Item, + Separator, + Link, + List, + Page, + // + Root as Breadcrumb, + Ellipsis as BreadcrumbEllipsis, + Item as BreadcrumbItem, + Separator as BreadcrumbSeparator, + Link as BreadcrumbLink, + List as BreadcrumbList, + Page as BreadcrumbPage, +}; diff --git a/src/components/ui/button/button.svelte b/src/components/ui/button/button.svelte new file mode 100644 index 0000000..fd4763a --- /dev/null +++ b/src/components/ui/button/button.svelte @@ -0,0 +1,74 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/components/ui/button/index.ts b/src/components/ui/button/index.ts new file mode 100644 index 0000000..fb585d7 --- /dev/null +++ b/src/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, +} from "./button.svelte"; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/src/components/ui/calendar/calendar-cell.svelte b/src/components/ui/calendar/calendar-cell.svelte new file mode 100644 index 0000000..9d9c75d --- /dev/null +++ b/src/components/ui/calendar/calendar-cell.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/calendar/calendar-day.svelte b/src/components/ui/calendar/calendar-day.svelte new file mode 100644 index 0000000..d7d70d1 --- /dev/null +++ b/src/components/ui/calendar/calendar-day.svelte @@ -0,0 +1,30 @@ + + + diff --git a/src/components/ui/calendar/calendar-grid-body.svelte b/src/components/ui/calendar/calendar-grid-body.svelte new file mode 100644 index 0000000..ce4ad89 --- /dev/null +++ b/src/components/ui/calendar/calendar-grid-body.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/calendar/calendar-grid-head.svelte b/src/components/ui/calendar/calendar-grid-head.svelte new file mode 100644 index 0000000..40fdd01 --- /dev/null +++ b/src/components/ui/calendar/calendar-grid-head.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/calendar/calendar-grid-row.svelte b/src/components/ui/calendar/calendar-grid-row.svelte new file mode 100644 index 0000000..59fbd3e --- /dev/null +++ b/src/components/ui/calendar/calendar-grid-row.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/calendar/calendar-grid.svelte b/src/components/ui/calendar/calendar-grid.svelte new file mode 100644 index 0000000..67c00e4 --- /dev/null +++ b/src/components/ui/calendar/calendar-grid.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/calendar/calendar-head-cell.svelte b/src/components/ui/calendar/calendar-head-cell.svelte new file mode 100644 index 0000000..3b89705 --- /dev/null +++ b/src/components/ui/calendar/calendar-head-cell.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/calendar/calendar-header.svelte b/src/components/ui/calendar/calendar-header.svelte new file mode 100644 index 0000000..6cb5378 --- /dev/null +++ b/src/components/ui/calendar/calendar-header.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/calendar/calendar-heading.svelte b/src/components/ui/calendar/calendar-heading.svelte new file mode 100644 index 0000000..6916a4f --- /dev/null +++ b/src/components/ui/calendar/calendar-heading.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/calendar/calendar-months.svelte b/src/components/ui/calendar/calendar-months.svelte new file mode 100644 index 0000000..f1b56aa --- /dev/null +++ b/src/components/ui/calendar/calendar-months.svelte @@ -0,0 +1,20 @@ + + +
    + {@render children?.()} +
    diff --git a/src/components/ui/calendar/calendar-next-button.svelte b/src/components/ui/calendar/calendar-next-button.svelte new file mode 100644 index 0000000..22f9843 --- /dev/null +++ b/src/components/ui/calendar/calendar-next-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/components/ui/calendar/calendar-prev-button.svelte b/src/components/ui/calendar/calendar-prev-button.svelte new file mode 100644 index 0000000..2510d3b --- /dev/null +++ b/src/components/ui/calendar/calendar-prev-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/components/ui/calendar/calendar.svelte b/src/components/ui/calendar/calendar.svelte new file mode 100644 index 0000000..5cdeb88 --- /dev/null +++ b/src/components/ui/calendar/calendar.svelte @@ -0,0 +1,61 @@ + + + + + {#snippet children({ months, weekdays })} + + + + + + + {#each months as month} + + + + {#each weekdays as weekday} + + {weekday.slice(0, 2)} + + {/each} + + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {/each} + + {/each} + + + {/each} + + {/snippet} + diff --git a/src/components/ui/calendar/index.ts b/src/components/ui/calendar/index.ts new file mode 100644 index 0000000..ab257ab --- /dev/null +++ b/src/components/ui/calendar/index.ts @@ -0,0 +1,30 @@ +import Root from "./calendar.svelte"; +import Cell from "./calendar-cell.svelte"; +import Day from "./calendar-day.svelte"; +import Grid from "./calendar-grid.svelte"; +import Header from "./calendar-header.svelte"; +import Months from "./calendar-months.svelte"; +import GridRow from "./calendar-grid-row.svelte"; +import Heading from "./calendar-heading.svelte"; +import GridBody from "./calendar-grid-body.svelte"; +import GridHead from "./calendar-grid-head.svelte"; +import HeadCell from "./calendar-head-cell.svelte"; +import NextButton from "./calendar-next-button.svelte"; +import PrevButton from "./calendar-prev-button.svelte"; + +export { + Day, + Cell, + Grid, + Header, + Months, + GridRow, + Heading, + GridBody, + GridHead, + HeadCell, + NextButton, + PrevButton, + // + Root as Calendar, +}; diff --git a/src/components/ui/card/card-content.svelte b/src/components/ui/card/card-content.svelte new file mode 100644 index 0000000..4a26afb --- /dev/null +++ b/src/components/ui/card/card-content.svelte @@ -0,0 +1,13 @@ + + +
    + +
    diff --git a/src/components/ui/card/card-description.svelte b/src/components/ui/card/card-description.svelte new file mode 100644 index 0000000..e519b46 --- /dev/null +++ b/src/components/ui/card/card-description.svelte @@ -0,0 +1,13 @@ + + +

    + +

    diff --git a/src/components/ui/card/card-footer.svelte b/src/components/ui/card/card-footer.svelte new file mode 100644 index 0000000..a885e82 --- /dev/null +++ b/src/components/ui/card/card-footer.svelte @@ -0,0 +1,13 @@ + + +
    + +
    diff --git a/src/components/ui/card/card-header.svelte b/src/components/ui/card/card-header.svelte new file mode 100644 index 0000000..279e92c --- /dev/null +++ b/src/components/ui/card/card-header.svelte @@ -0,0 +1,13 @@ + + +
    + +
    diff --git a/src/components/ui/card/card-title.svelte b/src/components/ui/card/card-title.svelte new file mode 100644 index 0000000..9f37d43 --- /dev/null +++ b/src/components/ui/card/card-title.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/card/card.svelte b/src/components/ui/card/card.svelte new file mode 100644 index 0000000..eacc0b3 --- /dev/null +++ b/src/components/ui/card/card.svelte @@ -0,0 +1,16 @@ + + +
    + +
    diff --git a/src/components/ui/card/index.ts b/src/components/ui/card/index.ts new file mode 100644 index 0000000..bcc031d --- /dev/null +++ b/src/components/ui/card/index.ts @@ -0,0 +1,24 @@ +import Root from "./card.svelte"; +import Content from "./card-content.svelte"; +import Description from "./card-description.svelte"; +import Footer from "./card-footer.svelte"; +import Header from "./card-header.svelte"; +import Title from "./card-title.svelte"; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle, +}; + +export type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; diff --git a/src/components/ui/carousel/carousel-content.svelte b/src/components/ui/carousel/carousel-content.svelte new file mode 100644 index 0000000..1d8b729 --- /dev/null +++ b/src/components/ui/carousel/carousel-content.svelte @@ -0,0 +1,35 @@ + + +
    +
    + +
    +
    diff --git a/src/components/ui/carousel/carousel-item.svelte b/src/components/ui/carousel/carousel-item.svelte new file mode 100644 index 0000000..1c7ce33 --- /dev/null +++ b/src/components/ui/carousel/carousel-item.svelte @@ -0,0 +1,25 @@ + + +
    + +
    diff --git a/src/components/ui/carousel/carousel-next.svelte b/src/components/ui/carousel/carousel-next.svelte new file mode 100644 index 0000000..d04e113 --- /dev/null +++ b/src/components/ui/carousel/carousel-next.svelte @@ -0,0 +1,39 @@ + + + diff --git a/src/components/ui/carousel/carousel-previous.svelte b/src/components/ui/carousel/carousel-previous.svelte new file mode 100644 index 0000000..42df8ef --- /dev/null +++ b/src/components/ui/carousel/carousel-previous.svelte @@ -0,0 +1,40 @@ + + + diff --git a/src/components/ui/carousel/carousel.svelte b/src/components/ui/carousel/carousel.svelte new file mode 100644 index 0000000..1c16116 --- /dev/null +++ b/src/components/ui/carousel/carousel.svelte @@ -0,0 +1,99 @@ + + +
    + +
    diff --git a/src/components/ui/carousel/context.ts b/src/components/ui/carousel/context.ts new file mode 100644 index 0000000..c90b4cb --- /dev/null +++ b/src/components/ui/carousel/context.ts @@ -0,0 +1,56 @@ +import type { EmblaCarouselSvelteType } from "embla-carousel-svelte"; +import type emblaCarouselSvelte from "embla-carousel-svelte"; +import { getContext, hasContext, setContext } from "svelte"; +import type { HTMLAttributes } from "svelte/elements"; +import type { Readable, Writable } from "svelte/store"; + +export type CarouselAPI = + NonNullable["on:emblaInit"]> extends ( + evt: CustomEvent + ) => void + ? CarouselAPI + : never; + +type EmblaCarouselConfig = NonNullable[1]>; + +export type CarouselOptions = EmblaCarouselConfig["options"]; +export type CarouselPlugins = EmblaCarouselConfig["plugins"]; + +//// + +export type CarouselProps = { + opts?: CarouselOptions; + plugins?: CarouselPlugins; + api?: CarouselAPI; + orientation?: "horizontal" | "vertical"; +} & HTMLAttributes; + +const EMBLA_CAROUSEL_CONTEXT = Symbol("EMBLA_CAROUSEL_CONTEXT"); + +type EmblaContext = { + api: Writable; + orientation: Writable<"horizontal" | "vertical">; + scrollNext: () => void; + scrollPrev: () => void; + canScrollNext: Readable; + canScrollPrev: Readable; + handleKeyDown: (e: KeyboardEvent) => void; + options: Writable; + plugins: Writable; + onInit: (e: CustomEvent) => void; + scrollTo: (index: number, jump?: boolean) => void; + scrollSnaps: Readable; + selectedIndex: Readable; +}; + +export function setEmblaContext(config: EmblaContext): EmblaContext { + setContext(EMBLA_CAROUSEL_CONTEXT, config); + return config; +} + +export function getEmblaContext(name = "This component") { + if (!hasContext(EMBLA_CAROUSEL_CONTEXT)) { + throw new Error(`${name} must be used within a component`); + } + return getContext>(EMBLA_CAROUSEL_CONTEXT); +} diff --git a/src/components/ui/carousel/index.ts b/src/components/ui/carousel/index.ts new file mode 100644 index 0000000..78102bf --- /dev/null +++ b/src/components/ui/carousel/index.ts @@ -0,0 +1,5 @@ +export { default as Root } from "./carousel.svelte"; +export { default as Content } from "./carousel-content.svelte"; +export { default as Item } from "./carousel-item.svelte"; +export { default as Previous } from "./carousel-previous.svelte"; +export { default as Next } from "./carousel-next.svelte"; diff --git a/src/components/ui/checkbox/checkbox.svelte b/src/components/ui/checkbox/checkbox.svelte new file mode 100644 index 0000000..8f1cbf8 --- /dev/null +++ b/src/components/ui/checkbox/checkbox.svelte @@ -0,0 +1,35 @@ + + + + + {#if isChecked} + + {:else if isIndeterminate} + + {/if} + + diff --git a/src/components/ui/checkbox/index.ts b/src/components/ui/checkbox/index.ts new file mode 100644 index 0000000..6d92d94 --- /dev/null +++ b/src/components/ui/checkbox/index.ts @@ -0,0 +1,6 @@ +import Root from "./checkbox.svelte"; +export { + Root, + // + Root as Checkbox, +}; diff --git a/src/components/ui/collapsible/collapsible-content.svelte b/src/components/ui/collapsible/collapsible-content.svelte new file mode 100644 index 0000000..2a8e5fa --- /dev/null +++ b/src/components/ui/collapsible/collapsible-content.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/src/components/ui/collapsible/index.ts b/src/components/ui/collapsible/index.ts new file mode 100644 index 0000000..168834e --- /dev/null +++ b/src/components/ui/collapsible/index.ts @@ -0,0 +1,15 @@ +import { Collapsible as CollapsiblePrimitive } from "bits-ui"; +import Content from "./collapsible-content.svelte"; + +const Root = CollapsiblePrimitive.Root; +const Trigger = CollapsiblePrimitive.Trigger; + +export { + Root, + Content, + Trigger, + // + Root as Collapsible, + Content as CollapsibleContent, + Trigger as CollapsibleTrigger, +}; diff --git a/src/components/ui/command/command-dialog.svelte b/src/components/ui/command/command-dialog.svelte new file mode 100644 index 0000000..ca9908f --- /dev/null +++ b/src/components/ui/command/command-dialog.svelte @@ -0,0 +1,35 @@ + + + + + + + diff --git a/src/components/ui/command/command-empty.svelte b/src/components/ui/command/command-empty.svelte new file mode 100644 index 0000000..d623c97 --- /dev/null +++ b/src/components/ui/command/command-empty.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/command/command-group.svelte b/src/components/ui/command/command-group.svelte new file mode 100644 index 0000000..6310612 --- /dev/null +++ b/src/components/ui/command/command-group.svelte @@ -0,0 +1,29 @@ + + + + {#if heading} + + {heading} + + {/if} + + diff --git a/src/components/ui/command/command-input.svelte b/src/components/ui/command/command-input.svelte new file mode 100644 index 0000000..c38e756 --- /dev/null +++ b/src/components/ui/command/command-input.svelte @@ -0,0 +1,25 @@ + + +
    + + +
    diff --git a/src/components/ui/command/command-item.svelte b/src/components/ui/command/command-item.svelte new file mode 100644 index 0000000..4516d3f --- /dev/null +++ b/src/components/ui/command/command-item.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/command/command-link-item.svelte b/src/components/ui/command/command-link-item.svelte new file mode 100644 index 0000000..d98afd6 --- /dev/null +++ b/src/components/ui/command/command-link-item.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/command/command-list.svelte b/src/components/ui/command/command-list.svelte new file mode 100644 index 0000000..e87c3de --- /dev/null +++ b/src/components/ui/command/command-list.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/command/command-separator.svelte b/src/components/ui/command/command-separator.svelte new file mode 100644 index 0000000..bf50065 --- /dev/null +++ b/src/components/ui/command/command-separator.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/command/command-shortcut.svelte b/src/components/ui/command/command-shortcut.svelte new file mode 100644 index 0000000..88cdf87 --- /dev/null +++ b/src/components/ui/command/command-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/command/command.svelte b/src/components/ui/command/command.svelte new file mode 100644 index 0000000..1af390a --- /dev/null +++ b/src/components/ui/command/command.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/components/ui/command/index.ts b/src/components/ui/command/index.ts new file mode 100644 index 0000000..d3dbade --- /dev/null +++ b/src/components/ui/command/index.ts @@ -0,0 +1,40 @@ +import { Command as CommandPrimitive } from "bits-ui"; + +import Root from "./command.svelte"; +import Dialog from "./command-dialog.svelte"; +import Empty from "./command-empty.svelte"; +import Group from "./command-group.svelte"; +import Item from "./command-item.svelte"; +import Input from "./command-input.svelte"; +import List from "./command-list.svelte"; +import Separator from "./command-separator.svelte"; +import Shortcut from "./command-shortcut.svelte"; +import LinkItem from "./command-link-item.svelte"; + +const Loading = CommandPrimitive.Loading; + +export { + Root, + Dialog, + Empty, + Group, + Item, + LinkItem, + Input, + List, + Separator, + Shortcut, + Loading, + // + Root as Command, + Dialog as CommandDialog, + Empty as CommandEmpty, + Group as CommandGroup, + Item as CommandItem, + LinkItem as CommandLinkItem, + Input as CommandInput, + List as CommandList, + Separator as CommandSeparator, + Shortcut as CommandShortcut, + Loading as CommandLoading, +}; diff --git a/src/components/ui/context-menu/context-menu-checkbox-item.svelte b/src/components/ui/context-menu/context-menu-checkbox-item.svelte new file mode 100644 index 0000000..0367e9d --- /dev/null +++ b/src/components/ui/context-menu/context-menu-checkbox-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/components/ui/context-menu/context-menu-content.svelte b/src/components/ui/context-menu/context-menu-content.svelte new file mode 100644 index 0000000..7d3746f --- /dev/null +++ b/src/components/ui/context-menu/context-menu-content.svelte @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/ui/context-menu/context-menu-item.svelte b/src/components/ui/context-menu/context-menu-item.svelte new file mode 100644 index 0000000..d2c8669 --- /dev/null +++ b/src/components/ui/context-menu/context-menu-item.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/ui/context-menu/context-menu-label.svelte b/src/components/ui/context-menu/context-menu-label.svelte new file mode 100644 index 0000000..213cb45 --- /dev/null +++ b/src/components/ui/context-menu/context-menu-label.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/ui/context-menu/context-menu-radio-group.svelte b/src/components/ui/context-menu/context-menu-radio-group.svelte new file mode 100644 index 0000000..53fa692 --- /dev/null +++ b/src/components/ui/context-menu/context-menu-radio-group.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/components/ui/context-menu/context-menu-radio-item.svelte b/src/components/ui/context-menu/context-menu-radio-item.svelte new file mode 100644 index 0000000..91ce9de --- /dev/null +++ b/src/components/ui/context-menu/context-menu-radio-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/components/ui/context-menu/context-menu-separator.svelte b/src/components/ui/context-menu/context-menu-separator.svelte new file mode 100644 index 0000000..06974e6 --- /dev/null +++ b/src/components/ui/context-menu/context-menu-separator.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/context-menu/context-menu-shortcut.svelte b/src/components/ui/context-menu/context-menu-shortcut.svelte new file mode 100644 index 0000000..43b5919 --- /dev/null +++ b/src/components/ui/context-menu/context-menu-shortcut.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/context-menu/context-menu-sub-content.svelte b/src/components/ui/context-menu/context-menu-sub-content.svelte new file mode 100644 index 0000000..345cfb1 --- /dev/null +++ b/src/components/ui/context-menu/context-menu-sub-content.svelte @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/ui/context-menu/context-menu-sub-trigger.svelte b/src/components/ui/context-menu/context-menu-sub-trigger.svelte new file mode 100644 index 0000000..d0f693d --- /dev/null +++ b/src/components/ui/context-menu/context-menu-sub-trigger.svelte @@ -0,0 +1,32 @@ + + + + + + diff --git a/src/components/ui/context-menu/index.ts b/src/components/ui/context-menu/index.ts new file mode 100644 index 0000000..7d4af84 --- /dev/null +++ b/src/components/ui/context-menu/index.ts @@ -0,0 +1,49 @@ +import { ContextMenu as ContextMenuPrimitive } from "bits-ui"; + +import Item from "./context-menu-item.svelte"; +import Label from "./context-menu-label.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; + +export { + Sub, + Root, + Item, + Label, + Group, + Trigger, + Content, + Shortcut, + Separator, + RadioItem, + SubContent, + SubTrigger, + RadioGroup, + CheckboxItem, + // + 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, + RadioGroup as ContextMenuRadioGroup, + SubContent as ContextMenuSubContent, + SubTrigger as ContextMenuSubTrigger, + CheckboxItem as ContextMenuCheckboxItem, +}; diff --git a/src/components/ui/data-table/data-table.svelte.ts b/src/components/ui/data-table/data-table.svelte.ts new file mode 100644 index 0000000..b4834ce --- /dev/null +++ b/src/components/ui/data-table/data-table.svelte.ts @@ -0,0 +1,112 @@ +import { + type RowData, + type TableOptions, + type TableOptionsResolved, + type TableState, + createTable, +} from "@tanstack/table-core"; + +/** + * Creates a reactive TanStack table object for Svelte. + * @param options Table options to create the table with. + * @returns A reactive table object. + * @example + * ```svelte + * + * + * + * + * {#each table.getHeaderGroups() as headerGroup} + * + * {#each headerGroup.headers as header} + * + * {/each} + * + * {/each} + * + * + *
    + * + *
    + * ``` + */ +export function createSvelteTable(options: TableOptions) { + const resolvedOptions: TableOptionsResolved = mergeObjects( + { + state: {}, + onStateChange() {}, + renderFallbackValue: null, + mergeOptions: ( + defaultOptions: TableOptions, + options: Partial> + ) => { + return mergeObjects(defaultOptions, options); + }, + }, + options + ); + + const table = createTable(resolvedOptions); + let state = $state>(table.initialState); + + function updateOptions() { + table.setOptions((prev) => { + return mergeObjects(prev, options, { + state: mergeObjects(state, options.state || {}), + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onStateChange: (updater: any) => { + if (updater instanceof Function) state = updater(state); + else state = mergeObjects(state, updater); + + options.onStateChange?.(updater); + }, + }); + }); + } + + updateOptions(); + + $effect.pre(() => { + updateOptions(); + }); + + return table; +} + +/** + * Merges objects together while keeping their getters alive. + * Taken from SolidJS: {@link https://github.com/solidjs/solid/blob/24abc825c0996fd2bc8c1de1491efe9a7e743aff/packages/solid/src/server/rendering.ts#L82-L115} + */ +function mergeObjects(source: T): T; +function mergeObjects(source: T, source1: U): T & U; +function mergeObjects(source: T, source1: U, source2: V): T & U & V; +function mergeObjects(source: T, source1: U, source2: V, source3: W): T & U & V & W; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function mergeObjects(...sources: any): any { + const target = {}; + for (let i = 0; i < sources.length; i++) { + let source = sources[i]; + if (typeof source === "function") source = source(); + if (source) { + const descriptors = Object.getOwnPropertyDescriptors(source); + for (const key in descriptors) { + if (key in target) continue; + Object.defineProperty(target, key, { + enumerable: true, + get() { + for (let i = sources.length - 1; i >= 0; i--) { + let s = sources[i]; + if (typeof s === "function") s = s(); + const v = (s || {})[key]; + if (v !== undefined) return v; + } + }, + }); + } + } + } + return target; +} diff --git a/src/components/ui/data-table/flex-render.svelte b/src/components/ui/data-table/flex-render.svelte new file mode 100644 index 0000000..de3563f --- /dev/null +++ b/src/components/ui/data-table/flex-render.svelte @@ -0,0 +1,43 @@ + + + + +{#if typeof content === "string"} + {content} +{:else if content instanceof Function} + + + {@const result = content(context as any)} + {#if result instanceof RenderComponentConfig} + {@const { component: Component, props } = result} + + {:else if result instanceof RenderSnippetConfig} + {@const { snippet, params } = result} + {@render snippet(params)} + {:else} + {result} + {/if} +{/if} diff --git a/src/components/ui/data-table/index.ts b/src/components/ui/data-table/index.ts new file mode 100644 index 0000000..5f4e77e --- /dev/null +++ b/src/components/ui/data-table/index.ts @@ -0,0 +1,3 @@ +export { default as FlexRender } from "./flex-render.svelte"; +export { renderComponent, renderSnippet } from "./render-helpers.js"; +export { createSvelteTable } from "./data-table.svelte.js"; diff --git a/src/components/ui/data-table/render-helpers.ts b/src/components/ui/data-table/render-helpers.ts new file mode 100644 index 0000000..1984642 --- /dev/null +++ b/src/components/ui/data-table/render-helpers.ts @@ -0,0 +1,111 @@ +import type { Component, ComponentProps, Snippet } from "svelte"; + +/** + * A helper class to make it easy to identify Svelte components in + * `columnDef.cell` and `columnDef.header` properties. + * + * > NOTE: This class should only be used internally by the adapter. If you're + * reading this and you don't know what this is for, you probably don't need it. + * + * @example + * ```svelte + * {@const result = content(context as any)} + * {#if result instanceof RenderComponentConfig} + * {@const { component: Component, props } = result} + * + * {/if} + * ``` + */ +export class RenderComponentConfig { + component: TComponent; + props: ComponentProps | Record; + constructor( + component: TComponent, + props: ComponentProps | Record = {} + ) { + this.component = component; + this.props = props; + } +} + +/** + * A helper class to make it easy to identify Svelte Snippets in `columnDef.cell` and `columnDef.header` properties. + * + * > NOTE: This class should only be used internally by the adapter. If you're + * reading this and you don't know what this is for, you probably don't need it. + * + * @example + * ```svelte + * {@const result = content(context as any)} + * {#if result instanceof RenderSnippetConfig} + * {@const { snippet, params } = result} + * {@render snippet(params)} + * {/if} + * ``` + */ +export class RenderSnippetConfig { + snippet: Snippet<[TProps]>; + params: TProps; + constructor(snippet: Snippet<[TProps]>, params: TProps) { + this.snippet = snippet; + this.params = params; + } +} + +/** + * A helper function to help create cells from Svelte components through ColumnDef's `cell` and `header` properties. + * + * This is only to be used with Svelte Components - use `renderSnippet` for Svelte Snippets. + * + * @param component A Svelte component + * @param props The props to pass to `component` + * @returns A `RenderComponentConfig` object that helps svelte-table know how to render the header/cell component. + * @example + * ```ts + * // +page.svelte + * const defaultColumns = [ + * columnHelper.accessor('name', { + * header: header => renderComponent(SortHeader, { label: 'Name', header }), + * }), + * columnHelper.accessor('state', { + * header: header => renderComponent(SortHeader, { label: 'State', header }), + * }), + * ] + * ``` + * @see {@link https://tanstack.com/table/latest/docs/guide/column-defs} + */ +export function renderComponent< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + T extends Component, + Props extends ComponentProps, +>(component: T, props: Props) { + return new RenderComponentConfig(component, props); +} + +/** + * A helper function to help create cells from Svelte Snippets through ColumnDef's `cell` and `header` properties. + * + * The snippet must only take one parameter. + * + * This is only to be used with Snippets - use `renderComponent` for Svelte Components. + * + * @param snippet + * @param params + * @returns - A `RenderSnippetConfig` object that helps svelte-table know how to render the header/cell snippet. + * @example + * ```ts + * // +page.svelte + * const defaultColumns = [ + * columnHelper.accessor('name', { + * cell: cell => renderSnippet(nameSnippet, { name: cell.row.name }), + * }), + * columnHelper.accessor('state', { + * cell: cell => renderSnippet(stateSnippet, { state: cell.row.state }), + * }), + * ] + * ``` + * @see {@link https://tanstack.com/table/latest/docs/guide/column-defs} + */ +export function renderSnippet(snippet: Snippet<[TProps]>, params: TProps) { + return new RenderSnippetConfig(snippet, params); +} diff --git a/src/components/ui/dialog/dialog-content.svelte b/src/components/ui/dialog/dialog-content.svelte new file mode 100644 index 0000000..3e0f3a2 --- /dev/null +++ b/src/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,38 @@ + + + + + + {@render children?.()} + + + Close + + + diff --git a/src/components/ui/dialog/dialog-description.svelte b/src/components/ui/dialog/dialog-description.svelte new file mode 100644 index 0000000..b9940ed --- /dev/null +++ b/src/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/dialog/dialog-footer.svelte b/src/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 0000000..4029026 --- /dev/null +++ b/src/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,20 @@ + + +
    + {@render children?.()} +
    diff --git a/src/components/ui/dialog/dialog-header.svelte b/src/components/ui/dialog/dialog-header.svelte new file mode 100644 index 0000000..ef8a954 --- /dev/null +++ b/src/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,20 @@ + + +
    + {@render children?.()} +
    diff --git a/src/components/ui/dialog/dialog-overlay.svelte b/src/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 0000000..3b87752 --- /dev/null +++ b/src/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/dialog/dialog-portal.svelte b/src/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 0000000..eb5d0a5 --- /dev/null +++ b/src/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/src/components/ui/dialog/dialog-title.svelte b/src/components/ui/dialog/dialog-title.svelte new file mode 100644 index 0000000..96c43fc --- /dev/null +++ b/src/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/dialog/index.ts b/src/components/ui/dialog/index.ts new file mode 100644 index 0000000..3286ab7 --- /dev/null +++ b/src/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from "bits-ui"; + +import Title from "./dialog-title.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 Portal = DialogPrimitive.Portal; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/src/components/ui/drawer/drawer-content.svelte b/src/components/ui/drawer/drawer-content.svelte new file mode 100644 index 0000000..78fc78e --- /dev/null +++ b/src/components/ui/drawer/drawer-content.svelte @@ -0,0 +1,24 @@ + + + + + +
    + +
    +
    diff --git a/src/components/ui/drawer/drawer-description.svelte b/src/components/ui/drawer/drawer-description.svelte new file mode 100644 index 0000000..ecb1d8d --- /dev/null +++ b/src/components/ui/drawer/drawer-description.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/ui/drawer/drawer-footer.svelte b/src/components/ui/drawer/drawer-footer.svelte new file mode 100644 index 0000000..8ac2b0b --- /dev/null +++ b/src/components/ui/drawer/drawer-footer.svelte @@ -0,0 +1,16 @@ + + +
    + +
    diff --git a/src/components/ui/drawer/drawer-header.svelte b/src/components/ui/drawer/drawer-header.svelte new file mode 100644 index 0000000..4150a42 --- /dev/null +++ b/src/components/ui/drawer/drawer-header.svelte @@ -0,0 +1,19 @@ + + +
    + +
    diff --git a/src/components/ui/drawer/drawer-nested.svelte b/src/components/ui/drawer/drawer-nested.svelte new file mode 100644 index 0000000..79b68e3 --- /dev/null +++ b/src/components/ui/drawer/drawer-nested.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/src/components/ui/drawer/drawer-overlay.svelte b/src/components/ui/drawer/drawer-overlay.svelte new file mode 100644 index 0000000..9f336d9 --- /dev/null +++ b/src/components/ui/drawer/drawer-overlay.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/ui/drawer/drawer-title.svelte b/src/components/ui/drawer/drawer-title.svelte new file mode 100644 index 0000000..da4befc --- /dev/null +++ b/src/components/ui/drawer/drawer-title.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/ui/drawer/drawer.svelte b/src/components/ui/drawer/drawer.svelte new file mode 100644 index 0000000..40eae5e --- /dev/null +++ b/src/components/ui/drawer/drawer.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/src/components/ui/drawer/index.ts b/src/components/ui/drawer/index.ts new file mode 100644 index 0000000..76932e3 --- /dev/null +++ b/src/components/ui/drawer/index.ts @@ -0,0 +1,41 @@ +import { Drawer as DrawerPrimitive } from "vaul-svelte"; + +import Root from "./drawer.svelte"; +import Content from "./drawer-content.svelte"; +import Description from "./drawer-description.svelte"; +import Overlay from "./drawer-overlay.svelte"; +import Footer from "./drawer-footer.svelte"; +import Header from "./drawer-header.svelte"; +import Title from "./drawer-title.svelte"; +import NestedRoot from "./drawer-nested.svelte"; + +const Trigger = DrawerPrimitive.Trigger; +const Portal = DrawerPrimitive.Portal; +const Close = DrawerPrimitive.Close; + +export { + Root, + NestedRoot, + Content, + Description, + Overlay, + Footer, + Header, + Title, + Trigger, + Portal, + Close, + + // + Root as Drawer, + NestedRoot as DrawerNestedRoot, + Content as DrawerContent, + Description as DrawerDescription, + Overlay as DrawerOverlay, + Footer as DrawerFooter, + Header as DrawerHeader, + Title as DrawerTitle, + Trigger as DrawerTrigger, + Portal as DrawerPortal, + Close as DrawerClose, +}; diff --git a/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 0000000..8722697 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 0000000..cd98083 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 0000000..36e79fc --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 0000000..86c2e43 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte new file mode 100644 index 0000000..1c74ae1 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 0000000..b0cdee9 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 0000000..7c4be24 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 0000000..be0027b --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 0000000..1ca5154 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 0000000..d4b161d --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,32 @@ + + + + + + diff --git a/src/components/ui/dropdown-menu/index.ts b/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..c1749e9 --- /dev/null +++ b/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,48 @@ +import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; +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 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; + +export { + Sub, + Root, + Item, + Label, + Group, + Trigger, + Content, + Shortcut, + Separator, + RadioItem, + SubContent, + SubTrigger, + RadioGroup, + CheckboxItem, + // + Root as DropdownMenu, + Sub as DropdownMenuSub, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + Group as DropdownMenuGroup, + Content as DropdownMenuContent, + Trigger as DropdownMenuTrigger, + Shortcut as DropdownMenuShortcut, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + RadioGroup as DropdownMenuRadioGroup, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + CheckboxItem as DropdownMenuCheckboxItem, +}; diff --git a/src/components/ui/form/form-button.svelte b/src/components/ui/form/form-button.svelte new file mode 100644 index 0000000..087c839 --- /dev/null +++ b/src/components/ui/form/form-button.svelte @@ -0,0 +1,10 @@ + + + + + diff --git a/src/components/ui/form/form-description.svelte b/src/components/ui/form/form-description.svelte new file mode 100644 index 0000000..b3bc307 --- /dev/null +++ b/src/components/ui/form/form-description.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/ui/form/form-element-field.svelte b/src/components/ui/form/form-element-field.svelte new file mode 100644 index 0000000..314c1ea --- /dev/null +++ b/src/components/ui/form/form-element-field.svelte @@ -0,0 +1,25 @@ + + + + + +
    + +
    +
    diff --git a/src/components/ui/form/form-field-errors.svelte b/src/components/ui/form/form-field-errors.svelte new file mode 100644 index 0000000..64c50a5 --- /dev/null +++ b/src/components/ui/form/form-field-errors.svelte @@ -0,0 +1,26 @@ + + + + + {#each errors as error} +
    {error}
    + {/each} +
    +
    diff --git a/src/components/ui/form/form-field.svelte b/src/components/ui/form/form-field.svelte new file mode 100644 index 0000000..236e64e --- /dev/null +++ b/src/components/ui/form/form-field.svelte @@ -0,0 +1,25 @@ + + + + + +
    + +
    +
    diff --git a/src/components/ui/form/form-fieldset.svelte b/src/components/ui/form/form-fieldset.svelte new file mode 100644 index 0000000..c2fd0f7 --- /dev/null +++ b/src/components/ui/form/form-fieldset.svelte @@ -0,0 +1,30 @@ + + + + + + + diff --git a/src/components/ui/form/form-label.svelte b/src/components/ui/form/form-label.svelte new file mode 100644 index 0000000..39beac4 --- /dev/null +++ b/src/components/ui/form/form-label.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/form/form-legend.svelte b/src/components/ui/form/form-legend.svelte new file mode 100644 index 0000000..f1f9d2d --- /dev/null +++ b/src/components/ui/form/form-legend.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/ui/form/index.ts b/src/components/ui/form/index.ts new file mode 100644 index 0000000..0713927 --- /dev/null +++ b/src/components/ui/form/index.ts @@ -0,0 +1,33 @@ +import * as FormPrimitive from "formsnap"; +import Description from "./form-description.svelte"; +import Label from "./form-label.svelte"; +import FieldErrors from "./form-field-errors.svelte"; +import Field from "./form-field.svelte"; +import Fieldset from "./form-fieldset.svelte"; +import Legend from "./form-legend.svelte"; +import ElementField from "./form-element-field.svelte"; +import Button from "./form-button.svelte"; + +const Control = FormPrimitive.Control; + +export { + Field, + Control, + Label, + Button, + FieldErrors, + Description, + Fieldset, + Legend, + ElementField, + // + Field as FormField, + Control as FormControl, + Description as FormDescription, + Label as FormLabel, + FieldErrors as FormFieldErrors, + Fieldset as FormFieldset, + Legend as FormLegend, + ElementField as FormElementField, + Button as FormButton, +}; diff --git a/src/components/ui/hover-card/hover-card-content.svelte b/src/components/ui/hover-card/hover-card-content.svelte new file mode 100644 index 0000000..6f35e17 --- /dev/null +++ b/src/components/ui/hover-card/hover-card-content.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/hover-card/index.ts b/src/components/ui/hover-card/index.ts new file mode 100644 index 0000000..2d0c5c5 --- /dev/null +++ b/src/components/ui/hover-card/index.ts @@ -0,0 +1,14 @@ +import { LinkPreview as HoverCardPrimitive } from "bits-ui"; + +import Content from "./hover-card-content.svelte"; +const Root = HoverCardPrimitive.Root; +const Trigger = HoverCardPrimitive.Trigger; + +export { + Root, + Content, + Trigger, + Root as HoverCard, + Content as HoverCardContent, + Trigger as HoverCardTrigger, +}; diff --git a/src/components/ui/input/index.ts b/src/components/ui/input/index.ts new file mode 100644 index 0000000..75e3bc2 --- /dev/null +++ b/src/components/ui/input/index.ts @@ -0,0 +1,29 @@ +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, + // + Root as Input, +}; diff --git a/src/components/ui/input/input.svelte b/src/components/ui/input/input.svelte new file mode 100644 index 0000000..33bb758 --- /dev/null +++ b/src/components/ui/input/input.svelte @@ -0,0 +1,42 @@ + + + diff --git a/src/components/ui/label/index.ts b/src/components/ui/label/index.ts new file mode 100644 index 0000000..8bfca0b --- /dev/null +++ b/src/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from "./label.svelte"; + +export { + Root, + // + Root as Label, +}; diff --git a/src/components/ui/label/label.svelte b/src/components/ui/label/label.svelte new file mode 100644 index 0000000..3d6eb6e --- /dev/null +++ b/src/components/ui/label/label.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/menubar/index.ts b/src/components/ui/menubar/index.ts new file mode 100644 index 0000000..62e01eb --- /dev/null +++ b/src/components/ui/menubar/index.ts @@ -0,0 +1,52 @@ +import { Menubar as MenubarPrimitive } from "bits-ui"; + +import Root from "./menubar.svelte"; +import CheckboxItem from "./menubar-checkbox-item.svelte"; +import Content from "./menubar-content.svelte"; +import Item from "./menubar-item.svelte"; +import Label from "./menubar-label.svelte"; +import RadioItem from "./menubar-radio-item.svelte"; +import Separator from "./menubar-separator.svelte"; +import Shortcut from "./menubar-shortcut.svelte"; +import SubContent from "./menubar-sub-content.svelte"; +import SubTrigger from "./menubar-sub-trigger.svelte"; +import Trigger from "./menubar-trigger.svelte"; + +const Menu = MenubarPrimitive.Menu; +const Group = MenubarPrimitive.Group; +const Sub = MenubarPrimitive.Sub; +const RadioGroup = MenubarPrimitive.RadioGroup; + +export { + Root, + CheckboxItem, + Content, + Item, + Label, + RadioItem, + Separator, + Shortcut, + SubContent, + SubTrigger, + Trigger, + Menu, + Group, + Sub, + RadioGroup, + // + Root as Menubar, + CheckboxItem as MenubarCheckboxItem, + Content as MenubarContent, + Item as MenubarItem, + Label as MenubarLabel, + RadioItem as MenubarRadioItem, + Separator as MenubarSeparator, + Shortcut as MenubarShortcut, + SubContent as MenubarSubContent, + SubTrigger as MenubarSubTrigger, + Trigger as MenubarTrigger, + Menu as MenubarMenu, + Group as MenubarGroup, + Sub as MenubarSub, + RadioGroup as MenubarRadioGroup, +}; diff --git a/src/components/ui/menubar/menubar-checkbox-item.svelte b/src/components/ui/menubar/menubar-checkbox-item.svelte new file mode 100644 index 0000000..6fc9f41 --- /dev/null +++ b/src/components/ui/menubar/menubar-checkbox-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/components/ui/menubar/menubar-content.svelte b/src/components/ui/menubar/menubar-content.svelte new file mode 100644 index 0000000..85ab4e7 --- /dev/null +++ b/src/components/ui/menubar/menubar-content.svelte @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/ui/menubar/menubar-item.svelte b/src/components/ui/menubar/menubar-item.svelte new file mode 100644 index 0000000..acb590c --- /dev/null +++ b/src/components/ui/menubar/menubar-item.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/ui/menubar/menubar-label.svelte b/src/components/ui/menubar/menubar-label.svelte new file mode 100644 index 0000000..dde4c5d --- /dev/null +++ b/src/components/ui/menubar/menubar-label.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/ui/menubar/menubar-radio-item.svelte b/src/components/ui/menubar/menubar-radio-item.svelte new file mode 100644 index 0000000..87766f5 --- /dev/null +++ b/src/components/ui/menubar/menubar-radio-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/src/components/ui/menubar/menubar-separator.svelte b/src/components/ui/menubar/menubar-separator.svelte new file mode 100644 index 0000000..a77b72c --- /dev/null +++ b/src/components/ui/menubar/menubar-separator.svelte @@ -0,0 +1,11 @@ + + + diff --git a/src/components/ui/menubar/menubar-shortcut.svelte b/src/components/ui/menubar/menubar-shortcut.svelte new file mode 100644 index 0000000..43b5919 --- /dev/null +++ b/src/components/ui/menubar/menubar-shortcut.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/menubar/menubar-sub-content.svelte b/src/components/ui/menubar/menubar-sub-content.svelte new file mode 100644 index 0000000..83b2595 --- /dev/null +++ b/src/components/ui/menubar/menubar-sub-content.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/menubar/menubar-sub-trigger.svelte b/src/components/ui/menubar/menubar-sub-trigger.svelte new file mode 100644 index 0000000..3f9d00d --- /dev/null +++ b/src/components/ui/menubar/menubar-sub-trigger.svelte @@ -0,0 +1,32 @@ + + + + + + diff --git a/src/components/ui/menubar/menubar-trigger.svelte b/src/components/ui/menubar/menubar-trigger.svelte new file mode 100644 index 0000000..f12e64c --- /dev/null +++ b/src/components/ui/menubar/menubar-trigger.svelte @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/ui/menubar/menubar.svelte b/src/components/ui/menubar/menubar.svelte new file mode 100644 index 0000000..dcaa67a --- /dev/null +++ b/src/components/ui/menubar/menubar.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/pagination/index.ts b/src/components/ui/pagination/index.ts new file mode 100644 index 0000000..d83c7a9 --- /dev/null +++ b/src/components/ui/pagination/index.ts @@ -0,0 +1,25 @@ +import Root from "./pagination.svelte"; +import Content from "./pagination-content.svelte"; +import Item from "./pagination-item.svelte"; +import Link from "./pagination-link.svelte"; +import PrevButton from "./pagination-prev-button.svelte"; +import NextButton from "./pagination-next-button.svelte"; +import Ellipsis from "./pagination-ellipsis.svelte"; + +export { + Root, + Content, + Item, + Link, + PrevButton, + NextButton, + Ellipsis, + // + Root as Pagination, + Content as PaginationContent, + Item as PaginationItem, + Link as PaginationLink, + PrevButton as PaginationPrevButton, + NextButton as PaginationNextButton, + Ellipsis as PaginationEllipsis, +}; diff --git a/src/components/ui/pagination/pagination-content.svelte b/src/components/ui/pagination/pagination-content.svelte new file mode 100644 index 0000000..fc15b68 --- /dev/null +++ b/src/components/ui/pagination/pagination-content.svelte @@ -0,0 +1,13 @@ + + +
      + +
    diff --git a/src/components/ui/pagination/pagination-ellipsis.svelte b/src/components/ui/pagination/pagination-ellipsis.svelte new file mode 100644 index 0000000..3327409 --- /dev/null +++ b/src/components/ui/pagination/pagination-ellipsis.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/pagination/pagination-item.svelte b/src/components/ui/pagination/pagination-item.svelte new file mode 100644 index 0000000..c0f209d --- /dev/null +++ b/src/components/ui/pagination/pagination-item.svelte @@ -0,0 +1,13 @@ + + +
  • + +
  • diff --git a/src/components/ui/pagination/pagination-link.svelte b/src/components/ui/pagination/pagination-link.svelte new file mode 100644 index 0000000..f13f471 --- /dev/null +++ b/src/components/ui/pagination/pagination-link.svelte @@ -0,0 +1,34 @@ + + + + {page.value} + diff --git a/src/components/ui/pagination/pagination-next-button.svelte b/src/components/ui/pagination/pagination-next-button.svelte new file mode 100644 index 0000000..947cdb7 --- /dev/null +++ b/src/components/ui/pagination/pagination-next-button.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/pagination/pagination-prev-button.svelte b/src/components/ui/pagination/pagination-prev-button.svelte new file mode 100644 index 0000000..e7818d7 --- /dev/null +++ b/src/components/ui/pagination/pagination-prev-button.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/pagination/pagination.svelte b/src/components/ui/pagination/pagination.svelte new file mode 100644 index 0000000..78b1633 --- /dev/null +++ b/src/components/ui/pagination/pagination.svelte @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/ui/popover/index.ts b/src/components/ui/popover/index.ts new file mode 100644 index 0000000..63aecf9 --- /dev/null +++ b/src/components/ui/popover/index.ts @@ -0,0 +1,17 @@ +import { Popover as PopoverPrimitive } from "bits-ui"; +import Content from "./popover-content.svelte"; +const Root = PopoverPrimitive.Root; +const Trigger = PopoverPrimitive.Trigger; +const Close = PopoverPrimitive.Close; + +export { + Root, + Content, + Trigger, + Close, + // + Root as Popover, + Content as PopoverContent, + Trigger as PopoverTrigger, + Close as PopoverClose, +}; diff --git a/src/components/ui/popover/popover-content.svelte b/src/components/ui/popover/popover-content.svelte new file mode 100644 index 0000000..fbdda91 --- /dev/null +++ b/src/components/ui/popover/popover-content.svelte @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/ui/progress/index.ts b/src/components/ui/progress/index.ts new file mode 100644 index 0000000..25eee61 --- /dev/null +++ b/src/components/ui/progress/index.ts @@ -0,0 +1,7 @@ +import Root from "./progress.svelte"; + +export { + Root, + // + Root as Progress, +}; diff --git a/src/components/ui/progress/progress.svelte b/src/components/ui/progress/progress.svelte new file mode 100644 index 0000000..d156ba5 --- /dev/null +++ b/src/components/ui/progress/progress.svelte @@ -0,0 +1,21 @@ + + + +
    +
    diff --git a/src/components/ui/radio-group/index.ts b/src/components/ui/radio-group/index.ts new file mode 100644 index 0000000..feefa79 --- /dev/null +++ b/src/components/ui/radio-group/index.ts @@ -0,0 +1,15 @@ +import { RadioGroup as RadioGroupPrimitive } from "bits-ui"; + +import Root from "./radio-group.svelte"; +import Item from "./radio-group-item.svelte"; +const Input = RadioGroupPrimitive.Input; + +export { + Root, + Input, + Item, + // + Root as RadioGroup, + Input as RadioGroupInput, + Item as RadioGroupItem, +}; diff --git a/src/components/ui/radio-group/radio-group-item.svelte b/src/components/ui/radio-group/radio-group-item.svelte new file mode 100644 index 0000000..32c296e --- /dev/null +++ b/src/components/ui/radio-group/radio-group-item.svelte @@ -0,0 +1,28 @@ + + + +
    + + + +
    +
    diff --git a/src/components/ui/radio-group/radio-group.svelte b/src/components/ui/radio-group/radio-group.svelte new file mode 100644 index 0000000..5e4149d --- /dev/null +++ b/src/components/ui/radio-group/radio-group.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/src/components/ui/range-calendar/index.ts b/src/components/ui/range-calendar/index.ts new file mode 100644 index 0000000..43adb92 --- /dev/null +++ b/src/components/ui/range-calendar/index.ts @@ -0,0 +1,30 @@ +import Root from "./range-calendar.svelte"; +import Cell from "./range-calendar-cell.svelte"; +import Day from "./range-calendar-day.svelte"; +import Grid from "./range-calendar-grid.svelte"; +import Header from "./range-calendar-header.svelte"; +import Months from "./range-calendar-months.svelte"; +import GridRow from "./range-calendar-grid-row.svelte"; +import Heading from "./range-calendar-heading.svelte"; +import GridBody from "./range-calendar-grid-body.svelte"; +import GridHead from "./range-calendar-grid-head.svelte"; +import HeadCell from "./range-calendar-head-cell.svelte"; +import NextButton from "./range-calendar-next-button.svelte"; +import PrevButton from "./range-calendar-prev-button.svelte"; + +export { + Day, + Cell, + Grid, + Header, + Months, + GridRow, + Heading, + GridBody, + GridHead, + HeadCell, + NextButton, + PrevButton, + // + Root as RangeCalendar, +}; diff --git a/src/components/ui/range-calendar/range-calendar-cell.svelte b/src/components/ui/range-calendar/range-calendar-cell.svelte new file mode 100644 index 0000000..39d6843 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-cell.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-day.svelte b/src/components/ui/range-calendar/range-calendar-day.svelte new file mode 100644 index 0000000..1380e71 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-day.svelte @@ -0,0 +1,43 @@ + + + + + {date.day} + + diff --git a/src/components/ui/range-calendar/range-calendar-grid-body.svelte b/src/components/ui/range-calendar/range-calendar-grid-body.svelte new file mode 100644 index 0000000..984fb6c --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-grid-body.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-grid-head.svelte b/src/components/ui/range-calendar/range-calendar-grid-head.svelte new file mode 100644 index 0000000..c85701e --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-grid-head.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-grid-row.svelte b/src/components/ui/range-calendar/range-calendar-grid-row.svelte new file mode 100644 index 0000000..ecea549 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-grid-row.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-grid.svelte b/src/components/ui/range-calendar/range-calendar-grid.svelte new file mode 100644 index 0000000..a8c2826 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-grid.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-head-cell.svelte b/src/components/ui/range-calendar/range-calendar-head-cell.svelte new file mode 100644 index 0000000..426d72b --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-head-cell.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-header.svelte b/src/components/ui/range-calendar/range-calendar-header.svelte new file mode 100644 index 0000000..bcc524a --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-header.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-heading.svelte b/src/components/ui/range-calendar/range-calendar-heading.svelte new file mode 100644 index 0000000..f4cec18 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-heading.svelte @@ -0,0 +1,19 @@ + + + + + {headingValue} + + diff --git a/src/components/ui/range-calendar/range-calendar-months.svelte b/src/components/ui/range-calendar/range-calendar-months.svelte new file mode 100644 index 0000000..42fbda7 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-months.svelte @@ -0,0 +1,16 @@ + + +
    + +
    diff --git a/src/components/ui/range-calendar/range-calendar-next-button.svelte b/src/components/ui/range-calendar/range-calendar-next-button.svelte new file mode 100644 index 0000000..f0d43a7 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-next-button.svelte @@ -0,0 +1,27 @@ + + + + + + + diff --git a/src/components/ui/range-calendar/range-calendar-prev-button.svelte b/src/components/ui/range-calendar/range-calendar-prev-button.svelte new file mode 100644 index 0000000..8253abe --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar-prev-button.svelte @@ -0,0 +1,27 @@ + + + + + + + diff --git a/src/components/ui/range-calendar/range-calendar.svelte b/src/components/ui/range-calendar/range-calendar.svelte new file mode 100644 index 0000000..a4ddca3 --- /dev/null +++ b/src/components/ui/range-calendar/range-calendar.svelte @@ -0,0 +1,60 @@ + + + + + + + + + + {#each months as month} + + + + {#each weekdays as weekday} + + {weekday.slice(0, 2)} + + {/each} + + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {/each} + + {/each} + + + {/each} + + diff --git a/src/components/ui/resizable/index.ts b/src/components/ui/resizable/index.ts new file mode 100644 index 0000000..2e37f11 --- /dev/null +++ b/src/components/ui/resizable/index.ts @@ -0,0 +1,13 @@ +import { Pane } from "paneforge"; +import Handle from "./resizable-handle.svelte"; +import PaneGroup from "./resizable-pane-group.svelte"; + +export { + PaneGroup, + Pane, + Handle, + // + PaneGroup as ResizablePaneGroup, + Pane as ResizablePane, + Handle as ResizableHandle, +}; diff --git a/src/components/ui/resizable/resizable-handle.svelte b/src/components/ui/resizable/resizable-handle.svelte new file mode 100644 index 0000000..c9c11ee --- /dev/null +++ b/src/components/ui/resizable/resizable-handle.svelte @@ -0,0 +1,28 @@ + + +div]:rotate-90", + className + )} +> + {#if withHandle} +
    + +
    + {/if} +
    diff --git a/src/components/ui/resizable/resizable-pane-group.svelte b/src/components/ui/resizable/resizable-pane-group.svelte new file mode 100644 index 0000000..7f00435 --- /dev/null +++ b/src/components/ui/resizable/resizable-pane-group.svelte @@ -0,0 +1,22 @@ + + + + + diff --git a/src/components/ui/scroll-area/index.ts b/src/components/ui/scroll-area/index.ts new file mode 100644 index 0000000..e86a25b --- /dev/null +++ b/src/components/ui/scroll-area/index.ts @@ -0,0 +1,10 @@ +import Scrollbar from "./scroll-area-scrollbar.svelte"; +import Root from "./scroll-area.svelte"; + +export { + Root, + Scrollbar, + //, + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar, +}; 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 0000000..7da22ea --- /dev/null +++ b/src/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + 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 0000000..1fd7030 --- /dev/null +++ b/src/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,32 @@ + + + + + {@render children?.()} + + {#if orientation === "vertical" || orientation === "both"} + + {/if} + {#if orientation === "horizontal" || orientation === "both"} + + {/if} + + diff --git a/src/components/ui/select/index.ts b/src/components/ui/select/index.ts new file mode 100644 index 0000000..f31b8ae --- /dev/null +++ b/src/components/ui/select/index.ts @@ -0,0 +1,34 @@ +import { Select as SelectPrimitive } from "bits-ui"; + +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; + +export { + Root, + Group, + GroupHeading, + Item, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + // + Root as Select, + Group as SelectGroup, + GroupHeading as SelectGroupHeading, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, +}; diff --git a/src/components/ui/select/select-content.svelte b/src/components/ui/select/select-content.svelte new file mode 100644 index 0000000..234ebe6 --- /dev/null +++ b/src/components/ui/select/select-content.svelte @@ -0,0 +1,39 @@ + + + + + + + {@render children?.()} + + + + diff --git a/src/components/ui/select/select-group-heading.svelte b/src/components/ui/select/select-group-heading.svelte new file mode 100644 index 0000000..5935dcc --- /dev/null +++ b/src/components/ui/select/select-group-heading.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/select/select-item.svelte b/src/components/ui/select/select-item.svelte new file mode 100644 index 0000000..2b4e491 --- /dev/null +++ b/src/components/ui/select/select-item.svelte @@ -0,0 +1,37 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/src/components/ui/select/select-label.svelte b/src/components/ui/select/select-label.svelte new file mode 100644 index 0000000..6cf21d5 --- /dev/null +++ b/src/components/ui/select/select-label.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/select/select-scroll-down-button.svelte b/src/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 0000000..cc79b85 --- /dev/null +++ b/src/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/ui/select/select-scroll-up-button.svelte b/src/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 0000000..950a7a2 --- /dev/null +++ b/src/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/ui/select/select-separator.svelte b/src/components/ui/select/select-separator.svelte new file mode 100644 index 0000000..2473105 --- /dev/null +++ b/src/components/ui/select/select-separator.svelte @@ -0,0 +1,13 @@ + + + diff --git a/src/components/ui/select/select-trigger.svelte b/src/components/ui/select/select-trigger.svelte new file mode 100644 index 0000000..ff76e9d --- /dev/null +++ b/src/components/ui/select/select-trigger.svelte @@ -0,0 +1,24 @@ + + +span]:line-clamp-1", + className + )} + {...restProps} +> + {@render children?.()} + + diff --git a/src/components/ui/separator/index.ts b/src/components/ui/separator/index.ts new file mode 100644 index 0000000..82442d2 --- /dev/null +++ b/src/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/src/components/ui/separator/separator.svelte b/src/components/ui/separator/separator.svelte new file mode 100644 index 0000000..a2a8732 --- /dev/null +++ b/src/components/ui/separator/separator.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/components/ui/sheet/index.ts b/src/components/ui/sheet/index.ts new file mode 100644 index 0000000..efad474 --- /dev/null +++ b/src/components/ui/sheet/index.ts @@ -0,0 +1,106 @@ +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"; +import Footer from "./sheet-footer.svelte"; +import Title from "./sheet-title.svelte"; +import Description from "./sheet-description.svelte"; + +const Root = SheetPrimitive.Root; +const Close = SheetPrimitive.Close; +const Trigger = SheetPrimitive.Trigger; + +export { + Root, + Close, + Trigger, + Portal, + Overlay, + Content, + Header, + Footer, + Title, + Description, + // + Root as Sheet, + Close as SheetClose, + Trigger as SheetTrigger, + Portal as SheetPortal, + Overlay as SheetOverlay, + Content as SheetContent, + Header as SheetHeader, + Footer as SheetFooter, + 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/components/ui/sheet/sheet-content.svelte b/src/components/ui/sheet/sheet-content.svelte new file mode 100644 index 0000000..9a0329c --- /dev/null +++ b/src/components/ui/sheet/sheet-content.svelte @@ -0,0 +1,47 @@ + + + + + + + + + Close + + + diff --git a/src/components/ui/sheet/sheet-description.svelte b/src/components/ui/sheet/sheet-description.svelte new file mode 100644 index 0000000..3d8d145 --- /dev/null +++ b/src/components/ui/sheet/sheet-description.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/ui/sheet/sheet-footer.svelte b/src/components/ui/sheet/sheet-footer.svelte new file mode 100644 index 0000000..c489a48 --- /dev/null +++ b/src/components/ui/sheet/sheet-footer.svelte @@ -0,0 +1,16 @@ + + +
    + +
    diff --git a/src/components/ui/sheet/sheet-header.svelte b/src/components/ui/sheet/sheet-header.svelte new file mode 100644 index 0000000..67ae2e6 --- /dev/null +++ b/src/components/ui/sheet/sheet-header.svelte @@ -0,0 +1,13 @@ + + +
    + +
    diff --git a/src/components/ui/sheet/sheet-overlay.svelte b/src/components/ui/sheet/sheet-overlay.svelte new file mode 100644 index 0000000..05d662e --- /dev/null +++ b/src/components/ui/sheet/sheet-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/components/ui/sheet/sheet-portal.svelte b/src/components/ui/sheet/sheet-portal.svelte new file mode 100644 index 0000000..4eae12d --- /dev/null +++ b/src/components/ui/sheet/sheet-portal.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/ui/sheet/sheet-title.svelte b/src/components/ui/sheet/sheet-title.svelte new file mode 100644 index 0000000..00ad575 --- /dev/null +++ b/src/components/ui/sheet/sheet-title.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/ui/skeleton/index.ts b/src/components/ui/skeleton/index.ts new file mode 100644 index 0000000..186db21 --- /dev/null +++ b/src/components/ui/skeleton/index.ts @@ -0,0 +1,7 @@ +import Root from "./skeleton.svelte"; + +export { + Root, + // + Root as Skeleton, +}; diff --git a/src/components/ui/skeleton/skeleton.svelte b/src/components/ui/skeleton/skeleton.svelte new file mode 100644 index 0000000..6bdc553 --- /dev/null +++ b/src/components/ui/skeleton/skeleton.svelte @@ -0,0 +1,11 @@ + + +
    diff --git a/src/components/ui/slider/index.ts b/src/components/ui/slider/index.ts new file mode 100644 index 0000000..820f209 --- /dev/null +++ b/src/components/ui/slider/index.ts @@ -0,0 +1,7 @@ +import Root from "./slider.svelte"; + +export { + Root, + // + Root as Slider, +}; diff --git a/src/components/ui/slider/slider.svelte b/src/components/ui/slider/slider.svelte new file mode 100644 index 0000000..6e155dc --- /dev/null +++ b/src/components/ui/slider/slider.svelte @@ -0,0 +1,44 @@ + + + + + {#snippet children({ thumbs })} + + + + {#each thumbs as thumb} + + {/each} + {/snippet} + diff --git a/src/components/ui/sonner/index.ts b/src/components/ui/sonner/index.ts new file mode 100644 index 0000000..1ad9f4a --- /dev/null +++ b/src/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from "./sonner.svelte"; diff --git a/src/components/ui/sonner/sonner.svelte b/src/components/ui/sonner/sonner.svelte new file mode 100644 index 0000000..7d5b2f1 --- /dev/null +++ b/src/components/ui/sonner/sonner.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/ui/switch/index.ts b/src/components/ui/switch/index.ts new file mode 100644 index 0000000..f5533db --- /dev/null +++ b/src/components/ui/switch/index.ts @@ -0,0 +1,7 @@ +import Root from "./switch.svelte"; + +export { + Root, + // + Root as Switch, +}; diff --git a/src/components/ui/switch/switch.svelte b/src/components/ui/switch/switch.svelte new file mode 100644 index 0000000..6ed27c6 --- /dev/null +++ b/src/components/ui/switch/switch.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/table/index.ts b/src/components/ui/table/index.ts new file mode 100644 index 0000000..14695c8 --- /dev/null +++ b/src/components/ui/table/index.ts @@ -0,0 +1,28 @@ +import Root from "./table.svelte"; +import Body from "./table-body.svelte"; +import Caption from "./table-caption.svelte"; +import Cell from "./table-cell.svelte"; +import Footer from "./table-footer.svelte"; +import Head from "./table-head.svelte"; +import Header from "./table-header.svelte"; +import Row from "./table-row.svelte"; + +export { + Root, + Body, + Caption, + Cell, + Footer, + Head, + Header, + Row, + // + Root as Table, + Body as TableBody, + Caption as TableCaption, + Cell as TableCell, + Footer as TableFooter, + Head as TableHead, + Header as TableHeader, + Row as TableRow, +}; diff --git a/src/components/ui/table/table-body.svelte b/src/components/ui/table/table-body.svelte new file mode 100644 index 0000000..45312e0 --- /dev/null +++ b/src/components/ui/table/table-body.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table-caption.svelte b/src/components/ui/table/table-caption.svelte new file mode 100644 index 0000000..da86a6c --- /dev/null +++ b/src/components/ui/table/table-caption.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table-cell.svelte b/src/components/ui/table/table-cell.svelte new file mode 100644 index 0000000..e5a45d3 --- /dev/null +++ b/src/components/ui/table/table-cell.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table-footer.svelte b/src/components/ui/table/table-footer.svelte new file mode 100644 index 0000000..87b02f4 --- /dev/null +++ b/src/components/ui/table/table-footer.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table-head.svelte b/src/components/ui/table/table-head.svelte new file mode 100644 index 0000000..92d3165 --- /dev/null +++ b/src/components/ui/table/table-head.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table-header.svelte b/src/components/ui/table/table-header.svelte new file mode 100644 index 0000000..b20d757 --- /dev/null +++ b/src/components/ui/table/table-header.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table-row.svelte b/src/components/ui/table/table-row.svelte new file mode 100644 index 0000000..588b80c --- /dev/null +++ b/src/components/ui/table/table-row.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/table/table.svelte b/src/components/ui/table/table.svelte new file mode 100644 index 0000000..f1a001e --- /dev/null +++ b/src/components/ui/table/table.svelte @@ -0,0 +1,18 @@ + + +
    + + {@render children?.()} +
    +
    diff --git a/src/components/ui/tabs/index.ts b/src/components/ui/tabs/index.ts new file mode 100644 index 0000000..f1ab372 --- /dev/null +++ b/src/components/ui/tabs/index.ts @@ -0,0 +1,18 @@ +import { Tabs as TabsPrimitive } from "bits-ui"; +import Content from "./tabs-content.svelte"; +import List from "./tabs-list.svelte"; +import Trigger from "./tabs-trigger.svelte"; + +const Root = TabsPrimitive.Root; + +export { + Root, + Content, + List, + Trigger, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger, +}; diff --git a/src/components/ui/tabs/tabs-content.svelte b/src/components/ui/tabs/tabs-content.svelte new file mode 100644 index 0000000..c75487f --- /dev/null +++ b/src/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/ui/tabs/tabs-list.svelte b/src/components/ui/tabs/tabs-list.svelte new file mode 100644 index 0000000..46cec0a --- /dev/null +++ b/src/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/ui/tabs/tabs-trigger.svelte b/src/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 0000000..edee943 --- /dev/null +++ b/src/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/ui/textarea/index.ts b/src/components/ui/textarea/index.ts new file mode 100644 index 0000000..6eb6ba3 --- /dev/null +++ b/src/components/ui/textarea/index.ts @@ -0,0 +1,28 @@ +import Root from "./textarea.svelte"; + +type FormTextareaEvent = T & { + currentTarget: EventTarget & HTMLTextAreaElement; +}; + +type TextareaEvents = { + blur: FormTextareaEvent; + change: FormTextareaEvent; + click: FormTextareaEvent; + focus: FormTextareaEvent; + keydown: FormTextareaEvent; + keypress: FormTextareaEvent; + keyup: FormTextareaEvent; + mouseover: FormTextareaEvent; + mouseenter: FormTextareaEvent; + mouseleave: FormTextareaEvent; + paste: FormTextareaEvent; + input: FormTextareaEvent; +}; + +export { + Root, + // + Root as Textarea, + type TextareaEvents, + type FormTextareaEvent, +}; diff --git a/src/components/ui/textarea/textarea.svelte b/src/components/ui/textarea/textarea.svelte new file mode 100644 index 0000000..73b4083 --- /dev/null +++ b/src/components/ui/textarea/textarea.svelte @@ -0,0 +1,38 @@ + + + diff --git a/src/components/ui/toggle-group/index.ts b/src/components/ui/toggle-group/index.ts new file mode 100644 index 0000000..053ebbc --- /dev/null +++ b/src/components/ui/toggle-group/index.ts @@ -0,0 +1,23 @@ +import type { VariantProps } from "tailwind-variants"; +import { getContext, setContext } from "svelte"; +import Root from "./toggle-group.svelte"; +import Item from "./toggle-group-item.svelte"; +import type { toggleVariants } from "$lib/components/ui/toggle/index.js"; + +export type ToggleVariants = VariantProps; + +export function setToggleGroupCtx(props: ToggleVariants) { + setContext("toggleGroup", props); +} + +export function getToggleGroupCtx() { + return getContext("toggleGroup"); +} + +export { + Root, + Item, + // + Root as ToggleGroup, + Item as ToggleGroupItem, +}; diff --git a/src/components/ui/toggle-group/toggle-group-item.svelte b/src/components/ui/toggle-group/toggle-group-item.svelte new file mode 100644 index 0000000..2250b94 --- /dev/null +++ b/src/components/ui/toggle-group/toggle-group-item.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/ui/toggle-group/toggle-group.svelte b/src/components/ui/toggle-group/toggle-group.svelte new file mode 100644 index 0000000..c3bc074 --- /dev/null +++ b/src/components/ui/toggle-group/toggle-group.svelte @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/ui/toggle/index.ts b/src/components/ui/toggle/index.ts new file mode 100644 index 0000000..b5c22a2 --- /dev/null +++ b/src/components/ui/toggle/index.ts @@ -0,0 +1,31 @@ +import { type VariantProps, tv } from "tailwind-variants"; +import Root from "./toggle.svelte"; + +export const toggleVariants = tv({ + base: "ring-offset-background hover:bg-muted hover:text-muted-foreground focus-visible:ring-ring data-[state=on]:bg-accent data-[state=on]:text-accent-foreground inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + variants: { + variant: { + default: "bg-transparent", + outline: + "border-input hover:bg-accent hover:text-accent-foreground border bg-transparent", + }, + size: { + default: "h-10 px-3", + sm: "h-9 px-2.5", + lg: "h-11 px-5", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, +}); + +export type Variant = VariantProps["variant"]; +export type Size = VariantProps["size"]; + +export { + Root, + // + Root as Toggle, +}; diff --git a/src/components/ui/toggle/toggle.svelte b/src/components/ui/toggle/toggle.svelte new file mode 100644 index 0000000..531193e --- /dev/null +++ b/src/components/ui/toggle/toggle.svelte @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/ui/tooltip/index.ts b/src/components/ui/tooltip/index.ts new file mode 100644 index 0000000..7d0444d --- /dev/null +++ b/src/components/ui/tooltip/index.ts @@ -0,0 +1,15 @@ +import { Tooltip as TooltipPrimitive } from "bits-ui"; +import Content from "./tooltip-content.svelte"; + +const Root = TooltipPrimitive.Root; +const Trigger = TooltipPrimitive.Trigger; + +export { + Root, + Trigger, + Content, + // + Root as Tooltip, + Content as TooltipContent, + Trigger as TooltipTrigger, +}; diff --git a/src/components/ui/tooltip/tooltip-content.svelte b/src/components/ui/tooltip/tooltip-content.svelte new file mode 100644 index 0000000..51b5bc9 --- /dev/null +++ b/src/components/ui/tooltip/tooltip-content.svelte @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/utils.ts b/src/components/utils.ts new file mode 100644 index 0000000..41bc6ee --- /dev/null +++ b/src/components/utils.ts @@ -0,0 +1,77 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +export function window(arr: T[], len: number): T[][] { + const result: T[][] = []; + for (let i = 0; i < arr.length; i += len) { + result.push(arr.slice(i, i + len)); + } + return result; +} + +export function stopPropagation(a: any) { + return (e: Event) => { + e.stopPropagation(); + a(e); + }; +} + +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, + }; +}; \ No newline at end of file