@meshagent/meshagent-tailwind 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/LICENSE +201 -0
  3. package/README.md +0 -0
  4. package/dist/cjs/Chat.d.ts +7 -0
  5. package/dist/cjs/Chat.js +45 -0
  6. package/dist/cjs/ChatInput.d.ts +7 -0
  7. package/dist/cjs/ChatInput.js +70 -0
  8. package/dist/cjs/ChatThread.d.ts +6 -0
  9. package/dist/cjs/ChatThread.js +109 -0
  10. package/dist/cjs/ChatTypingIndicator.d.ts +7 -0
  11. package/dist/cjs/ChatTypingIndicator.js +49 -0
  12. package/dist/cjs/FileUploader.d.ts +6 -0
  13. package/dist/cjs/FileUploader.js +64 -0
  14. package/dist/cjs/components/ui/avatar.d.ts +6 -0
  15. package/dist/cjs/components/ui/avatar.js +83 -0
  16. package/dist/cjs/components/ui/button.d.ts +10 -0
  17. package/dist/cjs/components/ui/button.js +70 -0
  18. package/dist/cjs/components/ui/card.d.ts +9 -0
  19. package/dist/cjs/components/ui/card.js +110 -0
  20. package/dist/cjs/components/ui/skeleton.d.ts +2 -0
  21. package/dist/cjs/components/ui/skeleton.js +35 -0
  22. package/dist/cjs/components/ui/spinner.d.ts +24 -0
  23. package/dist/cjs/components/ui/spinner.js +48 -0
  24. package/dist/cjs/components/ui/textarea.d.ts +3 -0
  25. package/dist/cjs/components/ui/textarea.js +38 -0
  26. package/dist/cjs/index.d.ts +5 -0
  27. package/dist/cjs/index.js +22 -0
  28. package/dist/cjs/lib/utils.d.ts +2 -0
  29. package/dist/cjs/lib/utils.js +28 -0
  30. package/dist/esm/Chat.d.ts +7 -0
  31. package/dist/esm/Chat.js +25 -0
  32. package/dist/esm/ChatInput.d.ts +7 -0
  33. package/dist/esm/ChatInput.js +40 -0
  34. package/dist/esm/ChatThread.d.ts +6 -0
  35. package/dist/esm/ChatThread.js +79 -0
  36. package/dist/esm/ChatTypingIndicator.d.ts +7 -0
  37. package/dist/esm/ChatTypingIndicator.js +29 -0
  38. package/dist/esm/FileUploader.d.ts +6 -0
  39. package/dist/esm/FileUploader.js +44 -0
  40. package/dist/esm/components/ui/avatar.d.ts +6 -0
  41. package/dist/esm/components/ui/avatar.js +53 -0
  42. package/dist/esm/components/ui/button.d.ts +10 -0
  43. package/dist/esm/components/ui/button.js +50 -0
  44. package/dist/esm/components/ui/card.d.ts +9 -0
  45. package/dist/esm/components/ui/card.js +90 -0
  46. package/dist/esm/components/ui/skeleton.d.ts +2 -0
  47. package/dist/esm/components/ui/skeleton.js +15 -0
  48. package/dist/esm/components/ui/spinner.d.ts +24 -0
  49. package/dist/esm/components/ui/spinner.js +28 -0
  50. package/dist/esm/components/ui/textarea.d.ts +3 -0
  51. package/dist/esm/components/ui/textarea.js +18 -0
  52. package/dist/esm/index.d.ts +5 -0
  53. package/dist/esm/index.js +5 -0
  54. package/dist/esm/lib/utils.d.ts +2 -0
  55. package/dist/esm/lib/utils.js +8 -0
  56. package/dist/index.css +2 -0
  57. package/package.json +72 -0
