harebear-ui 0.2.3 → 0.3.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 (40) hide show
  1. package/dist/components/admin/app-shell.d.ts +4 -1
  2. package/dist/components/admin/app-shell.js +49 -46
  3. package/dist/components/admin/confirm-dialog.d.ts +17 -0
  4. package/dist/components/admin/confirm-dialog.js +20 -0
  5. package/dist/components/admin/copy-field.d.ts +17 -0
  6. package/dist/components/admin/copy-field.js +37 -0
  7. package/dist/components/admin/search-input.js +1 -1
  8. package/dist/components/admin/status.d.ts +12 -6
  9. package/dist/components/admin/status.js +8 -5
  10. package/dist/components/admin/user-chip.d.ts +1 -1
  11. package/dist/components/admin/user-chip.js +7 -4
  12. package/dist/components/ai/approval.d.ts +30 -0
  13. package/dist/components/ai/approval.js +81 -0
  14. package/dist/components/ai/chat-shell.d.ts +53 -0
  15. package/dist/components/ai/chat-shell.js +201 -0
  16. package/dist/components/ai/chat.d.ts +11 -3
  17. package/dist/components/ai/chat.js +21 -15
  18. package/dist/components/ai/code-block.js +1 -1
  19. package/dist/components/ai/conversation-list.d.ts +36 -3
  20. package/dist/components/ai/conversation-list.js +122 -13
  21. package/dist/components/ai/prompt-input.d.ts +28 -4
  22. package/dist/components/ai/prompt-input.js +52 -4
  23. package/dist/components/ai/tool-steps.d.ts +41 -0
  24. package/dist/components/ai/tool-steps.js +124 -0
  25. package/dist/components/ui/alert.d.ts +1 -1
  26. package/dist/components/ui/alert.js +5 -2
  27. package/dist/components/ui/badge.d.ts +2 -1
  28. package/dist/components/ui/badge.js +27 -14
  29. package/dist/components/ui/item.js +2 -2
  30. package/dist/components/ui/sidebar.d.ts +3 -1
  31. package/dist/components/ui/sidebar.js +7 -3
  32. package/dist/hooks/use-media-query.d.ts +2 -0
  33. package/dist/hooks/use-media-query.js +12 -0
  34. package/dist/index.d.ts +12 -6
  35. package/dist/index.js +10 -4
  36. package/dist/styles.css +24 -0
  37. package/docs/COMPONENTS.md +141 -72
  38. package/llms.txt +3 -3
  39. package/package.json +1 -1
  40. package/skills/harebear-ui/SKILL.md +4 -1
