@alpic-ai/ui 0.0.0-dev.b70f2bf → 0.0.0-dev.b716a8c

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 (58) hide show
  1. package/dist/components/accordion-card.d.mts +1 -1
  2. package/dist/components/accordion.d.mts +1 -1
  3. package/dist/components/alert.d.mts +2 -2
  4. package/dist/components/attachment-tile.mjs +1 -1
  5. package/dist/components/avatar.d.mts +1 -1
  6. package/dist/components/badge.d.mts +1 -1
  7. package/dist/components/breadcrumb.d.mts +1 -1
  8. package/dist/components/button.d.mts +2 -2
  9. package/dist/components/button.mjs +4 -4
  10. package/dist/components/card.d.mts +1 -1
  11. package/dist/components/checkbox.d.mts +1 -1
  12. package/dist/components/collapsible.d.mts +1 -1
  13. package/dist/components/combobox.d.mts +1 -1
  14. package/dist/components/combobox.mjs +1 -1
  15. package/dist/components/command.d.mts +1 -1
  16. package/dist/components/copyable.d.mts +1 -1
  17. package/dist/components/copyable.mjs +1 -1
  18. package/dist/components/description-list.d.mts +1 -1
  19. package/dist/components/dialog.d.mts +1 -1
  20. package/dist/components/dropdown-menu.d.mts +2 -2
  21. package/dist/components/form.d.mts +1 -1
  22. package/dist/components/form.mjs +1 -1
  23. package/dist/components/github-button.d.mts +13 -0
  24. package/dist/components/github-button.mjs +24 -0
  25. package/dist/components/input-group.d.mts +1 -1
  26. package/dist/components/input.d.mts +1 -1
  27. package/dist/components/input.mjs +1 -1
  28. package/dist/components/label.d.mts +1 -1
  29. package/dist/components/pagination.d.mts +1 -1
  30. package/dist/components/popover.d.mts +1 -1
  31. package/dist/components/radio-group.d.mts +1 -1
  32. package/dist/components/scroll-area.d.mts +1 -1
  33. package/dist/components/select.d.mts +1 -1
  34. package/dist/components/separator.d.mts +1 -1
  35. package/dist/components/sheet.d.mts +1 -1
  36. package/dist/components/sidebar.d.mts +2 -2
  37. package/dist/components/sidebar.mjs +60 -16
  38. package/dist/components/skeleton.d.mts +1 -1
  39. package/dist/components/sonner.d.mts +1 -1
  40. package/dist/components/spinner.d.mts +1 -1
  41. package/dist/components/status-dot.d.mts +1 -1
  42. package/dist/components/switch.d.mts +1 -1
  43. package/dist/components/table.d.mts +1 -1
  44. package/dist/components/tabs.d.mts +3 -3
  45. package/dist/components/tabs.mjs +1 -1
  46. package/dist/components/textarea.d.mts +1 -1
  47. package/dist/components/textarea.mjs +1 -1
  48. package/dist/components/toggle-group.d.mts +2 -2
  49. package/dist/components/toggle-group.mjs +1 -1
  50. package/dist/components/tooltip-icon-button.mjs +1 -1
  51. package/dist/components/tooltip.d.mts +1 -1
  52. package/dist/components/typography.d.mts +1 -1
  53. package/package.json +7 -7
  54. package/src/components/button.tsx +3 -9
  55. package/src/components/github-button.tsx +34 -0
  56. package/src/components/sidebar.tsx +56 -17
  57. package/src/stories/sidebar.stories.tsx +6 -3
  58. package/src/styles/tokens.css +28 -0
@@ -1,6 +1,6 @@
1
- import * as React from "react";
2
1
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
2
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
+ import * as React from "react";
4
4
 
5
5
  //#region src/components/accordion-card.d.ts