@@ -0,0 +1,79 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import ReactMarkdown from "react-markdown";
4
+ import remarkGfm from "remark-gfm";
5
+ import rehypeSanitize from "rehype-sanitize";
6
+ import rehypeHighlight from "rehype-highlight";
7
+ import { cn } from "./lib/utils";
8
+ function formatDateTime(iso) {
9
+ const date = new Date(iso);
10
+ return new Intl.DateTimeFormat(void 0, {
11
+ year: "numeric",
12
+ month: "long",
13
+ day: "numeric",
14
+ hour: "numeric",
15
+ minute: "2-digit",
16
+ hour12: true,
17
+ timeZoneName: "short"
18
+ }).format(date);
19
+ }
20
+ function timeAgo(iso) {
21
+ const rtf = new Intl.RelativeTimeFormat(void 0, { numeric: "auto" });
22
+ const date = new Date(iso);
23
+ const now = /* @__PURE__ */ new Date();
24
+ const seconds = Math.round((date.getTime() - now.getTime()) / 1e3);
25
+ const minutes = Math.round(seconds / 60);
26
+ const hours = Math.round(minutes / 60);
27
+ const days = Math.round(hours / 24);
28
+ const months = Math.round(days / 30);
29
+ if (Math.abs(months) >= 1) return formatDateTime(iso);
30
+ if (Math.abs(days) >= 1) return rtf.format(days, "day");
31
+ if (Math.abs(hours) >= 1) return rtf.format(hours, "hour");
32
+ if (Math.abs(minutes) >= 1) return rtf.format(minutes, "minute");
33
+ return rtf.format(seconds, "second");
34
+ }
35
+ function ChatThread({ messages, localParticipantName }) {
36
+ const bottomRef = React.useRef(null);
37
+ React.useEffect(() => {
38
+ bottomRef.current?.scrollIntoView({ behavior: "smooth" });
39
+ }, [messages]);
40
+ return /* @__PURE__ */ jsxs("div", { className: "flex-1 flex-shrink-1 basis-0 overflow-y-auto p-4 space-y-4", children: [
41
+ messages.map((message) => {
42
+ const mine = localParticipantName == message.getAttribute("author_name");
43
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col max-w-prose items-start gap-1", { "justify-end": mine, "justify-start": !mine }), children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "mb-0.5 text-xs text-muted-foreground", children: [
45
+ "By ",
46
+ message.getAttribute("author_name"),
47
+ " at ",
48
+ timeAgo(message.getAttribute("created_at"))
49
+ ] }),
50
+ /* @__PURE__ */ jsx(ChatBubble, { text: message.getAttribute("text"), mine }, message.id)
51
+ ] }, message.id);
52
+ }),
53
+ /* @__PURE__ */ jsx("div", { ref: bottomRef })
54
+ ] });
55
+ }
56
+ function ChatBubble({ text, mine }) {
57
+ return /* @__PURE__ */ jsx("div", { className: cn(
58
+ "rounded-lg px-4 py-2 text-sm max-w-prose whitespace-pre-wrap",
59
+ {
60
+ "bg-primary text-primary-foreground": mine,
61
+ "bg-muted": !mine
62
+ }
63
+ ), children: /* @__PURE__ */ jsx(
64
+ ReactMarkdown,
65
+ {
66
+ remarkPlugins: [remarkGfm],
67
+ rehypePlugins: [rehypeSanitize, rehypeHighlight],
68
+ components: {
69
+ p: ({ node, ...props }) => /* @__PURE__ */ jsx("p", { ...props, className: "mb-2 last:mb-0" }),
70
+ code: ({ className, children, ...props }) => /* @__PURE__ */ jsx("pre", { className: "my-2 overflow-x-auto rounded-lg", children: /* @__PURE__ */ jsx("code", { ...props, className, children }) })
71
+ },
72
+ children: text
73
+ }
74
+ ) });
75
+ }
76
+ export {
77
+ ChatThread,
78
+ timeAgo
79
+ };
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import { RoomClient } from '@meshagent/meshagent';
3
+ export interface ChatTypingIndicatorProps {
4
+ room: RoomClient | null;
5
+ path: string;
6
+ }
7
+ export declare function ChatTypingIndicator({ room, path }: ChatTypingIndicatorProps): React.ReactElement | null;
@@ -0,0 +1,29 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Circle } from "lucide-react";
3
+ import { useRoomIndicators } from "@meshagent/meshagent-react";
4
+ function ChatTypingIndicator({ room, path }) {
5
+ const { typing } = useRoomIndicators({ room, path });
6
+ return typing ? /* @__PURE__ */ jsxs("div", { className: "flex items-end space-x-1 h-6 p-6", children: [
7
+ [0, 1, 2].map((index) => /* @__PURE__ */ jsx(
8
+ Circle,
9
+ {
10
+ className: "w-2 h-2 text-gray-500",
11
+ style: {
12
+ animation: "typingBounce 0.6s ease-in-out infinite",
13
+ animationDelay: `${index * 0.2}s`
14
+ }
15
+ },
16
+ index
17
+ )),
18
+ /* @__PURE__ */ jsx("style", { children: `
19
+ @keyframes typingBounce {
20
+ 0%, 100% { transform: translateY(0); }
21
+ 50% { transform: translateY(-4px); }
22
+ }
23
+ ` })
24
+ ] }) : null;
25
+ }
26
+ ;
27
+ export {
28
+ ChatTypingIndicator
29
+ };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface FileUploaderProps {
3
+ onFilesSelected?: (files: File[]) => void;
4
+ accept?: string;
5
+ }
6
+ export declare function FileUploader({ onFilesSelected, accept }: FileUploaderProps): React.ReactElement;
@@ -0,0 +1,44 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRef } from "react";
3
+ import { Plus } from "lucide-react";
4
+ import { Button } from "./components/ui/button";
5
+ function FileUploader({
6
+ onFilesSelected,
7
+ accept = ""
8
+ }) {
9
+ const inputRef = useRef(null);
10
+ const handleButtonClick = () => inputRef.current?.click();
11
+ const handleFileChange = (e) => {
12
+ if (!e.target.files) {
13
+ return;
14
+ }
15
+ const fileArray = Array.from(e.target.files);
16
+ onFilesSelected?.(fileArray);
17
+ };
18
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
19
+ /* @__PURE__ */ jsx(
20
+ "input",
21
+ {
22
+ ref: inputRef,
23
+ type: "file",
24
+ multiple: true,
25
+ accept,
26
+ className: "hidden",
27
+ onChange: handleFileChange
28
+ }
29
+ ),
30
+ /* @__PURE__ */ jsx(
31
+ Button,
32
+ {
33
+ variant: "ghost",
34
+ size: "icon",
35
+ "aria-label": "Attach file",
36
+ onClick: handleButtonClick,
37
+ children: /* @__PURE__ */ jsx(Plus, { className: "w-10 h-10" })
38
+ }
39
+ )
40
+ ] });
41
+ }
42
+ export {
43
+ FileUploader
44
+ };
@@ -0,0 +1,6 @@
1
+ import * as React from "react";
2
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
+ declare function Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare function AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>): import("react/jsx-runtime").JSX.Element;
5
+ declare function AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>): import("react/jsx-runtime").JSX.Element;
6
+ export { Avatar, AvatarImage, AvatarFallback };
@@ -0,0 +1,53 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
+ import { cn } from "../../lib/utils";
4
+ function Avatar({
5
+ className,
6
+ ...props
7
+ }) {
8
+ return /* @__PURE__ */ jsx(
9
+ AvatarPrimitive.Root,
10
+ {
11
+ "data-slot": "avatar",
12
+ className: cn(
13
+ "relative flex size-8 shrink-0 overflow-hidden rounded-full",
14
+ className
15
+ ),
16
+ ...props
17
+ }
18
+ );
19
+ }
20
+ function AvatarImage({
21
+ className,
22
+ ...props
23
+ }) {
24
+ return /* @__PURE__ */ jsx(
25
+ AvatarPrimitive.Image,
26
+ {
27
+ "data-slot": "avatar-image",
28
+ className: cn("aspect-square size-full", className),
29
+ ...props
30
+ }
31
+ );
32
+ }
33
+ function AvatarFallback({
34
+ className,
35
+ ...props
36
+ }) {
37
+ return /* @__PURE__ */ jsx(
38
+ AvatarPrimitive.Fallback,
39
+ {
40
+ "data-slot": "avatar-fallback",
41
+ className: cn(
42
+ "bg-muted flex size-full items-center justify-center rounded-full",
43
+ className
44
+ ),
45
+ ...props
46
+ }
47
+ );
48
+ }
49
+ export {
50
+ Avatar,
51
+ AvatarFallback,
52
+ AvatarImage
53
+ };
@@ -0,0 +1,10 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const buttonVariants: (props?: ({
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
8
+ asChild?: boolean;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export { Button, buttonVariants };
@@ -0,0 +1,50 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Slot } from "@radix-ui/react-slot";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "../../lib/utils";
5
+ const buttonVariants = cva(
6
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
11
+ destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
12
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
13
+ secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
14
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
15
+ link: "text-primary underline-offset-4 hover:underline"
16
+ },
17
+ size: {
18
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
19
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
20
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
21
+ icon: "size-9"
22
+ }
23
+ },
24
+ defaultVariants: {
25
+ variant: "default",
26
+ size: "default"
27
+ }
28
+ }
29
+ );
30
+ function Button({
31
+ className,
32
+ variant,
33
+ size,
34
+ asChild = false,
35
+ ...props
36
+ }) {
37
+ const Comp = asChild ? Slot : "button";
38
+ return /* @__PURE__ */ jsx(
39
+ Comp,
40
+ {
41
+ "data-slot": "button",
42
+ className: cn(buttonVariants({ variant, size, className })),
43
+ ...props
44
+ }
45
+ );
46
+ }
47
+ export {
48
+ Button,
49
+ buttonVariants
50
+ };
@@ -0,0 +1,9 @@
1
+ import * as React from "react";
2
+ declare function Card({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
3
+ declare function CardHeader({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
4
+ declare function CardTitle({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
5
+ declare function CardDescription({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
6
+ declare function CardAction({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
7
+ declare function CardContent({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
8
+ declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
9
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
@@ -0,0 +1,90 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils";
3
+ function Card({ className, ...props }) {
4
+ return /* @__PURE__ */ jsx(
5
+ "div",
6
+ {
7
+ "data-slot": "card",
8
+ className: cn(
9
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
10
+ className
11
+ ),
12
+ ...props
13
+ }
14
+ );
15
+ }
16
+ function CardHeader({ className, ...props }) {
17
+ return /* @__PURE__ */ jsx(
18
+ "div",
19
+ {
20
+ "data-slot": "card-header",
21
+ className: cn(
22
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
23
+ className
24
+ ),
25
+ ...props
26
+ }
27
+ );
28
+ }
29
+ function CardTitle({ className, ...props }) {
30
+ return /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ "data-slot": "card-title",
34
+ className: cn("leading-none font-semibold", className),
35
+ ...props
36
+ }
37
+ );
38
+ }
39
+ function CardDescription({ className, ...props }) {
40
+ return /* @__PURE__ */ jsx(
41
+ "div",
42
+ {
43
+ "data-slot": "card-description",
44
+ className: cn("text-muted-foreground text-sm", className),
45
+ ...props
46
+ }
47
+ );
48
+ }
49
+ function CardAction({ className, ...props }) {
50
+ return /* @__PURE__ */ jsx(
51
+ "div",
52
+ {
53
+ "data-slot": "card-action",
54
+ className: cn(
55
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
56
+ className
57
+ ),
58
+ ...props
59
+ }
60
+ );
61
+ }
62
+ function CardContent({ className, ...props }) {
63
+ return /* @__PURE__ */ jsx(
64
+ "div",
65
+ {
66
+ "data-slot": "card-content",
67
+ className: cn("px-6", className),
68
+ ...props
69
+ }
70
+ );
71
+ }
72
+ function CardFooter({ className, ...props }) {
73
+ return /* @__PURE__ */ jsx(
74
+ "div",
75
+ {
76
+ "data-slot": "card-footer",
77
+ className: cn("flex items-center px-6 [.border-t]:pt-6", className),
78
+ ...props
79
+ }
80
+ );
81
+ }
82
+ export {
83
+ Card,
84
+ CardAction,
85
+ CardContent,
86
+ CardDescription,
87
+ CardFooter,
88
+ CardHeader,
89
+ CardTitle
90
+ };
@@ -0,0 +1,2 @@
1
+ declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
2
+ export { Skeleton };
@@ -0,0 +1,15 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils";
3
+ function Skeleton({ className, ...props }) {
4
+ return /* @__PURE__ */ jsx(
5
+ "div",
6
+ {
7
+ "data-slot": "skeleton",
8
+ className: cn("bg-accent animate-pulse rounded-md", className),
9
+ ...props
10
+ }
11
+ );
12
+ }
13
+ export {
14
+ Skeleton
15
+ };
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ export interface SpinnerProps extends React.SVGProps<SVGSVGElement> {
3
+ /**
4
+ * Spinner sizes: 'sm' (small), 'md' (medium), 'lg' (large)
5
+ * @default 'md'
6
+ */
7
+ size?: "sm" | "md" | "lg";
8
+ }
9
+ /**
10
+ * A simple rotating spinner component using Lucide's Loader2 icon and Tailwind CSS
11
+ */
12
+ export declare function Spinner({ size, className, ...props }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
13
+ export interface LoadingOverlayProps {
14
+ /**
15
+ * When true, shows the overlay spinner; otherwise renders children normally
16
+ */
17
+ isLoading: boolean;
18
+ className?: string;
19
+ children: React.ReactNode;
20
+ }
21
+ /**
22
+ * Wraps content and displays a centered spinner overlay when loading
23
+ */
24
+ export declare function LoadingOverlay({ isLoading, className, children }: LoadingOverlayProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,28 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Loader2 } from "lucide-react";
3
+ import { cn } from "../../lib/utils";
4
+ const sizeClasses = {
5
+ sm: "h-4 w-4",
6
+ md: "h-6 w-6",
7
+ lg: "h-8 w-8"
8
+ };
9
+ function Spinner({ size = "md", className, ...props }) {
10
+ return /* @__PURE__ */ jsx(
11
+ Loader2,
12
+ {
13
+ className: cn("animate-spin text-current", sizeClasses[size], className),
14
+ "aria-label": "Loading...",
15
+ ...props
16
+ }
17
+ );
18
+ }
19
+ function LoadingOverlay({ isLoading, className, children }) {
20
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col min-h-0 relative flex-1", children: [
21
+ children,
22
+ isLoading && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(Spinner, { size: "lg", className }) })
23
+ ] });
24
+ }
25
+ export {
26
+ LoadingOverlay,
27
+ Spinner
28
+ };
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): import("react/jsx-runtime").JSX.Element;
3
+ export { Textarea };
@@ -0,0 +1,18 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils";
3
+ function Textarea({ className, ...props }) {
4
+ return /* @__PURE__ */ jsx(
5
+ "textarea",
6
+ {
7
+ "data-slot": "textarea",
8
+ className: cn(
9
+ "border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
10
+ className
11
+ ),
12
+ ...props
13
+ }
14
+ );
15
+ }
16
+ export {
17
+ Textarea
18
+ };
@@ -0,0 +1,5 @@
1
+ export * from './Chat';
2
+ export * from './ChatInput';
3
+ export * from './ChatThread';
4
+ export * from './ChatTypingIndicator';
5
+ export * from './FileUploader';
@@ -0,0 +1,5 @@
1
+ export * from "./Chat";
2
+ export * from "./ChatInput";
3
+ export * from "./ChatThread";
4
+ export * from "./ChatTypingIndicator";
5
+ export * from "./FileUploader";
@@ -0,0 +1,2 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
@@ -0,0 +1,8 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ export {
7
+ cn
8
+ };
package/dist/index.css ADDED
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-ease:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-600:oklch(57.7% .245 27.325);--color-gray-500:oklch(55.1% .027 264.364);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-2xl:1rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.relative{position:relative}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.my-2{margin-block:calc(var(--spacing)*2)}.mt-1{margin-top:calc(var(--spacing)*1)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-full{width:100%;height:100%}.h-2{height:calc(var(--spacing)*2)}.h-4{height:calc(var(--spacing)*4)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-20{height:calc(var(--spacing)*20)}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-16{min-height:calc(var(--spacing)*16)}.w-2{width:calc(var(--spacing)*2)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-full{width:100%}.max-w-prose{max-width:65ch}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-0{flex:0}.flex-1{flex:1}.flex-shrink-1{flex-shrink:1}.shrink-0{flex-shrink:0}.basis-0{flex-basis:calc(var(--spacing)*0)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.resize-none{resize:none}.auto-rows-min{grid-auto-rows:min-content}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--input)}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-0{padding:calc(var(--spacing)*0)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-6{padding-block:calc(var(--spacing)*6)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-gray-500{color:var(--color-gray-500)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.shadow,.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}@media (min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}#root{max-width:1280px;min-height:100vh;margin:0 auto;padding:0 2rem}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@meshagent/meshagent-tailwind",
3
+ "version": "0.4.0",
4
+ "description": "Meshagent Tailwind Components",
5
+ "scripts": {
6
+ "build:js": "node build.js",
7
+ "build:css": "tailwindcss -c tailwind.config.js -i styles.css -o dist/index.css --minify",
8
+ "build:types": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json",
9
+ "build": "npm run build:js && npm run build:types && npm run build:css"
10
+ },
11
+ "author": "Meshagent Software",
12
+ "license": "Apache-2.0",
13
+ "module": "dist/esm/index.js",
14
+ "main": "./dist/esm/index.js",
15
+ "types": "dist/esm/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "module": "./dist/esm/index.js",
19
+ "default": "./dist/cjs/index.js"
20
+ },
21
+ "./dist/index.css": "./dist/index.css",
22
+ "./package.json": "./package.json"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "!dist/**/test",
27
+ "LICENSE",
28
+ "README.md",
29
+ "CHANGELOG.md"
30
+ ],
31
+ "dependencies": {
32
+ "@meshagent/meshagent": "^0.4.0",
33
+ "@meshagent/meshagent-react": "^0.4.0",
34
+ "@radix-ui/react-avatar": "^1.1.10",
35
+ "@radix-ui/react-slot": "^1.2.3",
36
+ "class-variance-authority": "^0.7.1",
37
+ "clsx": "^2.1.1",
38
+ "lucide-react": "^0.525.0",
39
+ "react": "^19.1.0",
40
+ "react-dom": "^19.1.0",
41
+ "react-markdown": "^10.1.0",
42
+ "rehype-highlight": "^7.0.2",
43
+ "rehype-sanitize": "^6.0.0",
44
+ "remark-gfm": "^4.0.1",
45
+ "tailwind-merge": "^3.3.1",
46
+ "uuid": "^11.1.0"
47
+ },
48
+ "devDependencies": {
49
+ "@eslint/js": "^9.29.0",
50
+ "@tailwindcss/aspect-ratio": "^0.4.2",
51
+ "@tailwindcss/cli": "^4.1.11",
52
+ "@tailwindcss/forms": "^0.5.10",
53
+ "@tailwindcss/postcss": "^4.1.11",
54
+ "@tailwindcss/typography": "^0.5.16",
55
+ "@tailwindcss/vite": "^4.1.11",
56
+ "@types/node": "^24.0.13",
57
+ "@types/react": "^19.1.8",
58
+ "@types/react-dom": "^19.1.6",
59
+ "@vitejs/plugin-react": "^4.5.2",
60
+ "autoprefixer": "^10.4.21",
61
+ "esbuild": "^0.25.6",
62
+ "eslint": "^9.29.0",
63
+ "eslint-plugin-react-hooks": "^5.2.0",
64
+ "eslint-plugin-react-refresh": "^0.4.20",
65
+ "globals": "^16.2.0",
66
+ "tailwindcss": "^4.1.11",
67
+ "tw-animate-css": "^1.3.5",
68
+ "typescript": "~5.8.3",
69
+ "typescript-eslint": "^8.34.1",
70
+ "vite": "^7.0.0"
71
+ }
72
+ }