@@ -0,0 +1,41 @@
1
+ import * as React from "react";
2
+ /** Lifecycle of an agent tool call. "waiting" means waiting for the user (an approval). */
3
+ export type ToolStatus = "queued" | "waiting" | "running" | "done" | "error" | "stopped";
4
+ /** Spinner while running, otherwise a status dot in the matching tone. */
5
+ declare function ToolStatusIcon({ status, className }: {
6
+ status: ToolStatus;
7
+ className?: string;
8
+ }): React.JSX.Element;
9
+ export interface ToolGroupProps extends Omit<React.ComponentProps<"div">, "title"> {
10
+ /** Summary, e.g. "Ran 3 commands on services". */
11
+ title: React.ReactNode;
12
+ /** Overall status of the steps inside. */
13
+ status: ToolStatus;
14
+ /** Small trailing text, e.g. the start time. */
15
+ meta?: React.ReactNode;
16
+ /** Open while true, until the user toggles it. Default: open while the group is queued, running or waiting. */
17
+ autoOpen?: boolean;
18
+ /** Controlled open state. */
19
+ open?: boolean;
20
+ onOpenChange?: (open: boolean) => void;
21
+ }
22
+ /** Bordered, collapsible card that groups an agent's consecutive tool calls. Put ToolStep children inside. */
23
+ declare function ToolGroup({ title, status, meta, autoOpen, open: openProp, onOpenChange, className, children, ...props }: ToolGroupProps): React.JSX.Element;
24
+ export interface ToolStepProps extends Omit<React.ComponentProps<"div">, "title"> {
25
+ /** Tool icon, e.g. <TerminalIcon />. */
26
+ icon?: React.ReactNode;
27
+ /** Short verb column, e.g. "Run", "Read", "Edit". */
28
+ kind: React.ReactNode;
29
+ /** What it acted on, shown monospace: the command or path. */
30
+ detail: string;
31
+ status: ToolStatus;
32
+ /** Trailing text. Default derived from status ("running", "failed"…). */
33
+ meta?: React.ReactNode;
34
+ /** Shown when expanded, monospace: usually the command followed by its output. Omit for a row that cannot expand. */
35
+ output?: React.ReactNode;
36
+ /** Open while true, until the user toggles it. Default: open while running. */
37
+ autoOpen?: boolean;
38
+ }
39
+ /** One tool call inside a ToolGroup: icon, verb, monospace detail, status text, expandable output. */
40
+ declare function ToolStep({ icon, kind, detail, status, meta, output, autoOpen, className, ...props }: ToolStepProps): React.JSX.Element;
41
+ export { ToolGroup, ToolStatusIcon, ToolStep };
@@ -0,0 +1,124 @@
1
+ "use client";
2
+ import { StatusDot } from "../admin/status.js";
3
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../ui/collapsible.js";
4
+ import { Spinner } from "../ui/spinner.js";
5
+ import { cn } from "../../lib/utils.js";
6
+ import * as React from "react";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { ChevronRightIcon } from "lucide-react";
9
+ // src/components/ai/tool-steps.tsx
10
+ const toolTone = {
11
+ queued: "neutral",
12
+ waiting: "warning",
13
+ running: "info",
14
+ done: "success",
15
+ error: "danger",
16
+ stopped: "neutral"
17
+ };
18
+ /** Spinner while running, otherwise a status dot in the matching tone. */
19
+ function ToolStatusIcon({ status, className }) {
20
+ return status === "running" ? /* @__PURE__ */ jsx(Spinner, {
21
+ "data-slot": "tool-status-icon",
22
+ className: cn("size-3.5 text-primary", className)
23
+ }) : /* @__PURE__ */ jsx(StatusDot, {
24
+ "data-slot": "tool-status-icon",
25
+ tone: toolTone[status],
26
+ className
27
+ });
28
+ }
29
+ /** Open state that follows `auto` until the user toggles it, then sticks with the user's choice. */
30
+ function useAutoOpen(auto, open, onOpenChange) {
31
+ const [chosen, setChosen] = React.useState(null);
32
+ const value = open ?? chosen ?? auto;
33
+ const set = (next) => {
34
+ setChosen(next);
35
+ onOpenChange?.(next);
36
+ };
37
+ return [value, set];
38
+ }
39
+ const isActive = (s) => s === "running" || s === "waiting" || s === "queued";
40
+ /** Bordered, collapsible card that groups an agent's consecutive tool calls. Put ToolStep children inside. */
41
+ function ToolGroup({ title, status, meta, autoOpen, open: openProp, onOpenChange, className, children, ...props }) {
42
+ const [open, setOpen] = useAutoOpen(autoOpen ?? isActive(status), openProp, onOpenChange);
43
+ return /* @__PURE__ */ jsxs(Collapsible, {
44
+ "data-slot": "tool-group",
45
+ "data-status": status,
46
+ open,
47
+ onOpenChange: setOpen,
48
+ className: cn("min-w-0 rounded-lg border border-border bg-card", className),
49
+ ...props,
50
+ children: [/* @__PURE__ */ jsxs(CollapsibleTrigger, {
51
+ className: "flex w-full min-w-0 items-center gap-2.5 rounded-lg px-4 py-2.75 text-left outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring/40",
52
+ children: [
53
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("size-4 shrink-0 text-muted-foreground transition-transform", open && "rotate-90") }),
54
+ /* @__PURE__ */ jsx("span", {
55
+ className: "min-w-0 flex-1 truncate font-medium",
56
+ children: title
57
+ }),
58
+ meta !== void 0 && /* @__PURE__ */ jsx("span", {
59
+ className: "shrink-0 text-xs text-muted-foreground tabular-nums",
60
+ children: meta
61
+ }),
62
+ /* @__PURE__ */ jsx(ToolStatusIcon, { status })
63
+ ]
64
+ }), /* @__PURE__ */ jsx(CollapsibleContent, {
65
+ className: "flex flex-col gap-0.5 px-2 pb-2",
66
+ children
67
+ })]
68
+ });
69
+ }
70
+ const statusText = {
71
+ queued: "queued",
72
+ waiting: "waiting for you",
73
+ running: "running",
74
+ done: "done",
75
+ error: "failed",
76
+ stopped: "stopped"
77
+ };
78
+ /** One tool call inside a ToolGroup: icon, verb, monospace detail, status text, expandable output. */
79
+ function ToolStep({ icon, kind, detail, status, meta, output, autoOpen, className, ...props }) {
80
+ const [open, setOpen] = useAutoOpen(autoOpen ?? status === "running");
81
+ const expandable = output !== void 0 && output !== null && output !== "";
82
+ const row = /* @__PURE__ */ jsxs(Fragment, { children: [
83
+ icon && /* @__PURE__ */ jsx("span", {
84
+ className: "grid size-6.5 shrink-0 place-items-center rounded-lg bg-muted text-muted-foreground [&_svg]:size-3.5",
85
+ children: icon
86
+ }),
87
+ /* @__PURE__ */ jsx("span", {
88
+ className: "w-18 shrink-0 truncate text-[13px] text-muted-foreground",
89
+ children: kind
90
+ }),
91
+ /* @__PURE__ */ jsx("span", {
92
+ className: "min-w-0 flex-1 truncate font-mono text-[12.5px]",
93
+ children: detail
94
+ }),
95
+ /* @__PURE__ */ jsx("span", {
96
+ className: cn("shrink-0 text-xs whitespace-nowrap text-muted-foreground tabular-nums", status === "error" && "text-destructive", status === "waiting" && "text-warning"),
97
+ children: meta ?? statusText[status]
98
+ })
99
+ ] });
100
+ const rowClass = "flex w-full min-w-0 items-center gap-2.5 rounded-md px-2.5 py-1.75 text-left";
101
+ if (!expandable) return /* @__PURE__ */ jsxs("div", {
102
+ "data-slot": "tool-step",
103
+ "data-status": status,
104
+ className: cn(rowClass, className),
105
+ ...props,
106
+ children: [row, /* @__PURE__ */ jsx("span", { className: "size-4 shrink-0" })]
107
+ });
108
+ return /* @__PURE__ */ jsxs(Collapsible, {
109
+ "data-slot": "tool-step",
110
+ "data-status": status,
111
+ open,
112
+ onOpenChange: setOpen,
113
+ className,
114
+ ...props,
115
+ children: [/* @__PURE__ */ jsxs(CollapsibleTrigger, {
116
+ className: cn(rowClass, "outline-none hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring/40"),
117
+ children: [row, /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("size-4 shrink-0 text-muted-foreground transition-transform", open && "rotate-90") })]
118
+ }), /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("pre", {
119
+ className: cn("mt-0.5 mr-2.5 mb-2 max-h-80 overflow-auto rounded-md bg-muted px-3.5 py-3 font-mono text-[12.5px] leading-[1.7] whitespace-pre-wrap break-all", icon ? "ml-11.5" : "ml-2.5"),
120
+ children: output
121
+ }) })]
122
+ });
123
+ }
124
+ export { ToolGroup, ToolStatusIcon, ToolStep };
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { VariantProps } from "class-variance-authority";
3
3
  declare const alertVariants: (props?: ({
4
- variant?: "default" | "destructive" | null | undefined;
4
+ variant?: "default" | "destructive" | "info" | "success" | "warning" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  declare function Alert({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>): React.JSX.Element;
7
7
  declare function AlertTitle({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
@@ -6,7 +6,10 @@ import { cva } from "class-variance-authority";
6
6
  const alertVariants = cva("group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", {
7
7
  variants: { variant: {
8
8
  default: "bg-card text-card-foreground",
9
- destructive: "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
9
+ destructive: "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
10
+ warning: "border-transparent bg-warning/12 *:data-[slot=alert-description]:text-foreground *:[svg]:text-warning",
11
+ success: "border-transparent bg-success/12 *:data-[slot=alert-description]:text-foreground *:[svg]:text-success",
12
+ info: "border-transparent bg-primary-soft *:data-[slot=alert-description]:text-foreground *:[svg]:text-primary"
10
13
  } },
11
14
  defaultVariants: { variant: "default" }
12
15
  });
@@ -28,7 +31,7 @@ function AlertTitle({ className, ...props }) {
28
31
  function AlertDescription({ className, ...props }) {
29
32
  return /* @__PURE__ */ jsx("div", {
30
33
  "data-slot": "alert-description",
31
- className: cn("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className),
34
+ className: cn("min-w-0 text-sm text-balance wrap-anywhere text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className),
32
35
  ...props
33
36
  });
34
37
  }
@@ -2,8 +2,9 @@ import * as React from "react";
2
2
  import { VariantProps } from "class-variance-authority";
3
3
  declare const badgeVariants: (props?: ({
4
4
  variant?: "default" | "destructive" | "ghost" | "link" | "outline" | "secondary" | "soft" | "success" | "warning" | null | undefined;
5
+ size?: "default" | "lg" | null | undefined;
5
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
- declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
7
+ declare function Badge({ className, variant, size, asChild, ...props }: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
7
8
  asChild?: boolean;
8
9
  }): React.JSX.Element;
9
10
  export { Badge, badgeVariants };
@@ -5,25 +5,38 @@ import { cva } from "class-variance-authority";
5
5
  import { Slot } from "radix-ui";
6
6
  // src/components/ui/badge.tsx
7
7
  const badgeVariants = cva("group/badge inline-flex h-6 w-fit shrink-0 items-center justify-center gap-1.5 overflow-hidden rounded-full border border-transparent px-2.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3.5!", {
8
- variants: { variant: {
9
- default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
10
- secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
11
- soft: "bg-primary-soft text-primary",
12
- success: "bg-success/12 text-success",
13
- warning: "bg-warning/12 text-warning",
14
- destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
15
- outline: "border-border bg-card text-foreground [a]:hover:bg-muted",
16
- ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
17
- link: "text-primary underline-offset-4 hover:underline"
18
- } },
19
- defaultVariants: { variant: "default" }
8
+ variants: {
9
+ variant: {
10
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
11
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
12
+ soft: "bg-primary-soft text-primary",
13
+ success: "bg-success/12 text-success",
14
+ warning: "bg-warning/12 text-warning",
15
+ destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
16
+ outline: "border-border bg-card text-foreground [a]:hover:bg-muted",
17
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
18
+ link: "text-primary underline-offset-4 hover:underline"
19
+ },
20
+ size: {
21
+ default: "",
22
+ /** Matches the height of sm buttons and pills (32px), for headers and toolbars. */
23
+ lg: "h-8 px-3"
24
+ }
25
+ },
26
+ defaultVariants: {
27
+ variant: "default",
28
+ size: "default"
29
+ }
20
30
  });
21
- function Badge({ className, variant = "default", asChild = false, ...props }) {
31
+ function Badge({ className, variant = "default", size = "default", asChild = false, ...props }) {
22
32
  const Comp = asChild ? Slot.Root : "span";
23
33
  return /* @__PURE__ */ jsx(Comp, {
24
34
  "data-slot": "badge",
25
35
  "data-variant": variant,
26
- className: cn(badgeVariants({ variant }), className),
36
+ className: cn(badgeVariants({
37
+ variant,
38
+ size
39
+ }), className),
27
40
  ...props
28
41
  });
29
42
  }
@@ -75,14 +75,14 @@ function ItemMedia({ className, variant = "default", ...props }) {
75
75
  function ItemContent({ className, ...props }) {
76
76
  return /* @__PURE__ */ jsx("div", {
77
77
  "data-slot": "item-content",
78
- className: cn("flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none", className),
78
+ className: cn("flex min-w-0 flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none", className),
79
79
  ...props
80
80
  });
81
81
  }
82
82
  function ItemTitle({ className, ...props }) {
83
83
  return /* @__PURE__ */ jsx("div", {
84
84
  "data-slot": "item-title",
85
- className: cn("line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4", className),
85
+ className: cn("line-clamp-1 w-fit max-w-full text-sm leading-snug font-medium wrap-anywhere underline-offset-4", className),
86
86
  ...props
87
87
  });
88
88
  }
@@ -14,6 +14,8 @@ type SidebarContextProps = {
14
14
  toggleSidebar: () => void;
15
15
  };
16
16
  declare function useSidebar(): SidebarContextProps;
17
+ /** Like useSidebar, but returns null outside a SidebarProvider. For components that also work without a sidebar. */
18
+ declare function useSidebarOptional(): SidebarContextProps | null;
17
19
  declare function SidebarProvider({ defaultOpen, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<"div"> & {
18
20
  defaultOpen?: boolean;
19
21
  open?: boolean;
@@ -66,4 +68,4 @@ declare function SidebarMenuSubButton({ asChild, size, isActive, className, ...p
66
68
  size?: "sm" | "md";
67
69
  isActive?: boolean;
68
70
  }): React.JSX.Element;
69
- export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar };
71
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, useSidebarOptional };
@@ -25,6 +25,10 @@ function useSidebar() {
25
25
  if (!context) throw new Error("useSidebar must be used within a SidebarProvider.");
26
26
  return context;
27
27
  }
28
+ /** Like useSidebar, but returns null outside a SidebarProvider. For components that also work without a sidebar. */
29
+ function useSidebarOptional() {
30
+ return React.useContext(SidebarContext);
31
+ }
28
32
  function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
29
33
  const isMobile = useIsMobile();
30
34
  const [openMobile, setOpenMobile] = React.useState(false);
@@ -128,12 +132,12 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
128
132
  }), /* @__PURE__ */ jsx("div", {
129
133
  "data-slot": "sidebar-container",
130
134
  "data-side": side,
131
- className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex", variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", className),
135
+ className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex", variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)", className),
132
136
  ...props,
133
137
  children: /* @__PURE__ */ jsx("div", {
134
138
  "data-sidebar": "sidebar",
135
139
  "data-slot": "sidebar-inner",
136
- className: "flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border",
140
+ className: cn("flex size-full flex-col overflow-hidden bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border", variant === "floating" || variant === "inset" ? "group-data-[state=expanded]:*:min-w-[calc(var(--sidebar-width)-(--spacing(4)))]" : "group-data-[state=expanded]:*:min-w-(--sidebar-width)"),
137
141
  children
138
142
  })
139
143
  })]
@@ -374,4 +378,4 @@ function SidebarMenuSubButton({ asChild = false, size = "md", isActive = false,
374
378
  ...props
375
379
  });
376
380
  }
377
- export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar };
381
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, useSidebarOptional };
@@ -0,0 +1,2 @@
1
+ /** True while the media query matches, e.g. useMediaQuery("(min-width: 1280px)"). False during SSR. */
2
+ export declare function useMediaQuery(query: string): boolean;
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ // src/hooks/use-media-query.ts
3
+ /** True while the media query matches, e.g. useMediaQuery("(min-width: 1280px)"). False during SSR. */
4
+ function useMediaQuery(query) {
5
+ const subscribe = React.useCallback((onChange) => {
6
+ const mql = window.matchMedia(query);
7
+ mql.addEventListener("change", onChange);
8
+ return () => mql.removeEventListener("change", onChange);
9
+ }, [query]);
10
+ return React.useSyncExternalStore(subscribe, () => window.matchMedia(query).matches, () => false);
11
+ }
12
+ export { useMediaQuery };
package/dist/index.d.ts CHANGED
@@ -50,7 +50,7 @@ import { ScrollArea, ScrollBar } from "./components/ui/scroll-area.js";
50
50
  import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from "./components/ui/select.js";
51
51
  import { Separator } from "./components/ui/separator.js";
52
52
  import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from "./components/ui/sheet.js";
53
- import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar } from "./components/ui/sidebar.js";
53
+ import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, useSidebarOptional } from "./components/ui/sidebar.js";
54
54
  import { Skeleton } from "./components/ui/skeleton.js";
55
55
  import { Slider } from "./components/ui/slider.js";
56
56
  import { Toaster } from "./components/ui/sonner.js";
@@ -66,12 +66,14 @@ import { Trace, TraceCollapsible, TraceCollapsibleContent, TraceCollapsibleTrigg
66
66
  import { ActivityFeed, ActivityItem } from "./components/admin/activity-feed.js";
67
67
  import { AppBrand, AppBrandProps, AppNavItem, AppNavSection, AppShell, AppShellProps } from "./components/admin/app-shell.js";
68
68
  import { Callout } from "./components/admin/callout.js";
69
+ import { ConfirmDialog, ConfirmDialogProps } from "./components/admin/confirm-dialog.js";
70
+ import { CopyField, CopyFieldProps } from "./components/admin/copy-field.js";
69
71
  import { KeyValueGrid, KeyValueItem } from "./components/admin/key-value-grid.js";
70
72
  import { LinkTile, LinkTileProps } from "./components/admin/link-tile.js";
71
73
  import { PageHeader, PageHeaderProps } from "./components/admin/page-header.js";
72
74
  import { SearchInput, SearchInputProps } from "./components/admin/search-input.js";
73
75
  import { StatCard, StatCardProps } from "./components/admin/stat-card.js";
74
- import { StatusBadge, StatusDot, StatusTone } from "./components/admin/status.js";
76
+ import { StatusBadge, StatusBadgeProps, StatusDot, StatusDotProps, StatusTone } from "./components/admin/status.js";
75
77
  import { Timeline, TimelineItem } from "./components/admin/timeline.js";
76
78
  import { UsageMeter, UsageMeterProps } from "./components/admin/usage-meter.js";
77
79
  import { UserChip, UserChipProps, initials } from "./components/admin/user-chip.js";
@@ -80,15 +82,19 @@ import { DataTable, DataTableColumnDef, DataTableFeatures, DataTableProps, creat
80
82
  import { Sparkline, SparklineProps, smoothPath } from "./components/data/sparkline.js";
81
83
  import { StatusBarDatum, StatusBars, StatusBarsProps } from "./components/data/status-bars.js";
82
84
  import { TrendChart, TrendChartProps, TrendLegend, TrendSeries } from "./components/data/trend-chart.js";
83
- import { AssistantAvatar, ChatMessage, ChatMessageProps, ChatThread, ChatThreadProps, MessageActions, MessageActionsProps, ToolCall, ToolCallProps, TypingIndicator } from "./components/ai/chat.js";
85
+ import { ApprovalCard, ApprovalCardProps, ApprovalResult, ApprovalResultProps } from "./components/ai/approval.js";
86
+ import { ChatPanel, ChatPanelProps, ChatShell, ChatShellProps } from "./components/ai/chat-shell.js";
87
+ import { AssistantAvatar, ChatMessage, ChatMessageProps, ChatThread, ChatThreadProps, MessageActions, MessageActionsProps, ToolCall, ToolCallProps, TypingIndicator, TypingIndicatorProps } from "./components/ai/chat.js";
84
88
  import { CodeSnippet, CodeSnippetProps, InlineCode, Prose } from "./components/ai/code-block.js";
85
- import { Conversation, ConversationGroup, ConversationList, ConversationListProps } from "./components/ai/conversation-list.js";
89
+ import { Conversation, ConversationGroup, ConversationList, ConversationListProps, NewConversationButton, NewConversationButtonProps, groupByDate } from "./components/ai/conversation-list.js";
86
90
  import { ModelOption, ModelPicker, ModelPickerProps } from "./components/ai/model-picker.js";
87
- import { PromptInput, PromptInputChip, PromptInputProps } from "./components/ai/prompt-input.js";
91
+ import { PromptInput, PromptInputChip, PromptInputChipProps, PromptInputProps, PromptInputSelect, PromptInputSelectOption, PromptInputSelectProps } from "./components/ai/prompt-input.js";
92
+ import { ToolGroup, ToolGroupProps, ToolStatus, ToolStatusIcon, ToolStep, ToolStepProps } from "./components/ai/tool-steps.js";
88
93
  import { AppleIcon, AuthLayout, AuthLayoutProps, AuthProvider, GitHubIcon, GoogleIcon, LoginForm, LoginFormProps, LoginValues, SignupForm, SignupFormProps, SignupValues } from "./components/auth/auth.js";
89
94
  import { useCopyToClipboard } from "./hooks/use-copy-to-clipboard.js";
90
95
  import { useHighlightedCode } from "./hooks/use-highlighted-code.js";
96
+ import { useMediaQuery } from "./hooks/use-media-query.js";
91
97
  import { useIsMobile } from "./hooks/use-mobile.js";
92
98
  import { highlightCode, loadHighlighter } from "./lib/highlighter.js";
93
99
  import { cn } from "./lib/utils.js";
94
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityFeed, type ActivityItem, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppBrand, type AppBrandProps, type AppNavItem, type AppNavSection, AppShell, type AppShellProps, AppleIcon, AspectRatio, AssistantAvatar, Attachment, AttachmentAction, AttachmentActions, AttachmentContent, AttachmentDescription, AttachmentGroup, AttachmentMedia, AttachmentTitle, AttachmentTrigger, AuthLayout, type AuthLayoutProps, type AuthProvider, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BarList, type BarListItem, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Bubble, BubbleContent, BubbleGroup, BubbleReactions, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Callout, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChatMessage, type ChatMessageProps, ChatThread, type ChatThreadProps, Checkbox, CodeBlock, CodeBlockActions, CodeBlockContent, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader, CodeBlockLine, CodeBlockTitle, CodeSnippet, type CodeSnippetProps, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, type Conversation, type ConversationGroup, ConversationList, type ConversationListProps, DataTable, type DataTableColumnDef, type DataTableFeatures, type DataTableProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectionProvider, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, GitHubIcon, GoogleIcon, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, KeyValueGrid, type KeyValueItem, Label, LinkTile, type LinkTileProps, LoginForm, type LoginFormProps, type LoginValues, Marker, MarkerContent, MarkerIcon, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Message, MessageActions, type MessageActionsProps, MessageAvatar, MessageContent, MessageFooter, MessageGroup, MessageHeader, MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, type ModelOption, ModelPicker, type ModelPickerProps, NativeSelect, NativeSelectOptGroup, NativeSelectOption, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, PageHeader, type PageHeaderProps, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, PromptInput, PromptInputChip, type PromptInputProps, Prose, Questionnaire, QuestionnaireActions, QuestionnaireChoice, QuestionnaireChoiceDescription, QuestionnaireChoices, QuestionnaireDescription, QuestionnaireError, QuestionnaireInput, QuestionnaireItem, QuestionnaireNext, QuestionnairePrevious, QuestionnaireProgress, QuestionnaireSkip, QuestionnaireSubmit, QuestionnaireTitle, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, type ResolvedThemeMode, ScrollArea, ScrollBar, SearchInput, type SearchInputProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, SignupForm, type SignupFormProps, type SignupValues, Skeleton, Slider, Sparkline, type SparklineProps, Spinner, StatCard, type StatCardProps, StatusBadge, type StatusBarDatum, StatusBars, type StatusBarsProps, StatusDot, type StatusTone, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type ThemeContextValue, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThemeScript, ThemeToggle, Timeline, type TimelineItem, Toaster, Toggle, ToggleGroup, ToggleGroupItem, ToolCall, type ToolCallProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Trace, TraceCollapsible, TraceCollapsibleContent, TraceCollapsibleTrigger, TraceDescription, TraceIcon, TraceLine, TraceTitle, TrendChart, type TrendChartProps, TrendLegend, type TrendSeries, TypingIndicator, UsageMeter, type UsageMeterProps, UserChip, type UserChipProps, badgeVariants, buttonGroupVariants, buttonVariants, cn, createDataTableColumnHelper, dataTableFeatures, highlightCode, initials, loadHighlighter, markerVariants, navigationMenuTriggerStyle, smoothPath, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useCopyToClipboard, useDirection, useHighlightedCode, useIsMobile, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, useSidebar, useTheme };
100
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityFeed, type ActivityItem, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppBrand, type AppBrandProps, type AppNavItem, type AppNavSection, AppShell, type AppShellProps, AppleIcon, ApprovalCard, type ApprovalCardProps, ApprovalResult, type ApprovalResultProps, AspectRatio, AssistantAvatar, Attachment, AttachmentAction, AttachmentActions, AttachmentContent, AttachmentDescription, AttachmentGroup, AttachmentMedia, AttachmentTitle, AttachmentTrigger, AuthLayout, type AuthLayoutProps, type AuthProvider, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BarList, type BarListItem, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Bubble, BubbleContent, BubbleGroup, BubbleReactions, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Callout, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChatMessage, type ChatMessageProps, ChatPanel, type ChatPanelProps, ChatShell, type ChatShellProps, ChatThread, type ChatThreadProps, Checkbox, CodeBlock, CodeBlockActions, CodeBlockContent, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader, CodeBlockLine, CodeBlockTitle, CodeSnippet, type CodeSnippetProps, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ConfirmDialog, type ConfirmDialogProps, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, type Conversation, type ConversationGroup, ConversationList, type ConversationListProps, CopyField, type CopyFieldProps, DataTable, type DataTableColumnDef, type DataTableFeatures, type DataTableProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectionProvider, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, GitHubIcon, GoogleIcon, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, KeyValueGrid, type KeyValueItem, Label, LinkTile, type LinkTileProps, LoginForm, type LoginFormProps, type LoginValues, Marker, MarkerContent, MarkerIcon, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Message, MessageActions, type MessageActionsProps, MessageAvatar, MessageContent, MessageFooter, MessageGroup, MessageHeader, MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, type ModelOption, ModelPicker, type ModelPickerProps, NativeSelect, NativeSelectOptGroup, NativeSelectOption, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NewConversationButton, type NewConversationButtonProps, PageHeader, type PageHeaderProps, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, PromptInput, PromptInputChip, type PromptInputChipProps, type PromptInputProps, PromptInputSelect, type PromptInputSelectOption, type PromptInputSelectProps, Prose, Questionnaire, QuestionnaireActions, QuestionnaireChoice, QuestionnaireChoiceDescription, QuestionnaireChoices, QuestionnaireDescription, QuestionnaireError, QuestionnaireInput, QuestionnaireItem, QuestionnaireNext, QuestionnairePrevious, QuestionnaireProgress, QuestionnaireSkip, QuestionnaireSubmit, QuestionnaireTitle, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, type ResolvedThemeMode, ScrollArea, ScrollBar, SearchInput, type SearchInputProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, SignupForm, type SignupFormProps, type SignupValues, Skeleton, Slider, Sparkline, type SparklineProps, Spinner, StatCard, type StatCardProps, StatusBadge, type StatusBadgeProps, type StatusBarDatum, StatusBars, type StatusBarsProps, StatusDot, type StatusDotProps, type StatusTone, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type ThemeContextValue, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThemeScript, ThemeToggle, Timeline, type TimelineItem, Toaster, Toggle, ToggleGroup, ToggleGroupItem, ToolCall, type ToolCallProps, ToolGroup, type ToolGroupProps, type ToolStatus, ToolStatusIcon, ToolStep, type ToolStepProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Trace, TraceCollapsible, TraceCollapsibleContent, TraceCollapsibleTrigger, TraceDescription, TraceIcon, TraceLine, TraceTitle, TrendChart, type TrendChartProps, TrendLegend, type TrendSeries, TypingIndicator, type TypingIndicatorProps, UsageMeter, type UsageMeterProps, UserChip, type UserChipProps, badgeVariants, buttonGroupVariants, buttonVariants, cn, createDataTableColumnHelper, dataTableFeatures, groupByDate, highlightCode, initials, loadHighlighter, markerVariants, navigationMenuTriggerStyle, smoothPath, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useCopyToClipboard, useDirection, useHighlightedCode, useIsMobile, useMediaQuery, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, useSidebar, useSidebarOptional, useTheme };
package/dist/index.js CHANGED
@@ -50,7 +50,7 @@ import { ScrollArea, ScrollBar } from "./components/ui/scroll-area.js";
50
50
  import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from "./components/ui/select.js";
51
51
  import { Separator } from "./components/ui/separator.js";
52
52
  import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from "./components/ui/sheet.js";
53
- import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar } from "./components/ui/sidebar.js";
53
+ import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, useSidebarOptional } from "./components/ui/sidebar.js";
54
54
  import { Skeleton } from "./components/ui/skeleton.js";
55
55
  import { Slider } from "./components/ui/slider.js";
56
56
  import { Toaster } from "./components/ui/sonner.js";
@@ -66,6 +66,8 @@ import { Trace, TraceCollapsible, TraceCollapsibleContent, TraceCollapsibleTrigg
66
66
  import { ActivityFeed } from "./components/admin/activity-feed.js";
67
67
  import { AppBrand, AppShell } from "./components/admin/app-shell.js";
68
68
  import { Callout } from "./components/admin/callout.js";
69
+ import { ConfirmDialog } from "./components/admin/confirm-dialog.js";
70
+ import { CopyField } from "./components/admin/copy-field.js";
69
71
  import { KeyValueGrid } from "./components/admin/key-value-grid.js";
70
72
  import { LinkTile } from "./components/admin/link-tile.js";
71
73
  import { PageHeader } from "./components/admin/page-header.js";
@@ -80,15 +82,19 @@ import { DataTable, createDataTableColumnHelper, dataTableFeatures } from "./com
80
82
  import { Sparkline, smoothPath } from "./components/data/sparkline.js";
81
83
  import { StatusBars } from "./components/data/status-bars.js";
82
84
  import { TrendChart, TrendLegend } from "./components/data/trend-chart.js";
85
+ import { ApprovalCard, ApprovalResult } from "./components/ai/approval.js";
86
+ import { ChatPanel, ChatShell } from "./components/ai/chat-shell.js";
83
87
  import { AssistantAvatar, ChatMessage, ChatThread, MessageActions, ToolCall, TypingIndicator } from "./components/ai/chat.js";
84
88
  import { CodeSnippet, InlineCode, Prose } from "./components/ai/code-block.js";
85
- import { ConversationList } from "./components/ai/conversation-list.js";
89
+ import { ConversationList, NewConversationButton, groupByDate } from "./components/ai/conversation-list.js";
86
90
  import { ModelPicker } from "./components/ai/model-picker.js";
87
- import { PromptInput, PromptInputChip } from "./components/ai/prompt-input.js";
91
+ import { PromptInput, PromptInputChip, PromptInputSelect } from "./components/ai/prompt-input.js";
92
+ import { ToolGroup, ToolStatusIcon, ToolStep } from "./components/ai/tool-steps.js";
88
93
  import { AppleIcon, AuthLayout, GitHubIcon, GoogleIcon, LoginForm, SignupForm } from "./components/auth/auth.js";
89
94
  import { useCopyToClipboard } from "./hooks/use-copy-to-clipboard.js";
90
95
  import { useHighlightedCode } from "./hooks/use-highlighted-code.js";
96
+ import { useMediaQuery } from "./hooks/use-media-query.js";
91
97
  import { useIsMobile } from "./hooks/use-mobile.js";
92
98
  import { highlightCode, loadHighlighter } from "./lib/highlighter.js";
93
99
  import { cn } from "./lib/utils.js";
94
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityFeed, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppBrand, AppShell, AppleIcon, AspectRatio, AssistantAvatar, Attachment, AttachmentAction, AttachmentActions, AttachmentContent, AttachmentDescription, AttachmentGroup, AttachmentMedia, AttachmentTitle, AttachmentTrigger, AuthLayout, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BarList, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Bubble, BubbleContent, BubbleGroup, BubbleReactions, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Callout, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChatMessage, ChatThread, Checkbox, CodeBlock, CodeBlockActions, CodeBlockContent, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader, CodeBlockLine, CodeBlockTitle, CodeSnippet, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ConversationList, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectionProvider, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, GitHubIcon, GoogleIcon, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, KeyValueGrid, Label, LinkTile, LoginForm, Marker, MarkerContent, MarkerIcon, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Message, MessageActions, MessageAvatar, MessageContent, MessageFooter, MessageGroup, MessageHeader, MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, ModelPicker, NativeSelect, NativeSelectOptGroup, NativeSelectOption, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, PageHeader, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, PromptInput, PromptInputChip, Prose, Questionnaire, QuestionnaireActions, QuestionnaireChoice, QuestionnaireChoiceDescription, QuestionnaireChoices, QuestionnaireDescription, QuestionnaireError, QuestionnaireInput, QuestionnaireItem, QuestionnaireNext, QuestionnairePrevious, QuestionnaireProgress, QuestionnaireSkip, QuestionnaireSubmit, QuestionnaireTitle, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, SearchInput, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, SignupForm, Skeleton, Slider, Sparkline, Spinner, StatCard, StatusBadge, StatusBars, StatusDot, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeProvider, ThemeScript, ThemeToggle, Timeline, Toaster, Toggle, ToggleGroup, ToggleGroupItem, ToolCall, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Trace, TraceCollapsible, TraceCollapsibleContent, TraceCollapsibleTrigger, TraceDescription, TraceIcon, TraceLine, TraceTitle, TrendChart, TrendLegend, TypingIndicator, UsageMeter, UserChip, badgeVariants, buttonGroupVariants, buttonVariants, cn, createDataTableColumnHelper, dataTableFeatures, highlightCode, initials, loadHighlighter, markerVariants, navigationMenuTriggerStyle, smoothPath, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useCopyToClipboard, useDirection, useHighlightedCode, useIsMobile, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, useSidebar, useTheme };
100
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityFeed, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppBrand, AppShell, AppleIcon, ApprovalCard, ApprovalResult, AspectRatio, AssistantAvatar, Attachment, AttachmentAction, AttachmentActions, AttachmentContent, AttachmentDescription, AttachmentGroup, AttachmentMedia, AttachmentTitle, AttachmentTrigger, AuthLayout, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BarList, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Bubble, BubbleContent, BubbleGroup, BubbleReactions, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Callout, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChatMessage, ChatPanel, ChatShell, ChatThread, Checkbox, CodeBlock, CodeBlockActions, CodeBlockContent, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader, CodeBlockLine, CodeBlockTitle, CodeSnippet, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ConfirmDialog, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ConversationList, CopyField, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectionProvider, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, GitHubIcon, GoogleIcon, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, KeyValueGrid, Label, LinkTile, LoginForm, Marker, MarkerContent, MarkerIcon, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Message, MessageActions, MessageAvatar, MessageContent, MessageFooter, MessageGroup, MessageHeader, MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, ModelPicker, NativeSelect, NativeSelectOptGroup, NativeSelectOption, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NewConversationButton, PageHeader, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, PromptInput, PromptInputChip, PromptInputSelect, Prose, Questionnaire, QuestionnaireActions, QuestionnaireChoice, QuestionnaireChoiceDescription, QuestionnaireChoices, QuestionnaireDescription, QuestionnaireError, QuestionnaireInput, QuestionnaireItem, QuestionnaireNext, QuestionnairePrevious, QuestionnaireProgress, QuestionnaireSkip, QuestionnaireSubmit, QuestionnaireTitle, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, SearchInput, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, SignupForm, Skeleton, Slider, Sparkline, Spinner, StatCard, StatusBadge, StatusBars, StatusDot, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeProvider, ThemeScript, ThemeToggle, Timeline, Toaster, Toggle, ToggleGroup, ToggleGroupItem, ToolCall, ToolGroup, ToolStatusIcon, ToolStep, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Trace, TraceCollapsible, TraceCollapsibleContent, TraceCollapsibleTrigger, TraceDescription, TraceIcon, TraceLine, TraceTitle, TrendChart, TrendLegend, TypingIndicator, UsageMeter, UserChip, badgeVariants, buttonGroupVariants, buttonVariants, cn, createDataTableColumnHelper, dataTableFeatures, groupByDate, highlightCode, initials, loadHighlighter, markerVariants, navigationMenuTriggerStyle, smoothPath, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useCopyToClipboard, useDirection, useHighlightedCode, useIsMobile, useMediaQuery, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, useSidebar, useSidebarOptional, useTheme };
package/dist/styles.css CHANGED
@@ -186,3 +186,27 @@
186
186
  @utility animate-typing {
187
187
  animation: hb-typing 1.2s infinite ease-in-out;
188
188
  }
189
+
190
+ /* Thin, quiet scrollbars in the theme's colors. Firefox and Chromium use the standard properties; Safari the ::-webkit rules. */
191
+ @layer base {
192
+ * {
193
+ scrollbar-width: thin;
194
+ scrollbar-color: color-mix(in oklab, var(--muted-foreground) 35%, transparent) transparent;
195
+ }
196
+ ::-webkit-scrollbar {
197
+ width: 10px;
198
+ height: 10px;
199
+ }
200
+ ::-webkit-scrollbar-track {
201
+ background: transparent;
202
+ }
203
+ ::-webkit-scrollbar-thumb {
204
+ border: 3px solid transparent;
205
+ border-radius: 999px;
206
+ background-color: color-mix(in oklab, var(--muted-foreground) 35%, transparent);
207
+ background-clip: content-box;
208
+ }
209
+ ::-webkit-scrollbar-thumb:hover {
210
+ background-color: color-mix(in oklab, var(--muted-foreground) 60%, transparent);
211
+ }
212
+ }