6
6
  declare function AccordionCard({
@@ -1,6 +1,6 @@
1
- import * as React from "react";
2
1
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
2
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
+ import * as React from "react";
4
4
 
5
5
  //#region src/components/accordion.d.ts
6
6
  declare function Accordion({
@@ -1,11 +1,11 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
5
5
 
6
6
  //#region src/components/alert.d.ts
7
7
  declare const alertVariants: (props?: ({
8
- variant?: "default" | "destructive" | "warning" | "success" | null | undefined;
8
+ variant?: "success" | "destructive" | "warning" | "default" | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  interface AlertProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof alertVariants> {}
11
11
  declare function Alert({
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.mjs";
3
3
  import { TooltipIconButton } from "./tooltip-icon-button.mjs";
4
- import { useState } from "react";
5
4
  import { FileText, XIcon } from "lucide-react";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { useState } from "react";
7
7
  //#region src/components/attachment-tile.tsx
8
8
  function AttachmentTile({ src, isImage, label, onRemove, onClick, className }) {
9
9
  const [hasError, setHasError] = useState(false);
@@ -1,6 +1,6 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as AvatarPrimitive from "@radix-ui/react-avatar";
5
5
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
6
6
 
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
4
4
 
5
5
  //#region src/components/badge.d.ts
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "warning" | "success" | "secondary" | "primary" | "error" | null | undefined;
7
+ variant?: "success" | "warning" | "primary" | "secondary" | "error" | null | undefined;
8
8
  size?: "sm" | "md" | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  interface BadgeProps extends React.ComponentProps<"span">, VariantProps<typeof badgeVariants> {}
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/breadcrumb.d.ts
5
5
  declare function Breadcrumb({
@@ -1,11 +1,11 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
5
5
 
6
6
  //#region src/components/button.d.ts
7
7
  declare const buttonVariants: (props?: ({
8
- variant?: "destructive" | "secondary" | "primary" | "tertiary" | "link" | "link-muted" | null | undefined;
8
+ variant?: "destructive" | "link" | "primary" | "secondary" | "tertiary" | "link-muted" | null | undefined;
9
9
  size?: "default" | "icon" | "icon-rounded" | "pill" | null | undefined;
10
10
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
11
11
  interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeof buttonVariants> {
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.mjs";
3
3
  import { Loader2 } from "lucide-react";
4
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
- import { Slot } from "@radix-ui/react-slot";
6
+ import { Slot, Slottable } from "@radix-ui/react-slot";
7
7
  //#region src/components/button.tsx
8
8
  const buttonVariants = cva([
9
9
  "inline-flex items-center justify-center gap-1 whitespace-nowrap",
@@ -50,7 +50,7 @@ const buttonVariants = cva([
50
50
  }
51
51
  });
52
52
  function Button({ className, variant, size, type = "button", asChild = false, loading = false, icon, disabled, children, ...props }) {
53
- return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
53
+ return /* @__PURE__ */ jsxs(asChild ? Slot : "button", {
54
54
  "data-slot": "button",
55
55
  className: cn(buttonVariants({
56
56
  variant,
@@ -60,7 +60,7 @@ function Button({ className, variant, size, type = "button", asChild = false, lo
60
60
  disabled: disabled || loading,
61
61
  "aria-busy": loading || void 0,
62
62
  ...props,
63
- children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [loading ? /* @__PURE__ */ jsx(Loader2, { className: "motion-safe:animate-spin" }) : icon, children] })
63
+ children: [loading ? /* @__PURE__ */ jsx(Loader2, { className: "motion-safe:animate-spin" }) : icon, asChild ? /* @__PURE__ */ jsx(Slottable, { children }) : children]
64
64
  });
65
65
  }
66
66
  //#endregion
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/card.d.ts
5
5
  declare function Card({
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
4
4
 
5
5
  //#region src/components/checkbox.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
4
4
 
5
5
  //#region src/components/collapsible.d.ts
@@ -1,8 +1,8 @@
1
1
  import { PopoverContent } from "./popover.mjs";
2
2
  import { selectTriggerVariants } from "./select-trigger-variants.mjs";
3
- import { ReactNode } from "react";
4
3
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
4
  import { VariantProps } from "class-variance-authority";
5
+ import { ReactNode } from "react";
6
6
  import { Command } from "cmdk";
7
7
 
8
8
  //#region src/components/combobox.d.ts
@@ -3,9 +3,9 @@ import { cn } from "../lib/cn.mjs";
3
3
  import { Popover, PopoverContent, PopoverTrigger } from "./popover.mjs";
4
4
  import { selectTriggerVariants } from "./select-trigger-variants.mjs";
5
5
  import { TagDismissible } from "./tag.mjs";
6
- import { createContext, useCallback, useContext, useMemo, useState } from "react";
7
6
  import { CheckIcon, ChevronDownIcon, SearchIcon } from "lucide-react";
8
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { createContext, useCallback, useContext, useMemo, useState } from "react";
9
9
  import { Command } from "cmdk";
10
10
  //#region src/components/combobox.tsx
11
11
  const ComboboxContext = createContext(null);
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import { Command as Command$1 } from "cmdk";
4
4
 
5
5
  //#region src/components/command.d.ts
@@ -1,5 +1,5 @@
1
- import { ReactNode } from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { ReactNode } from "react";
3
3
 
4
4
  //#region src/components/copyable.d.ts
5
5
  interface CopyableProps {
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { useCopyToClipboard } from "../hooks/use-copy-to-clipboard.mjs";
3
2
  import { cn } from "../lib/cn.mjs";
4
3
  import { Button } from "./button.mjs";
4
+ import { useCopyToClipboard } from "../hooks/use-copy-to-clipboard.mjs";
5
5
  import { Check, Copy } from "lucide-react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/components/copyable.tsx
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/description-list.d.ts
5
5
  declare function DescriptionList({
@@ -1,7 +1,7 @@
1
1
  import { ButtonProps } from "./button.mjs";
2
- import * as React from "react";
3
2
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
3
  import { VariantProps } from "class-variance-authority";
4
+ import * as React from "react";
5
5
  import * as DialogPrimitive from "@radix-ui/react-dialog";
6
6
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
7
7
 
@@ -1,6 +1,6 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
5
5
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
6
6
 
@@ -23,7 +23,7 @@ declare function DropdownMenuGroup({
23
23
  ...props
24
24
  }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>): _$react_jsx_runtime0.JSX.Element;
25
25
  declare const dropdownMenuItemVariants: (props?: ({
26
- variant?: "default" | "destructive" | null | undefined;
26
+ variant?: "destructive" | "default" | null | undefined;
27
27
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
28
28
  declare function DropdownMenuItem({
29
29
  className,
@@ -1,8 +1,8 @@
1
1
  import { InputProps } from "./input.mjs";
2
2
  import { Label } from "./label.mjs";
3
3
  import { TextareaProps } from "./textarea.mjs";
4
- import * as React from "react";
5
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
+ import * as React from "react";
6
6
  import { Slot } from "@radix-ui/react-slot";
7
7
  import * as _$react_hook_form0 from "react-hook-form";
8
8
  import { ControllerProps, FieldPath, FieldValues } from "react-hook-form";
@@ -5,9 +5,9 @@ import { Label } from "./label.mjs";
5
5
  import { Input } from "./input.mjs";
6
6
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.mjs";
7
7
  import { Textarea } from "./textarea.mjs";
8
- import * as React from "react";
9
8
  import { Info } from "lucide-react";
10
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
+ import * as React from "react";
11
11
  import { Slot } from "@radix-ui/react-slot";
12
12
  import { Controller, FormProvider, useFormContext, useFormState } from "react-hook-form";
13
13
  //#region src/components/form.tsx
@@ -0,0 +1,13 @@
1
+ import { Button } from "./button.mjs";
2
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { ComponentProps } from "react";
4
+
5
+ //#region src/components/github-button.d.ts
6
+ type GitHubButtonProps = Omit<ComponentProps<typeof Button>, "variant" | "icon">;
7
+ declare function GitHubButton({
8
+ className,
9
+ children,
10
+ ...props
11
+ }: GitHubButtonProps): _$react_jsx_runtime0.JSX.Element;
12
+ //#endregion
13
+ export { GitHubButton, type GitHubButtonProps };
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.mjs";
3
+ import { Button } from "./button.mjs";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/components/github-button.tsx
6
+ const GITHUB_ICON_PATH = "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12";
7
+ function GitHubIcon() {
8
+ return /* @__PURE__ */ jsx("svg", {
9
+ fill: "currentColor",
10
+ viewBox: "0 0 24 24",
11
+ "aria-hidden": "true",
12
+ children: /* @__PURE__ */ jsx("path", { d: GITHUB_ICON_PATH })
13
+ });
14
+ }
15
+ function GitHubButton({ className, children, ...props }) {
16
+ return /* @__PURE__ */ jsx(Button, {
17
+ ...props,
18
+ icon: /* @__PURE__ */ jsx(GitHubIcon, {}),
19
+ className: cn("bg-foreground text-background [@media(hover:hover)]:hover:bg-foreground/90", className),
20
+ children
21
+ });
22
+ }
23
+ //#endregion
24
+ export { GitHubButton };
@@ -1,6 +1,6 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
5
5
 
6
6
  //#region src/components/input-group.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/input.d.ts
5
5
  interface InputProps extends Omit<React.ComponentProps<"input">, "size"> {
@@ -2,9 +2,9 @@
2
2
  import { cn } from "../lib/cn.mjs";
3
3
  import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.mjs";
4
4
  import { Label } from "./label.mjs";
5
- import * as React from "react";
6
5
  import { Info } from "lucide-react";
7
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
+ import * as React from "react";
8
8
  //#region src/components/input.tsx
9
9
  const inputSizeStyles = {
10
10
  sm: {
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as LabelPrimitive from "@radix-ui/react-label";
4
4
 
5
5
  //#region src/components/label.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/pagination.d.ts
5
5
  interface PaginationProps extends React.ComponentProps<"nav"> {
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as PopoverPrimitive from "@radix-ui/react-popover";
4
4
 
5
5
  //#region src/components/popover.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
4
4
 
5
5
  //#region src/components/radio-group.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
4
4
 
5
5
  //#region src/components/scroll-area.d.ts
@@ -1,7 +1,7 @@
1
1
  import { selectTriggerVariants } from "./select-trigger-variants.mjs";
2
- import * as React from "react";
3
2
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
3
  import { VariantProps } from "class-variance-authority";
4
+ import * as React from "react";
5
5
  import * as SelectPrimitive from "@radix-ui/react-select";
6
6
 
7
7
  //#region src/components/select.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
4
4
 
5
5
  //#region src/components/separator.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as SheetPrimitive from "@radix-ui/react-dialog";
4
4
 
5
5
  //#region src/components/sheet.d.ts
@@ -1,8 +1,8 @@
1
1
  import { Button } from "./button.mjs";
2
2
  import { TooltipContent } from "./tooltip.mjs";
3
- import * as React from "react";
4
3
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
4
  import { VariantProps } from "class-variance-authority";
5
+ import * as React from "react";
6
6
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
7
7
 
8
8
  //#region src/components/sidebar.d.ts
@@ -108,7 +108,7 @@ declare function SidebarMenuItem({
108
108
  }: React.ComponentProps<"li">): _$react_jsx_runtime0.JSX.Element;
109
109
  declare const sidebarMenuButtonVariants: (props?: ({
110
110
  variant?: "default" | "outline" | null | undefined;
111
- size?: "default" | "sm" | "lg" | null | undefined;
111
+ size?: "sm" | "lg" | "default" | null | undefined;
112
112
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
113
113
  declare function SidebarMenuButton({
114
114
  asChild,
@@ -1,15 +1,14 @@
1
1
  "use client";
2
- import { useIsMobile } from "../hooks/use-mobile.mjs";
3
2
  import { cn } from "../lib/cn.mjs";
4
3
  import { Button } from "./button.mjs";
5
4
  import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.mjs";
6
5
  import { Separator } from "./separator.mjs";
7
6
  import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "./sheet.mjs";
7
+ import { useIsMobile } from "../hooks/use-mobile.mjs";
8
8
  import { Skeleton } from "./skeleton.mjs";
9
- import * as React from "react";
10
- import { PanelLeftClose, PanelLeftOpen } from "lucide-react";
11
9
  import { jsx, jsxs } from "react/jsx-runtime";
12
10
  import { cva } from "class-variance-authority";
11
+ import * as React from "react";
13
12
  import { Slot } from "@radix-ui/react-slot";
14
13
  //#region src/components/sidebar.tsx
15
14
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
@@ -18,6 +17,18 @@ const SIDEBAR_WIDTH = "15rem";
18
17
  const SIDEBAR_WIDTH_MOBILE = "16rem";
19
18
  const SIDEBAR_WIDTH_ICON = "3.5rem";
20
19
  const SIDEBAR_KEYBOARD_SHORTCUT = "b";
20
+ const INTERACTIVE_SIDEBAR_ELEMENT_SELECTOR = [
21
+ "a",
22
+ "button",
23
+ "input",
24
+ "select",
25
+ "textarea",
26
+ "[role='button']",
27
+ "[role='link']",
28
+ "[role='menuitem']",
29
+ "[contenteditable='true']",
30
+ "[tabindex]:not([tabindex='-1'])"
31
+ ].join(", ");
21
32
  const SidebarContext = React.createContext(null);
22
33
  function useSidebar() {
23
34
  const context = React.useContext(SidebarContext);
@@ -81,7 +92,17 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
81
92
  });
82
93
  }
83
94
  function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }) {
84
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
95
+ const { isMobile, state, openMobile, setOpenMobile, open, setOpen } = useSidebar();
96
+ function handleSurfaceClickCapture(event) {
97
+ if (event.target instanceof Element && event.target.closest(INTERACTIVE_SIDEBAR_ELEMENT_SELECTOR)) return;
98
+ if (!open) {
99
+ event.preventDefault();
100
+ event.stopPropagation();
101
+ setOpen(true);
102
+ return;
103
+ }
104
+ setOpen(false);
105
+ }
85
106
  if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
86
107
  "data-slot": "sidebar",
87
108
  className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className),
@@ -125,15 +146,15 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
125
146
  children: /* @__PURE__ */ jsx("div", {
126
147
  "data-sidebar": "sidebar",
127
148
  "data-slot": "sidebar-inner",
128
- className: "bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm",
149
+ className: "bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full cursor-pointer flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm",
150
+ onClickCapture: handleSurfaceClickCapture,
129
151
  children
130
152
  })
131
153
  })]
132
154
  });
133
155
  }
134
156
  function SidebarTrigger({ className, onClick, ...props }) {
135
- const { state, isMobile, openMobile, toggleSidebar } = useSidebar();
136
- const isOpen = isMobile ? openMobile : state === "expanded";
157
+ const { toggleSidebar } = useSidebar();
137
158
  return /* @__PURE__ */ jsxs(Button, {
138
159
  "data-sidebar": "trigger",
139
160
  "data-slot": "sidebar-trigger",
@@ -145,12 +166,35 @@ function SidebarTrigger({ className, onClick, ...props }) {
145
166
  toggleSidebar();
146
167
  },
147
168
  ...props,
148
- children: [isOpen ? /* @__PURE__ */ jsx(PanelLeftClose, { className: "size-4.5" }) : /* @__PURE__ */ jsx(PanelLeftOpen, { className: "size-4.5" }), /* @__PURE__ */ jsx("span", {
169
+ children: [/* @__PURE__ */ jsx(SidebarToggleIcon, { className: "size-4.5" }), /* @__PURE__ */ jsx("span", {
149
170
  className: "sr-only",
150
171
  children: "Toggle Sidebar"
151
172
  })]
152
173
  });
153
174
  }
175
+ function SidebarToggleIcon({ className, ...props }) {
176
+ return /* @__PURE__ */ jsxs("svg", {
177
+ viewBox: "0 0 20 20",
178
+ fill: "none",
179
+ "aria-hidden": "true",
180
+ className,
181
+ ...props,
182
+ children: [/* @__PURE__ */ jsx("rect", {
183
+ x: "2.75",
184
+ y: "2.75",
185
+ width: "14.5",
186
+ height: "14.5",
187
+ rx: "4",
188
+ stroke: "currentColor",
189
+ strokeWidth: "1.5"
190
+ }), /* @__PURE__ */ jsx("path", {
191
+ d: "M10 4.75V15.25",
192
+ stroke: "currentColor",
193
+ strokeWidth: "1.5",
194
+ strokeLinecap: "round"
195
+ })]
196
+ });
197
+ }
154
198
  function SidebarRail({ className, ...props }) {
155
199
  const { toggleSidebar } = useSidebar();
156
200
  return /* @__PURE__ */ jsx("button", {
@@ -160,7 +204,7 @@ function SidebarRail({ className, ...props }) {
160
204
  tabIndex: -1,
161
205
  onClick: toggleSidebar,
162
206
  title: "Toggle Sidebar",
163
- className: cn("[@media(hover:hover)]:hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "[@media(hover:hover)]:hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className),
207
+ className: cn("absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex", "[@media(hover:hover)]:hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className),
164
208
  ...props
165
209
  });
166
210
  }
@@ -182,19 +226,19 @@ function SidebarHeader({ className, icon, title, children, ...props }) {
182
226
  return /* @__PURE__ */ jsxs("div", {
183
227
  "data-slot": "sidebar-header",
184
228
  "data-sidebar": "header",
185
- className: cn("flex flex-col gap-2 p-2", className),
229
+ className: cn("flex flex-col gap-2 py-2", className),
186
230
  ...props,
187
231
  children: [/* @__PURE__ */ jsxs("div", {
188
232
  className: "flex h-8 items-center gap-2 px-3",
189
233
  children: [
190
- /* @__PURE__ */ jsxs("div", {
191
- className: "relative shrink-0",
234
+ /* @__PURE__ */ jsxs("span", {
235
+ className: "relative flex size-8 shrink-0 items-center justify-center",
192
236
  children: [/* @__PURE__ */ jsx("span", {
193
- className: "transition-opacity group-data-[collapsible=icon]:group-hover:opacity-0",
237
+ className: "transition-opacity duration-200 group-data-[collapsible=icon]:group-hover:opacity-0",
194
238
  children: icon
195
- }), /* @__PURE__ */ jsx("div", {
196
- className: "absolute inset-0 flex items-center justify-center opacity-0 transition-opacity group-data-[collapsible=icon]:group-hover:opacity-100",
197
- children: /* @__PURE__ */ jsx(SidebarTrigger, {})
239
+ }), /* @__PURE__ */ jsx(SidebarTrigger, {
240
+ tabIndex: -1,
241
+ className: "absolute inset-0 opacity-0 transition-opacity duration-200 group-data-[collapsible=icon]:group-hover:opacity-100"
198
242
  })]
199
243
  }),
200
244
  /* @__PURE__ */ jsx("span", {
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
4
4
 
5
5
  //#region src/components/skeleton.d.ts
6
6
  declare const skeletonVariants: (props?: ({
7
- shape?: "rectangle" | "circle" | null | undefined;
7
+ shape?: "circle" | "rectangle" | null | undefined;
8
8
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
9
9
  interface SkeletonProps extends React.ComponentProps<"div">, VariantProps<typeof skeletonVariants> {}
10
10
  declare function Skeleton({
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import { Toaster as Toaster$1, toast } from "sonner";
4
4
 
5
5
  //#region src/components/sonner.d.ts
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
4
4
 
5
5
  //#region src/components/spinner.d.ts
6
6
  declare const spinnerVariants: (props?: ({
7
- variant?: "secondary" | "primary" | null | undefined;
7
+ variant?: "primary" | "secondary" | null | undefined;
8
8
  size?: "sm" | "md" | "lg" | "xl" | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  interface SpinnerProps extends Omit<React.ComponentProps<"svg">, "children">, VariantProps<typeof spinnerVariants> {}
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
4
4
 
5
5
  //#region src/components/status-dot.d.ts
6
6
  declare const statusDotVariants: (props?: ({
7
- variant?: "destructive" | "warning" | "success" | "muted" | null | undefined;
7
+ variant?: "success" | "destructive" | "warning" | "muted" | null | undefined;
8
8
  pulse?: boolean | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  interface StatusDotProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof statusDotVariants> {}
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as SwitchPrimitive from "@radix-ui/react-switch";
4
4
 
5
5
  //#region src/components/switch.d.ts
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/table.d.ts
5
5
  declare function Table({
@@ -1,12 +1,12 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as TabsPrimitive from "@radix-ui/react-tabs";
5
5
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
6
6
 
7
7
  //#region src/components/tabs.d.ts
8
8
  declare const tabsTriggerVariants: (props?: ({
9
- variant?: "default" | "pill" | "line" | null | undefined;
9
+ variant?: "line" | "default" | "pill" | null | undefined;
10
10
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
11
11
  declare function Tabs({
12
12
  className,
@@ -14,7 +14,7 @@ declare function Tabs({
14
14
  ...props
15
15
  }: React.ComponentProps<typeof TabsPrimitive.Root>): _$react_jsx_runtime0.JSX.Element;
16
16
  declare const tabsListVariants: (props?: ({
17
- variant?: "default" | "line" | null | undefined;
17
+ variant?: "line" | "default" | null | undefined;
18
18
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
19
19
  declare function TabsList({
20
20
  className,
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.mjs";
3
- import { createContext, use } from "react";
4
3
  import { jsx } from "react/jsx-runtime";
5
4
  import { cva } from "class-variance-authority";
5
+ import { createContext, use } from "react";
6
6
  import { Slot } from "@radix-ui/react-slot";
7
7
  import * as TabsPrimitive from "@radix-ui/react-tabs";
8
8
  //#region src/components/tabs.tsx
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
 
4
4
  //#region src/components/textarea.d.ts
5
5
  interface TextareaProps extends React.ComponentProps<"textarea"> {
@@ -2,9 +2,9 @@
2
2
  import { cn } from "../lib/cn.mjs";
3
3
  import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.mjs";
4
4
  import { Label } from "./label.mjs";
5
- import * as React from "react";
6
5
  import { Info } from "lucide-react";
7
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
+ import * as React from "react";
8
8
  //#region src/components/textarea.tsx
9
9
  function Textarea({ className, id, label, required, hint, error, tooltip, ...props }) {
10
10
  const generatedId = React.useId();
@@ -1,13 +1,13 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
2
  import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
4
  import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
5
5
  import * as _$class_variance_authority_types0 from "class-variance-authority/types";
6
6
 
7
7
  //#region src/components/toggle-group.d.ts
8
8
  declare const toggleGroupItemVariants: (props?: ({
9
9
  variant?: "default" | "outline" | null | undefined;
10
- size?: "default" | "sm" | null | undefined;
10
+ size?: "sm" | "default" | null | undefined;
11
11
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
12
12
  type ToggleGroupContextValue = VariantProps<typeof toggleGroupItemVariants>;
13
13
  declare function ToggleGroup({
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.mjs";
3
- import * as React from "react";
4
3
  import { jsx } from "react/jsx-runtime";
5
4
  import { cva } from "class-variance-authority";
5
+ import * as React from "react";
6
6
  import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
7
7
  //#region src/components/toggle-group.tsx
8
8
  const toggleGroupItemVariants = cva([
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { Button } from "./button.mjs";
3
3
  import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.mjs";
4
- import { forwardRef } from "react";
5
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { forwardRef } from "react";
6
6
  import { Slottable } from "@radix-ui/react-slot";
7
7
  //#region src/components/tooltip-icon-button.tsx
8
8
  const TooltipIconButton = forwardRef(({ children, tooltip, side = "bottom", ...rest }, ref) => {
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as React from "react";
3
3
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
4
4
 
5
5
  //#region src/components/tooltip.d.ts
@@ -1,5 +1,5 @@
1
- import { ReactNode } from "react";
2
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { ReactNode } from "react";
3
3
 
4
4
  //#region src/components/typography.d.ts
5
5
  declare function H1({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpic-ai/ui",
3
- "version": "0.0.0-dev.b70f2bf",
3
+ "version": "0.0.0-dev.b716a8c",
4
4
  "description": "Alpic design system — shared UI components",
5
5
  "type": "module",
6
6
  "exports": {
@@ -23,9 +23,9 @@
23
23
  "src"
24
24
  ],
25
25
  "peerDependencies": {
26
- "lucide-react": "^1.7.0",
27
- "react": "^19.2.4",
28
- "react-dom": "^19.2.4",
26
+ "lucide-react": "^1.8.0",
27
+ "react": "^19.2.5",
28
+ "react-dom": "^19.2.5",
29
29
  "react-hook-form": "^7.72.1",
30
30
  "sonner": "^2.0.7",
31
31
  "tailwindcss": "^4.2.2",
@@ -59,14 +59,14 @@
59
59
  "@tailwindcss/postcss": "^4.2.2",
60
60
  "@types/react": "19.2.14",
61
61
  "@types/react-dom": "19.2.3",
62
- "lucide-react": "^1.7.0",
62
+ "lucide-react": "^1.8.0",
63
63
  "react-hook-form": "^7.72.1",
64
64
  "shx": "^0.4.0",
65
65
  "sonner": "^2.0.7",
66
66
  "tailwindcss": "^4.2.2",
67
- "tsdown": "^0.21.7",
67
+ "tsdown": "^0.21.9",
68
68
  "tw-animate-css": "^1.4.0",
69
- "typescript": "^6.0.2"
69
+ "typescript": "^6.0.3"
70
70
  },
71
71
  "scripts": {
72
72
  "build": "shx rm -rf dist && tsdown",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { Slot } from "@radix-ui/react-slot";
3
+ import { Slot, Slottable } from "@radix-ui/react-slot";
4
4
  import { cva, type VariantProps } from "class-variance-authority";
5
5
  import { Loader2 } from "lucide-react";
6
6
  import type * as React from "react";
@@ -90,14 +90,8 @@ function Button({
90
90
  aria-busy={loading || undefined}
91
91
  {...props}
92
92
  >
93
- {asChild ? (
94
- children
95
- ) : (
96
- <>
97
- {loading ? <Loader2 className="motion-safe:animate-spin" /> : icon}
98
- {children}
99
- </>
100
- )}
93
+ {loading ? <Loader2 className="motion-safe:animate-spin" /> : icon}
94
+ {asChild ? <Slottable>{children}</Slottable> : children}
101
95
  </Comp>
102
96
  );
103
97
  }
@@ -0,0 +1,34 @@
1
+ "use client";
2
+
3
+ import type { ComponentProps } from "react";
4
+
5
+ import { cn } from "../lib/cn";
6
+ import { Button } from "./button";
7
+
8
+ const GITHUB_ICON_PATH =
9
+ "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12";
10
+
11
+ function GitHubIcon() {
12
+ return (
13
+ <svg fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
14
+ <path d={GITHUB_ICON_PATH} />
15
+ </svg>
16
+ );
17
+ }
18
+
19
+ type GitHubButtonProps = Omit<ComponentProps<typeof Button>, "variant" | "icon">;
20
+
21
+ function GitHubButton({ className, children, ...props }: GitHubButtonProps) {
22
+ return (
23
+ <Button
24
+ {...props}
25
+ icon={<GitHubIcon />}
26
+ className={cn("bg-foreground text-background [@media(hover:hover)]:hover:bg-foreground/90", className)}
27
+ >
28
+ {children}
29
+ </Button>
30
+ );
31
+ }
32
+
33
+ export type { GitHubButtonProps };
34
+ export { GitHubButton };
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { Slot } from "@radix-ui/react-slot";
4
4
  import { cva, type VariantProps } from "class-variance-authority";
5
- import { PanelLeftClose, PanelLeftOpen } from "lucide-react";
6
5
  import * as React from "react";
7
6
 
8
7
  import { useIsMobile } from "../hooks/use-mobile";
@@ -20,6 +19,19 @@ const SIDEBAR_WIDTH_MOBILE = "16rem";
20
19
  const SIDEBAR_WIDTH_ICON = "3.5rem";
21
20
  const SIDEBAR_KEYBOARD_SHORTCUT = "b";
22
21
 
22
+ const INTERACTIVE_SIDEBAR_ELEMENT_SELECTOR = [
23
+ "a",
24
+ "button",
25
+ "input",
26
+ "select",
27
+ "textarea",
28
+ "[role='button']",
29
+ "[role='link']",
30
+ "[role='menuitem']",
31
+ "[contenteditable='true']",
32
+ "[tabindex]:not([tabindex='-1'])",
33
+ ].join(", ");
34
+
23
35
  type SidebarContextProps = {
24
36
  state: "expanded" | "collapsed";
25
37
  open: boolean;
@@ -143,7 +155,25 @@ function Sidebar({
143
155
  variant?: "sidebar" | "floating" | "inset";
144
156
  collapsible?: "offcanvas" | "icon" | "none";
145
157
  }) {
146
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
158
+ const { isMobile, state, openMobile, setOpenMobile, open, setOpen } = useSidebar();
159
+
160
+ function handleSurfaceClickCapture(event: React.MouseEvent<HTMLDivElement>) {
161
+ const clickedInteractiveElement =
162
+ event.target instanceof Element && event.target.closest(INTERACTIVE_SIDEBAR_ELEMENT_SELECTOR);
163
+
164
+ if (clickedInteractiveElement) {
165
+ return;
166
+ }
167
+
168
+ if (!open) {
169
+ event.preventDefault();
170
+ event.stopPropagation();
171
+ setOpen(true);
172
+ return;
173
+ }
174
+
175
+ setOpen(false);
176
+ }
147
177
 
148
178
  if (collapsible === "none") {
149
179
  return (
@@ -221,7 +251,8 @@ function Sidebar({
221
251
  <div
222
252
  data-sidebar="sidebar"
223
253
  data-slot="sidebar-inner"
224
- className="bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm"
254
+ className="bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full cursor-pointer flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm"
255
+ onClickCapture={handleSurfaceClickCapture}
225
256
  >
226
257
  {children}
227
258
  </div>
@@ -231,9 +262,7 @@ function Sidebar({
231
262
  }
232
263
 
233
264
  function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {
234
- const { state, isMobile, openMobile, toggleSidebar } = useSidebar();
235
-
236
- const isOpen = isMobile ? openMobile : state === "expanded";
265
+ const { toggleSidebar } = useSidebar();
237
266
 
238
267
  return (
239
268
  <Button
@@ -248,12 +277,21 @@ function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<t
248
277
  }}
249
278
  {...props}
250
279
  >
251
- {isOpen ? <PanelLeftClose className="size-4.5" /> : <PanelLeftOpen className="size-4.5" />}
280
+ <SidebarToggleIcon className="size-4.5" />
252
281
  <span className="sr-only">Toggle Sidebar</span>
253
282
  </Button>
254
283
  );
255
284
  }
256
285
 
286
+ function SidebarToggleIcon({ className, ...props }: React.ComponentProps<"svg">) {
287
+ return (
288
+ <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" className={className} {...props}>
289
+ <rect x="2.75" y="2.75" width="14.5" height="14.5" rx="4" stroke="currentColor" strokeWidth="1.5" />
290
+ <path d="M10 4.75V15.25" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
291
+ </svg>
292
+ );
293
+ }
294
+
257
295
  function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
258
296
  const { toggleSidebar } = useSidebar();
259
297
 
@@ -266,9 +304,7 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
266
304
  onClick={toggleSidebar}
267
305
  title="Toggle Sidebar"
268
306
  className={cn(
269
- "[@media(hover:hover)]:hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
270
- "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
271
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
307
+ "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
272
308
  "[@media(hover:hover)]:hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
273
309
  "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
274
310
  "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
@@ -316,16 +352,19 @@ function SidebarHeader({ className, icon, title, children, ...props }: SidebarHe
316
352
  <div
317
353
  data-slot="sidebar-header"
318
354
  data-sidebar="header"
319
- className={cn("flex flex-col gap-2 p-2", className)}
355
+ className={cn("flex flex-col gap-2 py-2", className)}
320
356
  {...props}
321
357
  >
322
358
  <div className="flex h-8 items-center gap-2 px-3">
323
- <div className="relative shrink-0">
324
- <span className="transition-opacity group-data-[collapsible=icon]:group-hover:opacity-0">{icon}</span>
325
- <div className="absolute inset-0 flex items-center justify-center opacity-0 transition-opacity group-data-[collapsible=icon]:group-hover:opacity-100">
326
- <SidebarTrigger />
327
- </div>
328
- </div>
359
+ <span className="relative flex size-8 shrink-0 items-center justify-center">
360
+ <span className="transition-opacity duration-200 group-data-[collapsible=icon]:group-hover:opacity-0">
361
+ {icon}
362
+ </span>
363
+ <SidebarTrigger
364
+ tabIndex={-1}
365
+ className="absolute inset-0 opacity-0 transition-opacity duration-200 group-data-[collapsible=icon]:group-hover:opacity-100"
366
+ />
367
+ </span>
329
368
  <span className="text-foreground text-md min-w-0 truncate font-medium group-data-[collapsible=icon]:hidden">
330
369
  {title}
331
370
  </span>
@@ -107,7 +107,8 @@ export const AllVariants: Story = () => (
107
107
  <UserFooter />
108
108
  </Sidebar>
109
109
  <SidebarInset>
110
- <div className="p-4">
110
+ <div className="flex items-center gap-2 p-4">
111
+ <SidebarTrigger />
111
112
  <span className="type-text-sm text-muted-foreground">Sub-menus expand inline under their parent</span>
112
113
  </div>
113
114
  </SidebarInset>
@@ -169,7 +170,8 @@ export const AllVariants: Story = () => (
169
170
  <UserFooter />
170
171
  </Sidebar>
171
172
  <SidebarInset>
172
- <div className="p-4">
173
+ <div className="flex items-center gap-2 p-4">
174
+ <SidebarTrigger />
173
175
  <span className="type-text-sm text-muted-foreground">Groups with labels, badges, and separator</span>
174
176
  </div>
175
177
  </SidebarInset>
@@ -195,7 +197,8 @@ export const AllVariants: Story = () => (
195
197
  <UserFooter />
196
198
  </Sidebar>
197
199
  <SidebarInset>
198
- <div className="p-4">
200
+ <div className="flex items-center gap-2 p-4">
201
+ <SidebarTrigger />
199
202
  <span className="type-text-sm text-muted-foreground">Loading state with skeleton placeholders</span>
200
203
  </div>
201
204
  </SidebarInset>
@@ -106,6 +106,8 @@
106
106
  /* animations */
107
107
  --animate-accordion-down: accordion-down 200ms ease-out;
108
108
  --animate-accordion-up: accordion-up 200ms ease-out;
109
+ --animate-beacon-ring-core: beacon-ring-core 2.2s ease-in-out infinite;
110
+ --animate-beacon-ring-pulse: beacon-ring-pulse 2.2s ease-in-out infinite;
109
111
  }
110
112
 
111
113
  @keyframes accordion-down {
@@ -126,6 +128,32 @@
126
128
  }
127
129
  }
128
130
 
131
+ @keyframes beacon-ring-core {
132
+ 0%,
133
+ 100% {
134
+ opacity: 0.55;
135
+ transform: scale(0.98);
136
+ }
137
+ 50% {
138
+ opacity: 0.85;
139
+ transform: scale(1.02);
140
+ }
141
+ }
142
+
143
+ @keyframes beacon-ring-pulse {
144
+ 0%,
145
+ 100% {
146
+ opacity: 0.88;
147
+ transform: scale(1);
148
+ filter: drop-shadow(0 0 0 rgba(59, 130, 246, 0));
149
+ }
150
+ 50% {
151
+ opacity: 1;
152
+ transform: scale(1.02);
153
+ filter: drop-shadow(0 0 8px rgba(59, 130, 246, 0.24));
154
+ }
155
+ }
156
+
129
157
  /* ─── Dark mode ───────────────────────────────────────────────────────────── */
130
158
 
131
159
  .dark {