@cryptlex/web-components 5.2.0 → 5.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 (121) hide show
  1. package/dist/components/data-table/data-table-filter.d.ts +27 -0
  2. package/dist/components/data-table/data-table-filter.js +112 -0
  3. package/dist/components/data-table/data-table.d.ts +73 -0
  4. package/dist/components/data-table/data-table.js +265 -0
  5. package/dist/components/data-table/table-commons.d.ts +56 -0
  6. package/dist/components/data-table/table-commons.js +137 -0
  7. package/dist/components/inputs/checkbox.d.ts +8 -0
  8. package/dist/components/inputs/checkbox.js +25 -0
  9. package/dist/components/inputs/date-picker.d.ts +11 -0
  10. package/dist/components/inputs/date-picker.js +22 -0
  11. package/dist/components/inputs/datefield.d.ts +14 -0
  12. package/dist/components/inputs/datefield.js +25 -0
  13. package/dist/components/inputs/field.d.ts +21 -0
  14. package/dist/components/inputs/field.js +48 -0
  15. package/dist/components/inputs/id-search.d.ts +20 -0
  16. package/dist/components/inputs/id-search.js +40 -0
  17. package/dist/components/inputs/input-otp.d.ts +8 -0
  18. package/dist/components/inputs/input-otp.js +19 -0
  19. package/dist/components/inputs/multi-select.d.ts +17 -0
  20. package/dist/components/inputs/multi-select.js +18 -0
  21. package/dist/components/inputs/numberfield.d.ts +7 -0
  22. package/dist/components/inputs/numberfield.js +25 -0
  23. package/dist/components/inputs/searchfield.d.ts +5 -0
  24. package/dist/components/inputs/searchfield.js +24 -0
  25. package/dist/components/inputs/select-options.d.ts +8 -0
  26. package/dist/components/inputs/select-options.js +286 -0
  27. package/dist/components/inputs/select.d.ts +17 -0
  28. package/dist/components/inputs/select.js +34 -0
  29. package/dist/components/inputs/textfield.d.ts +7 -0
  30. package/dist/components/inputs/textfield.js +28 -0
  31. package/dist/components/key-value-card/key-value-card.d.ts +17 -0
  32. package/dist/components/key-value-card/key-value-card.js +40 -0
  33. package/dist/components/ui/alert.d.ts +8 -0
  34. package/dist/components/ui/alert.js +18 -0
  35. package/dist/components/ui/avatar.d.ts +8 -0
  36. package/dist/components/ui/avatar.js +5 -0
  37. package/dist/components/ui/badge.d.ts +2 -0
  38. package/dist/components/ui/badge.js +5 -0
  39. package/dist/components/ui/breadcrumbs.d.ts +10 -0
  40. package/dist/components/ui/breadcrumbs.js +28 -0
  41. package/dist/components/ui/button.d.ts +11 -0
  42. package/dist/components/ui/button.js +34 -0
  43. package/dist/components/ui/calendar.d.ts +17 -0
  44. package/dist/components/ui/calendar.js +63 -0
  45. package/dist/components/ui/card.d.ts +7 -0
  46. package/dist/components/ui/card.js +20 -0
  47. package/dist/components/ui/dialog.d.ts +19 -0
  48. package/dist/components/ui/dialog.js +42 -0
  49. package/dist/components/ui/disclosure.d.ts +19 -0
  50. package/dist/components/ui/disclosure.js +20 -0
  51. package/dist/components/ui/list-box.d.ts +5 -0
  52. package/dist/components/ui/list-box.js +24 -0
  53. package/dist/components/ui/loader.d.ts +5 -0
  54. package/dist/components/ui/loader.js +6 -0
  55. package/dist/components/ui/menu.d.ts +25 -0
  56. package/dist/components/ui/menu.js +38 -0
  57. package/dist/components/ui/popover.d.ts +4 -0
  58. package/dist/components/ui/popover.js +14 -0
  59. package/dist/components/ui/sidebar.d.ts +53 -0
  60. package/dist/components/ui/sidebar.js +177 -0
  61. package/dist/components/ui/skeleton.d.ts +1 -0
  62. package/dist/components/ui/skeleton.js +5 -0
  63. package/dist/components/ui/sonner.d.ts +4 -0
  64. package/dist/components/ui/sonner.js +14 -0
  65. package/dist/components/ui/table.d.ts +9 -0
  66. package/dist/components/ui/table.js +26 -0
  67. package/dist/components/ui/tabs.d.ts +5 -0
  68. package/dist/components/ui/tabs.js +25 -0
  69. package/dist/components/ui/timeline.d.ts +15 -0
  70. package/dist/components/ui/timeline.js +31 -0
  71. package/dist/components/ui/tooltip.d.ts +4 -0
  72. package/dist/components/ui/tooltip.js +12 -0
  73. package/dist/utils/form-context.d.ts +4 -0
  74. package/{lib/utils/form-context.tsx → dist/utils/form-context.js} +1 -3
  75. package/dist/utils/form-hook.d.ts +25 -0
  76. package/{lib/utils/form-hook.tsx → dist/utils/form-hook.js} +15 -18
  77. package/dist/utils/primitives.d.ts +30 -0
  78. package/{lib/utils/primitives.ts → dist/utils/primitives.js} +8 -37
  79. package/dist/utils/resource-names.d.ts +23 -0
  80. package/{lib/utils/resource-names.tsx → dist/utils/resource-names.js} +42 -75
  81. package/dist/utils/use-mobile.d.ts +1 -0
  82. package/dist/utils/use-mobile.js +15 -0
  83. package/package.json +10 -5
  84. package/lib/components/data-table/data-table-filter.tsx +0 -220
  85. package/lib/components/data-table/data-table.tsx +0 -593
  86. package/lib/components/data-table/table-commons.tsx +0 -233
  87. package/lib/components/inputs/checkbox.tsx +0 -72
  88. package/lib/components/inputs/date-picker.tsx +0 -130
  89. package/lib/components/inputs/datefield.tsx +0 -109
  90. package/lib/components/inputs/field.tsx +0 -106
  91. package/lib/components/inputs/id-search.tsx +0 -83
  92. package/lib/components/inputs/input-otp.tsx +0 -63
  93. package/lib/components/inputs/multi-select.tsx +0 -62
  94. package/lib/components/inputs/numberfield.tsx +0 -110
  95. package/lib/components/inputs/searchfield.tsx +0 -87
  96. package/lib/components/inputs/select-options.tsx +0 -303
  97. package/lib/components/inputs/select.tsx +0 -140
  98. package/lib/components/inputs/textfield.tsx +0 -96
  99. package/lib/components/key-value-card/key-value-card.tsx +0 -115
  100. package/lib/components/ui/alert.tsx +0 -32
  101. package/lib/components/ui/avatar.tsx +0 -22
  102. package/lib/components/ui/badge.tsx +0 -19
  103. package/lib/components/ui/breadcrumbs.tsx +0 -104
  104. package/lib/components/ui/button.tsx +0 -66
  105. package/lib/components/ui/calendar.tsx +0 -220
  106. package/lib/components/ui/card.tsx +0 -58
  107. package/lib/components/ui/dialog.tsx +0 -172
  108. package/lib/components/ui/disclosure.tsx +0 -113
  109. package/lib/components/ui/list-box.tsx +0 -86
  110. package/lib/components/ui/loader.tsx +0 -10
  111. package/lib/components/ui/menu.tsx +0 -168
  112. package/lib/components/ui/popover.tsx +0 -37
  113. package/lib/components/ui/sidebar.tsx +0 -552
  114. package/lib/components/ui/skeleton.tsx +0 -7
  115. package/lib/components/ui/sonner.tsx +0 -26
  116. package/lib/components/ui/table.tsx +0 -79
  117. package/lib/components/ui/tabs.tsx +0 -82
  118. package/lib/components/ui/timeline.tsx +0 -52
  119. package/lib/components/ui/tooltip.tsx +0 -30
  120. package/lib/tokens.scss +0 -89
  121. package/lib/utils/use-mobile.tsx +0 -21
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getLocalTimeZone, today } from "@internationalized/date";
3
+ import * as React from "react";
4
+ import { Calendar as AriaCalendar, CalendarCell as AriaCalendarCell, CalendarGrid as AriaCalendarGrid, CalendarGridBody as AriaCalendarGridBody, CalendarGridHeader as AriaCalendarGridHeader, CalendarHeaderCell as AriaCalendarHeaderCell, Heading as AriaHeading, RangeCalendar as AriaRangeCalendar, RangeCalendarStateContext as AriaRangeCalendarStateContext, composeRenderProps, Text, useLocale } from "react-aria-components";
5
+ import { Button, buttonVariants } from "lib/components/ui/button";
6
+ import { cn } from "lib/utils/primitives";
7
+ import { ChevronLeft, ChevronRight } from "lucide-react";
8
+ export function CalendarHeading(props) {
9
+ let { direction } = useLocale();
10
+ return (_jsxs("header", { className: "flex w-full items-center gap-1 px-1 pb-4", ...props, children: [_jsx(Button, { slot: "previous", size: 'none', className: cn("size-7 bg-transparent p-0 opacity-50",
11
+ /* Hover */
12
+ "data-[hovered]:opacity-100"), children: direction === "rtl" ? (_jsx(ChevronRight, { "aria-hidden": true })) : (_jsx(ChevronLeft, { "aria-hidden": true })) }), _jsx(AriaHeading, { className: "grow text-center text-sm font-medium" }), _jsx(Button, { slot: "next", className: cn("size-7 bg-transparent p-0 opacity-50",
13
+ /* Hover */
14
+ "data-[hovered]:opacity-100"), children: direction === "rtl" ? (_jsx(ChevronLeft, { "aria-hidden": true })) : (_jsx(ChevronRight, { "aria-hidden": true })) })] }));
15
+ }
16
+ export function CalendarGrid({ className, ...props }) {
17
+ return (_jsx(AriaCalendarGrid, { className: cn(" border-separate border-spacing-x-0 border-spacing-y-1 ", className), ...props }));
18
+ }
19
+ export const CalendarGridHeader = AriaCalendarGridHeader;
20
+ export function CalendarHeaderCell({ className, ...props }) {
21
+ return (_jsx(AriaCalendarHeaderCell, { className: cn("w-9 text-xs font-normal text-muted-foreground", className), ...props }));
22
+ }
23
+ export function CalendarGridBody({ className, ...props }) {
24
+ return (_jsx(AriaCalendarGridBody, { className: cn("[&>tr>td]:p-0", className), ...props }));
25
+ }
26
+ export function CalendarCell({ className, ...props }) {
27
+ const isRange = Boolean(React.useContext(AriaRangeCalendarStateContext));
28
+ return (_jsx(AriaCalendarCell, { className: composeRenderProps(className, (className, renderProps) => cn(buttonVariants({ variant: "ghost", size: 'none' }), "relative flex size-9 items-center justify-center p-0 text-sm font-normal",
29
+ /* Disabled */
30
+ renderProps.isDisabled && "text-muted-foreground opacity-50",
31
+ /* Selected */
32
+ renderProps.isSelected &&
33
+ "bg-primary text-primary-foreground data-[focused]:bg-primary data-[focused]:text-primary-foreground",
34
+ /* Hover */
35
+ renderProps.isHovered &&
36
+ renderProps.isSelected &&
37
+ (renderProps.isSelectionStart ||
38
+ renderProps.isSelectionEnd ||
39
+ !isRange) &&
40
+ "data-[hovered]:bg-primary data-[hovered]:text-primary-foreground",
41
+ /* Selection Start/End */
42
+ renderProps.isSelected &&
43
+ isRange &&
44
+ !renderProps.isSelectionStart &&
45
+ !renderProps.isSelectionEnd &&
46
+ "rounded-none bg-accent text-accent-foreground",
47
+ /* Outside Month */
48
+ renderProps.isOutsideMonth &&
49
+ "text-muted-foreground opacity-50 data-[selected]:bg-accent/50 data-[selected]:text-muted-foreground data-[selected]:opacity-30",
50
+ /* Current Date */
51
+ renderProps.date.compare(today(getLocalTimeZone())) === 0 &&
52
+ !renderProps.isSelected &&
53
+ "bg-accent text-accent-foreground",
54
+ /* Unavailable Date */
55
+ renderProps.isUnavailable && "cursor-default text-destructive ", renderProps.isInvalid &&
56
+ "bg-destructive text-destructive-foreground data-[focused]:bg-destructive data-[hovered]:bg-destructive data-[focused]:text-destructive-foreground data-[hovered]:text-destructive-foreground", className)), ...props }));
57
+ }
58
+ export function Calendar({ errorMessage, className, ...props }) {
59
+ return (_jsxs(AriaCalendar, { className: composeRenderProps(className, (className) => cn("w-fit", className)), ...props, children: [_jsx(CalendarHeading, {}), _jsxs(CalendarGrid, { children: [_jsx(CalendarGridHeader, { children: (day) => _jsx(CalendarHeaderCell, { children: day }) }), _jsx(CalendarGridBody, { children: (date) => _jsx(CalendarCell, { date: date }) })] }), errorMessage && (_jsx(Text, { className: "text-sm text-destructive", slot: "errorMessage", children: errorMessage }))] }));
60
+ }
61
+ export function RangeCalendar({ errorMessage, className, ...props }) {
62
+ return (_jsxs(AriaRangeCalendar, { className: composeRenderProps(className, (className) => cn("w-fit", className)), ...props, children: [_jsx(CalendarHeading, {}), _jsxs(CalendarGrid, { children: [_jsx(CalendarGridHeader, { children: (day) => _jsx(CalendarHeaderCell, { children: day }) }), _jsx(CalendarGridBody, { children: (date) => _jsx(CalendarCell, { date: date }) })] }), errorMessage && (_jsx(Text, { slot: "errorMessage", className: "text-sm text-destructive", children: errorMessage }))] }));
63
+ }
@@ -0,0 +1,7 @@
1
+ import type * as React from "react";
2
+ export declare function Card({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
3
+ export declare function CardHeader({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
4
+ export declare function CardTitle({ className, ...props }: React.ComponentProps<"h3">): import("react/jsx-runtime").JSX.Element;
5
+ export declare function CardDescription({ className, ...props }: React.ComponentProps<"p">): import("react/jsx-runtime").JSX.Element;
6
+ export declare function CardContent({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
7
+ export declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "lib/utils/primitives";
3
+ export function Card({ className, ...props }) {
4
+ return (_jsx("div", { className: cn("flex flex-col p-icon border border-border bg-card text-card-foreground", className), ...props }));
5
+ }
6
+ export function CardHeader({ className, ...props }) {
7
+ return (_jsx("div", { className: cn("flex flex-col gap-y-1 pb-icon shrink-0", className), ...props }));
8
+ }
9
+ export function CardTitle({ className, ...props }) {
10
+ return (_jsx("h3", { className: cn("h4 leading-none", className), ...props }));
11
+ }
12
+ export function CardDescription({ className, ...props }) {
13
+ return (_jsx("p", { className: cn("caption", className), ...props }));
14
+ }
15
+ export function CardContent({ className, ...props }) {
16
+ return (_jsx("div", { className: cn("grow body", className), ...props }));
17
+ }
18
+ export function CardFooter({ className, ...props }) {
19
+ return (_jsx("div", { className: cn("flex items-center w-full pt-icon gap-2 justify-end", className), ...props }));
20
+ }
@@ -0,0 +1,19 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ import * as React from "react";
3
+ import { DialogProps as AriaDialogProps, DialogTrigger as AriaDialogTrigger, HeadingProps as AriaHeadingProps, Modal as AriaModal, ModalOverlayProps as AriaModalOverlayProps } from "react-aria-components";
4
+ declare const sheetVariants: (props?: ({
5
+ side?: "left" | "right" | "top" | "bottom" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export declare const DialogTrigger: typeof AriaDialogTrigger;
8
+ export declare const DialogOverlay: ({ className, isDismissable, ...props }: AriaModalOverlayProps) => import("react/jsx-runtime").JSX.Element;
9
+ export interface DialogContentProps extends Omit<React.ComponentProps<typeof AriaModal>, "children">, VariantProps<typeof sheetVariants> {
10
+ children?: AriaDialogProps["children"];
11
+ role?: AriaDialogProps["role"];
12
+ closeButton?: boolean;
13
+ }
14
+ export declare function DialogContent({ className, children, side, role, closeButton, ...props }: DialogContentProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
16
+ export declare function DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
17
+ export declare function DialogTitle({ className, ...props }: AriaHeadingProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function DialogDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): import("react/jsx-runtime").JSX.Element;
19
+ export {};
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Heading as AriaHeading, Modal as AriaModal, ModalOverlay as AriaModalOverlay, composeRenderProps } from "react-aria-components";
4
+ import { Button } from "lib/components/ui/button";
5
+ import { cn } from "lib/utils/primitives";
6
+ import { X } from "lucide-react";
7
+ const sheetVariants = cva([
8
+ "fixed z-50 gap-4 bg-popover transition ease-in-out",
9
+ "data-[entering]:duration-200 data-[entering]:animate-in data-[entering]:fade-in-0 data-[exiting]:duration-200 data-[exiting]:animate-out data-[exiting]:fade-out-0",
10
+ ], {
11
+ variants: {
12
+ side: {
13
+ top: "inset-x-0 top-0 border-b data-[entering]:slide-in-from-top data-[exiting]:slide-out-to-top max-h-table",
14
+ bottom: "inset-x-0 bottom-0 border-t data-[entering]:slide-in-from-bottom data-[exiting]:slide-out-to-bottom max-h-table",
15
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[entering]:slide-in-from-left data-[exiting]:slide-out-to-left sm:max-w-sm",
16
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[entering]:slide-in-from-right data-[exiting]:slide-out-to-right sm:max-w-sm",
17
+ },
18
+ },
19
+ });
20
+ export const DialogTrigger = AriaDialogTrigger;
21
+ export const DialogOverlay = ({ className, isDismissable = true, ...props }) => (_jsx(AriaModalOverlay, { isDismissable: isDismissable, className: composeRenderProps(className, (className) => cn("fixed inset-0 z-50 bg-card/20",
22
+ /* Exiting */
23
+ "data-[exiting]:duration-100 data-[exiting]:animate-out",
24
+ /* Entering */
25
+ "data-[entering]:animate-in", className)), ...props }));
26
+ export function DialogContent({ className, children, side, role, closeButton = true, ...props }) {
27
+ return (_jsx(AriaModal, { className: composeRenderProps(className, (className) => cn(side
28
+ ? sheetVariants({ side, className: "h-full p-6" })
29
+ : ["fixed left-[50vw] top-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 border bg-popover p-icon duration-100 data-[exiting]:duration-100 data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:fade-in-0 data-[exiting]:fade-out-0 data-[entering]:zoom-in-95 data-[exiting]:zoom-out-95 md:w-full"], className)), ...props, children: _jsx(AriaDialog, { role: role, className: cn(!side && "grid h-full gap-4 relative", "h-full outline-none"), children: composeRenderProps(children, (children, renderProps) => (_jsxs(_Fragment, { children: [children, closeButton && (_jsx("div", { className: "absolute right-1 top-1", children: _jsxs(Button, { size: 'icon', variant: 'destructive', onPress: renderProps.close, className: "opacity-70 transition-opacity data-[hovered]:opacity-100", children: [_jsx(X, {}), _jsx("span", { className: "sr-only", children: "Close" })] }) }))] }))) }) }));
30
+ }
31
+ export function DialogHeader({ className, ...props }) {
32
+ return (_jsx("div", { className: cn("flex flex-col gap-y-2 text-center sm:text-left", className), ...props }));
33
+ }
34
+ export function DialogFooter({ className, ...props }) {
35
+ return (_jsx("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2", className), ...props }));
36
+ }
37
+ export function DialogTitle({ className, ...props }) {
38
+ return (_jsx(AriaHeading, { slot: "title", className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
39
+ }
40
+ export function DialogDescription({ className, ...props }) {
41
+ return (_jsx("p", { className: cn("flex flex-col gap-y-1 text-center sm:text-left", className), ...props }));
42
+ }
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import { DisclosureGroupProps as AriaDisclosureGroupProps, DisclosurePanelProps as AriaDisclosurePanelProps, DisclosureProps as AriaDisclosureProps, ButtonProps } from "react-aria-components";
3
+ export interface DisclosureProps extends AriaDisclosureProps {
4
+ children: React.ReactNode;
5
+ }
6
+ export declare function Disclosure({ children, className, ...props }: DisclosureProps): import("react/jsx-runtime").JSX.Element;
7
+ export interface DisclosureHeaderProps {
8
+ children: React.ReactNode;
9
+ className?: ButtonProps["className"];
10
+ }
11
+ export declare function DisclosureHeader({ children, className }: DisclosureHeaderProps): import("react/jsx-runtime").JSX.Element;
12
+ export interface DisclosurePanelProps extends AriaDisclosurePanelProps {
13
+ children: React.ReactNode;
14
+ }
15
+ export declare function DisclosurePanel({ children, className, ...props }: DisclosurePanelProps): import("react/jsx-runtime").JSX.Element;
16
+ export interface DisclosureGroupProps extends AriaDisclosureGroupProps {
17
+ children: React.ReactNode;
18
+ }
19
+ export declare function DisclosureGroup({ children, className, ...props }: DisclosureGroupProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChevronDownIcon } from "lucide-react";
3
+ import { useContext } from "react";
4
+ import { Disclosure as AriaDisclosure, DisclosureGroup as AriaDisclosureGroup, DisclosurePanel as AriaDisclosurePanel, Button, composeRenderProps, DisclosureGroupStateContext, Heading, } from "react-aria-components";
5
+ import { cn } from "lib/utils/primitives";
6
+ export function Disclosure({ children, className, ...props }) {
7
+ let isInGroup = useContext(DisclosureGroupStateContext) !== null;
8
+ return (_jsx(AriaDisclosure, { ...props, className: composeRenderProps(className, (className, _) => cn("group min-w-64", isInGroup && "border-0 border-b last:border-b-0", className)), children: children }));
9
+ }
10
+ export function DisclosureHeader({ children, className }) {
11
+ return (_jsx(Heading, { className: "flex", children: _jsxs(Button, { slot: "trigger", className: composeRenderProps(className, (className) => {
12
+ return cn("group flex flex-1 items-center justify-between rounded-md py-4 font-medium ring-offset-background transition-all hover:underline", "data-[disabled]:pointer-events-none data-[disabled]:opacity-50", "data-[focus-visible]:outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-ring data-[focus-visible]:ring-offset-2", "outline-none", className);
13
+ }), children: [children, _jsx(ChevronDownIcon, { "aria-hidden": true, className: cn("size-4 shrink-0 transition-transform duration-200", "group-data-[expanded]:rotate-180", "group-data-[disabled]:opacity-50") })] }) }));
14
+ }
15
+ export function DisclosurePanel({ children, className, ...props }) {
16
+ return (_jsx(AriaDisclosurePanel, { ...props, className: "overflow-hidden text-sm transition-all", children: _jsx("div", { className: cn("pb-4 pt-0", className), children: children }) }));
17
+ }
18
+ export function DisclosureGroup({ children, className, ...props }) {
19
+ return (_jsx(AriaDisclosureGroup, { ...props, className: composeRenderProps(className, (className, _) => cn("", className)), children: children }));
20
+ }
@@ -0,0 +1,5 @@
1
+ import { Collection as AriaCollection, Header as AriaHeader, ListBoxItemProps as AriaListBoxItemProps, ListBoxProps as AriaListBoxProps } from "react-aria-components";
2
+ export declare const ListBoxCollection: typeof AriaCollection;
3
+ export declare function ListBox<T extends object>({ className, ...props }: AriaListBoxProps<T>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function ListBoxItem<T extends object>({ className, children, ...props }: AriaListBoxItemProps<T>): import("react/jsx-runtime").JSX.Element;
5
+ export declare function ListBoxHeader({ className, ...props }: React.ComponentProps<typeof AriaHeader>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Collection as AriaCollection, Header as AriaHeader, ListBox as AriaListBox, ListBoxItem as AriaListBoxItem, composeRenderProps } from "react-aria-components";
3
+ import { cn } from "lib/utils/primitives";
4
+ import { Check } from "lucide-react";
5
+ export const ListBoxCollection = AriaCollection;
6
+ export function ListBox({ className, ...props }) {
7
+ return (_jsx(AriaListBox, { className: composeRenderProps(className, (className) => cn(className, "group overflow-auto border bg-popover p-1 text-popover-foreground shadow-md outline-none",
8
+ /* Empty */
9
+ "data-[empty]:p-6 data-[empty]:text-center data-[empty]:text-sm")), ...props }));
10
+ }
11
+ export function ListBoxItem({ className, children, ...props }) {
12
+ return (_jsx(AriaListBoxItem, { textValue: props.textValue || (typeof children === "string" ? children : undefined), className: composeRenderProps(className, (className) => cn("relative flex w-full cursor-default select-none items-center px-2 py-1.5 text-sm outline-none",
13
+ /* Disabled */
14
+ "disabled-muted",
15
+ /* Focused */
16
+ "data-[focused]:bg-accent data-[focused]:text-accent-foreground",
17
+ /* Hovered */
18
+ "data-[hovered]:bg-accent data-[hovered]:text-accent-foreground",
19
+ /* Selection */
20
+ "data-[selection-mode]:pl-input", className)), ...props, children: composeRenderProps(children, (children, renderProps) => (_jsxs(_Fragment, { children: [renderProps.isSelected && (_jsx("span", { className: "absolute left-2 flex size-icon items-center justify-center", children: _jsx(Check, { className: "size-icon" }) })), children] }))) }));
21
+ }
22
+ export function ListBoxHeader({ className, ...props }) {
23
+ return (_jsx(AriaHeader, { className: cn("py-1.5 pl-input pr-2 text-sm font-semibold", className), ...props }));
24
+ }
@@ -0,0 +1,5 @@
1
+ interface LoaderProps {
2
+ className?: string;
3
+ }
4
+ export declare function Loader({ className }: LoaderProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "lib/utils/primitives";
3
+ import { Loader2 } from "lucide-react";
4
+ export function Loader({ className }) {
5
+ return _jsx(Loader2, { className: cn(`animate-spin size-icon`, className) });
6
+ }
@@ -0,0 +1,25 @@
1
+ import { VariantProps } from "class-variance-authority";
2
+ import * as React from "react";
3
+ import { Header as AriaHeader, Keyboard as AriaKeyboard, MenuItemProps as AriaMenuItemProps, MenuProps as AriaMenuProps, MenuTrigger as AriaMenuTrigger, MenuTriggerProps as AriaMenuTriggerProps, SeparatorProps as AriaSeparatorProps, PopoverProps } from "react-aria-components";
4
+ import { buttonVariants } from "./button";
5
+ export declare const MenuTrigger: typeof AriaMenuTrigger;
6
+ export declare const MenuSubTrigger: (props: import("react-aria-components").SubmenuTriggerProps & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null;
7
+ export declare const MenuCollection: typeof import("react-aria-components").Collection;
8
+ export declare function MenuPopover({ className, ...props }: PopoverProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function Menu<T extends object>({ className, ...props }: AriaMenuProps<T>): import("react/jsx-runtime").JSX.Element;
10
+ export declare function MenuItem({ children, className, ...props }: AriaMenuItemProps & {
11
+ ref?: React.Ref<HTMLDivElement>;
12
+ }): import("react/jsx-runtime").JSX.Element;
13
+ interface MenuHeaderProps extends React.ComponentProps<typeof AriaHeader> {
14
+ inset?: boolean;
15
+ separator?: boolean;
16
+ }
17
+ export declare function MenuHeader({ className, inset, separator, ...props }: MenuHeaderProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function MenuSeparator({ className, ...props }: AriaSeparatorProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function MenuKeyboard({ className, ...props }: React.ComponentProps<typeof AriaKeyboard>): import("react/jsx-runtime").JSX.Element;
20
+ interface MenuProps<T> extends AriaMenuProps<T>, VariantProps<typeof buttonVariants>, Omit<AriaMenuTriggerProps, "children"> {
21
+ label?: React.ReactNode;
22
+ isDisabled?: boolean;
23
+ }
24
+ export declare function EasyMenu<T extends object>({ label, children, variant, isDisabled, size, ...props }: MenuProps<T>): import("react/jsx-runtime").JSX.Element;
25
+ export {};
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Header as AriaHeader, Keyboard as AriaKeyboard, Menu as AriaMenu, MenuItem as AriaMenuItem, MenuTrigger as AriaMenuTrigger, Separator as AriaSeparator, SubmenuTrigger as AriaSubmenuTrigger, composeRenderProps, } from "react-aria-components";
3
+ import { cn } from "lib/utils/primitives";
4
+ import { Check, ChevronRight, Dot } from "lucide-react";
5
+ import { SelectPopover } from "../inputs/select";
6
+ import { Button } from "./button";
7
+ import { ListBoxCollection } from "./list-box";
8
+ export const MenuTrigger = AriaMenuTrigger;
9
+ export const MenuSubTrigger = AriaSubmenuTrigger;
10
+ export const MenuCollection = ListBoxCollection;
11
+ export function MenuPopover({ className, ...props }) {
12
+ return (_jsx(SelectPopover, { className: composeRenderProps(className, (className) => cn(className)), ...props }));
13
+ }
14
+ export function Menu({ className, ...props }) {
15
+ return (_jsx(AriaMenu, { className: cn("overflow-auto p-1 outline-0 [clip-path:inset(0_0_0_0_round_calc(var(--radius)-2px))]", className), escapeKeyBehavior: "none", ...props }));
16
+ }
17
+ export function MenuItem({ children, className, ...props }) {
18
+ return (_jsx(AriaMenuItem, { textValue: props.textValue || (typeof children === "string" ? children : undefined), className: composeRenderProps(className, (className) => cn("relative flex cursor-default select-none items-center gap-2 px-2 py-1.5 text-sm outline-none transition-colors",
19
+ /* Disabled */
20
+ "disabled-muted",
21
+ /* Focused */
22
+ "data-[focused]:bg-accent data-[focused]:text-accent-foreground ",
23
+ /* Selection Mode */
24
+ "data-[selection-mode]:pl-input", className)), ...props, children: composeRenderProps(children, (children, renderProps) => (_jsxs(_Fragment, { children: [_jsx("span", { className: "absolute left-2 flex size-icon items-center justify-center", children: renderProps.isSelected && (_jsxs(_Fragment, { children: [renderProps.selectionMode == "single" && (_jsx(Dot, { className: "size-icon fill-current" })), renderProps.selectionMode == "multiple" && (_jsx(Check, { className: "size-icon" }))] })) }), children, renderProps.hasSubmenu && _jsx(ChevronRight, { className: "ml-auto size-icon" })] }))) }));
25
+ }
26
+ export function MenuHeader({ className, inset, separator = true, ...props }) {
27
+ return (_jsx(AriaHeader, { className: cn("px-3 py-1.5 text-sm font-semibold", inset && "pl-input", separator && "-mx-1 mb-1 border-b border-b-border pb-2.5", className), ...props }));
28
+ }
29
+ export function MenuSeparator({ className, ...props }) {
30
+ return (_jsx(AriaSeparator, { className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
31
+ }
32
+ export function MenuKeyboard({ className, ...props }) {
33
+ return (_jsx(AriaKeyboard, { className: cn("ml-auto text-xs tracking-widest opacity-60", className), ...props }));
34
+ }
35
+ // TODO name this better
36
+ export function EasyMenu({ label, children, variant, isDisabled, size, ...props }) {
37
+ return (_jsxs(MenuTrigger, { ...props, children: [_jsx(Button, { isDisabled: isDisabled, type: "button", variant: variant, size: size, children: label }), _jsx(MenuPopover, { className: "overflow-auto", children: _jsx(Menu, { ...props, children: children }) })] }));
38
+ }
@@ -0,0 +1,4 @@
1
+ import { DialogProps as AriaDialogProps, DialogTrigger as AriaDialogTrigger, PopoverProps as AriaPopoverProps } from "react-aria-components";
2
+ export declare const PopoverTrigger: typeof AriaDialogTrigger;
3
+ export declare const Popover: ({ className, offset, ...props }: AriaPopoverProps) => import("react/jsx-runtime").JSX.Element;
4
+ export declare function PopoverDialog({ className, ...props }: AriaDialogProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover, composeRenderProps, } from "react-aria-components";
3
+ import { cn } from "lib/utils/primitives";
4
+ export const PopoverTrigger = AriaDialogTrigger;
5
+ export const Popover = ({ className, offset = 4, ...props }) => (_jsx(AriaPopover, { offset: offset, className: composeRenderProps(className, (className) => cn("z-50 border bg-popover text-popover-foreground outline-none max-w-lg",
6
+ /* Entering */
7
+ "data-[entering]:animate-in data-[entering]:fade-in-0 data-[entering]:zoom-in-95",
8
+ /* Exiting */
9
+ "data-[exiting]:animate-out data-[exiting]:fade-out-0 data-[exiting]:zoom-out-95",
10
+ /* Placement */
11
+ "data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2", className)), ...props }));
12
+ export function PopoverDialog({ className, ...props }) {
13
+ return (_jsx(AriaDialog, { className: cn("p-icon outline-0", className), ...props }));
14
+ }
@@ -0,0 +1,53 @@
1
+ import * as React from "react";
2
+ import { Button } from "lib/components/ui/button";
3
+ import { Tooltip } from "lib/components/ui/tooltip";
4
+ type SidebarContextProps = {
5
+ state: "expanded" | "collapsed";
6
+ open: boolean;
7
+ setOpen: (open: boolean) => void;
8
+ openMobile: boolean;
9
+ setOpenMobile: (open: boolean) => void;
10
+ isMobile: boolean;
11
+ toggleSidebar: () => void;
12
+ };
13
+ export declare const SidebarContext: React.Context<SidebarContextProps | null>;
14
+ export declare function useSidebar(): SidebarContextProps;
15
+ export declare function SidebarProvider({ defaultOpen, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<'div'> & {
16
+ defaultOpen?: boolean;
17
+ open?: boolean;
18
+ onOpenChange?: (open: boolean) => void;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ export declare function Sidebar({ side, variant, collapsible, className, children, ...props }: React.ComponentProps<"div"> & {
21
+ side?: "left" | "right";
22
+ variant?: "sidebar" | "floating" | "inset";
23
+ collapsible?: "offcanvas" | "icon" | "none";
24
+ }): import("react/jsx-runtime").JSX.Element;
25
+ export declare function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>): import("react/jsx-runtime").JSX.Element;
26
+ export declare const SidebarRail: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
27
+ export declare function SidebarInset({ className, ...props }: React.ComponentProps<'main'>): import("react/jsx-runtime").JSX.Element;
28
+ export declare function SidebarHeader({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
29
+ export declare function SidebarFooter({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
30
+ export declare function SidebarContent({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
31
+ export declare function SidebarGroup({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
32
+ export declare function SidebarGroupLabel({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
33
+ export declare function SidebarGroupAction({ className, ...props }: React.ComponentProps<"button">): import("react/jsx-runtime").JSX.Element;
34
+ export declare function SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
35
+ export declare function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>): import("react/jsx-runtime").JSX.Element;
36
+ export declare function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>): import("react/jsx-runtime").JSX.Element;
37
+ export declare function SidebarMenuAction({ className, showOnHover, ...props }: React.ComponentProps<"button"> & {
38
+ showOnHover?: boolean;
39
+ }): import("react/jsx-runtime").JSX.Element;
40
+ export declare function SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
41
+ export declare function SidebarMenuSkeleton({ className, showIcon, ...props }: React.ComponentProps<"div"> & {
42
+ showIcon?: boolean;
43
+ }): import("react/jsx-runtime").JSX.Element;
44
+ export declare function SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>): import("react/jsx-runtime").JSX.Element;
45
+ export declare function SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>): import("react/jsx-runtime").JSX.Element;
46
+ export declare function SidebarMenuButton({ isActive, tooltip, className, ...props }: React.ComponentProps<"button"> & {
47
+ isActive?: boolean;
48
+ tooltip?: React.ComponentProps<typeof Tooltip>;
49
+ }): import("react/jsx-runtime").JSX.Element;
50
+ export declare function SidebarMenuSubButton({ isActive, className, ...props }: React.ComponentProps<'a'> & {
51
+ isActive?: boolean;
52
+ }): import("react/jsx-runtime").JSX.Element;
53
+ export {};
@@ -0,0 +1,177 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { PanelLeftClose, PanelLeftOpen } from "lucide-react";
4
+ import * as React from "react";
5
+ import { Button } from "lib/components/ui/button";
6
+ import { DialogContent, DialogOverlay, DialogTrigger } from "lib/components/ui/dialog";
7
+ import { Skeleton } from "lib/components/ui/skeleton";
8
+ import { Tooltip, TooltipTrigger } from "lib/components/ui/tooltip";
9
+ import { cn } from "lib/utils/primitives";
10
+ import { useIsMobile } from "lib/utils/use-mobile";
11
+ // TODO use tailwind variables
12
+ const SIDEBAR_WIDTH = "16rem";
13
+ const SIDEBAR_WIDTH_MOBILE = "18rem";
14
+ const SIDEBAR_WIDTH_ICON = "3rem";
15
+ const SIDEBAR_KEYBOARD_SHORTCUT = "b";
16
+ export const SidebarContext = React.createContext(null);
17
+ export function useSidebar() {
18
+ const context = React.useContext(SidebarContext);
19
+ if (!context) {
20
+ throw new Error("useSidebar must be used within a SidebarProvider.");
21
+ }
22
+ return context;
23
+ }
24
+ export function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
25
+ const isMobile = useIsMobile();
26
+ const [openMobile, setOpenMobile] = React.useState(false);
27
+ // This is the internal state of the sidebar.
28
+ // We use openProp and setOpenProp for control from outside the component.
29
+ const [_open, _setOpen] = React.useState(defaultOpen);
30
+ const open = openProp ?? _open;
31
+ const setOpen = React.useCallback((value) => {
32
+ const openState = typeof value === "function" ? value(open) : value;
33
+ if (setOpenProp) {
34
+ setOpenProp(openState);
35
+ }
36
+ else {
37
+ _setOpen(openState);
38
+ }
39
+ // TODO, use different model for persistence
40
+ // This sets the cookie to keep the sidebar state.
41
+ // document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
42
+ }, [setOpenProp, open]);
43
+ // Helper to toggle the sidebar.
44
+ const toggleSidebar = React.useCallback(() => {
45
+ return isMobile
46
+ ? setOpenMobile((open) => !open)
47
+ : setOpen((open) => !open);
48
+ }, [isMobile, setOpen, setOpenMobile]);
49
+ // Adds a keyboard shortcut to toggle the sidebar.
50
+ React.useEffect(() => {
51
+ const handleKeyDown = (event) => {
52
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
53
+ (event.metaKey || event.ctrlKey)) {
54
+ event.preventDefault();
55
+ toggleSidebar();
56
+ }
57
+ };
58
+ window.addEventListener("keydown", handleKeyDown);
59
+ return () => window.removeEventListener("keydown", handleKeyDown);
60
+ }, [toggleSidebar]);
61
+ // We add a state so that we can do data-state="expanded" or "collapsed".
62
+ // This makes it easier to style the sidebar with Tailwind classes.
63
+ const state = open ? "expanded" : "collapsed";
64
+ const contextValue = React.useMemo(() => ({
65
+ state,
66
+ open,
67
+ setOpen,
68
+ isMobile,
69
+ openMobile,
70
+ setOpenMobile,
71
+ toggleSidebar,
72
+ }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]);
73
+ return (_jsx(SidebarContext.Provider, { value: contextValue, children: _jsx("div", { style: {
74
+ "--sidebar-width": SIDEBAR_WIDTH,
75
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
76
+ ...style,
77
+ }, className: cn("group/sidebar-wrapper flex w-full has-[[data-variant=inset]]:bg-sidebar-background", className), ...props, children: children }) }));
78
+ }
79
+ export function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }) {
80
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
81
+ if (collapsible === "none") {
82
+ return (_jsx("div", { className: cn("flex h-full w-[--sidebar-width] flex-col bg-sidebar-background text-sidebar-foreground", className), ...props, children: children }));
83
+ }
84
+ if (isMobile) {
85
+ return (_jsx(DialogTrigger, { style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE, }, isOpen: openMobile, onOpenChange: setOpenMobile, ...props, children: _jsx(DialogOverlay, { children: _jsx(DialogContent, { "data-sidebar": "sidebar", "data-mobile": "true", className: "w-[--sidebar-width] p-0 [&>button]:hidden", side: "right", children: () => (_jsx(_Fragment, { children: children })) }) }) }));
86
+ }
87
+ return (_jsxs("div", { className: "group peer hidden text-sidebar-foreground md:block", "data-state": state, "data-collapsible": state === "collapsed" ? collapsible : "", "data-variant": variant, "data-side": side, children: [_jsx("div", { className: cn("relative w-(--sidebar-width) bg-sidebar-background transition-[width] duration-200 ease-linear", "group-data-[collapsible=offcanvas]:w-0", "group-data-[side=right]:rotate-180", variant === "floating" || variant === "inset"
88
+ ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
89
+ : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]") }), _jsx("div", { className: cn("absolute z-10 hidden w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex", side === "left"
90
+ ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
91
+ : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
92
+ // Adjust the padding for floating and inset variants.
93
+ variant === "floating" || variant === "inset"
94
+ ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
95
+ : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l", className), ...props, children: _jsx("div", { "data-sidebar": "sidebar", className: "flex h-full w-full flex-col bg-sidebar-background group-data-[variant=floating]:border group-data-[variant=floating]:border-border group-data-[variant=floating]:shadow", children: children }) })] }));
96
+ }
97
+ export function SidebarTrigger({ className, onClick, ...props }) {
98
+ const { toggleSidebar, open } = useSidebar();
99
+ return (_jsx(Button, { "data-sidebar": "trigger", variant: "neutral", size: "icon", onClick: (event) => {
100
+ onClick?.(event);
101
+ toggleSidebar();
102
+ }, ...props, children: open ? _jsx(PanelLeftClose, {}) : _jsx(PanelLeftOpen, {}) }));
103
+ }
104
+ // TODO, evaluate if we need this??
105
+ export const SidebarRail = React.forwardRef(({ className, ...props }, ref) => {
106
+ const { toggleSidebar } = useSidebar();
107
+ return (_jsx("button", { ref: ref, "data-sidebar": "rail", "aria-label": "Toggle Sidebar", tabIndex: -1, onClick: toggleSidebar, title: "Toggle Sidebar", className: cn("absolute inset-y-0 z-20 hidden w-icon -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-border group-data-[side=left]:-right-icon group-data-[side=right]:left-0 sm:flex", "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar-background", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className), ...props }));
108
+ });
109
+ SidebarRail.displayName = "SidebarRail";
110
+ export function SidebarInset({ className, ...props }) {
111
+ return (_jsx("main", { className: cn("relative flex w-full flex-1 flex-col bg-background", "md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow", className), ...props }));
112
+ }
113
+ export function SidebarHeader({ className, ...props }) {
114
+ return (_jsx("div", { "data-sidebar": "header", className: cn("flex flex-col gap-2 p-2", className), ...props }));
115
+ }
116
+ export function SidebarFooter({ className, ...props }) {
117
+ return (_jsx("div", { "data-sidebar": "footer", className: cn("flex flex-col gap-2 p-2", className), ...props }));
118
+ }
119
+ export function SidebarContent({ className, ...props }) {
120
+ return (_jsx("div", { "data-sidebar": "content", className: cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className), ...props }));
121
+ }
122
+ export function SidebarGroup({ className, ...props }) {
123
+ return (_jsx("div", { "data-sidebar": "group", className: cn("relative flex w-full min-w-0 flex-col p-2", className), ...props }));
124
+ }
125
+ export function SidebarGroupLabel({ className, ...props }) {
126
+ return (_jsx("div", { "data-sidebar": "group-label", className: cn("flex h-input shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-icon [&>svg]:shrink-0", "group-data-[collapsible=icon]:-mt-input group-data-[collapsible=icon]:opacity-0", className), ...props }));
127
+ }
128
+ export function SidebarGroupAction({ className, ...props }) {
129
+ return (_jsx("button", { "data-sidebar": "group-action", className: cn("absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-ring transition-transform hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 [&>svg]:size-icon [&>svg]:shrink-0",
130
+ // Increases the hit area of the button on mobile.
131
+ "after:absolute after:-inset-2 after:md:hidden", "group-data-[collapsible=icon]:hidden", className), ...props }));
132
+ }
133
+ export function SidebarGroupContent({ className, ...props }) {
134
+ return (_jsx("div", { "data-sidebar": "group-content", className: cn("w-full text-sm", className), ...props }));
135
+ }
136
+ export function SidebarMenu({ className, ...props }) {
137
+ return (_jsx("ul", { "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-1", className), ...props }));
138
+ }
139
+ export function SidebarMenuItem({ className, ...props }) {
140
+ return (_jsx("li", { "data-sidebar": "menu-item", className: cn("group/menu-item relative list-none", className), ...props }));
141
+ }
142
+ /// TODO fix positioning
143
+ export function SidebarMenuAction({ className, showOnHover = false, ...props }) {
144
+ return (_jsx("button", { "data-sidebar": "menu-action", className: cn("absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-ring transition-transform hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-accent-foreground [&>svg]:size-icon [&>svg]:shrink-0",
145
+ // Increases the hit area of the button on mobile.
146
+ "after:absolute after:-inset-2 after:md:hidden", "peer-data-[size=sm]/menu-button:top-1", "peer-data-[size=default]/menu-button:top-1.5", "peer-data-[size=lg]/menu-button:top-2.5", "group-data-[collapsible=icon]:hidden", showOnHover &&
147
+ "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-accent-foreground md:opacity-0", className), ...props }));
148
+ }
149
+ export function SidebarMenuBadge({ className, ...props }) {
150
+ return (_jsx("div", { "data-sidebar": "menu-badge", className: cn("pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground", "peer-hover/menu-button:text-accent-foreground peer-data-[active=true]/menu-button:text-accent-foreground", "peer-data-[size=sm]/menu-button:top-1", "peer-data-[size=default]/menu-button:top-1.5", "peer-data-[size=lg]/menu-button:top-2.5", "group-data-[collapsible=icon]:hidden", className), ...props }));
151
+ }
152
+ export function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
153
+ // Random width between 50 to 90%.
154
+ const width = React.useMemo(() => {
155
+ return `${Math.floor(Math.random() * 40) + 50}%`;
156
+ }, []);
157
+ return (_jsxs("div", { "data-sidebar": "menu-skeleton", className: cn("flex h-input items-center gap-2 px-2", className), ...props, children: [showIcon && (_jsx(Skeleton, { className: "size-icon", "data-sidebar": "menu-skeleton-icon" })), _jsx(Skeleton, { className: "h-icon max-w-[--skeleton-width] flex-1", "data-sidebar": "menu-skeleton-text", style: {
158
+ "--skeleton-width": width,
159
+ } })] }));
160
+ }
161
+ export function SidebarMenuSub({ className, ...props }) {
162
+ return (_jsx("ul", { "data-sidebar": "menu-sub", className: cn("mx-2 flex min-w-0 translate-x-px flex-col gap-1 border-l border-border px-2", "group-data-[collapsible=icon]:hidden", className), ...props }));
163
+ }
164
+ export function SidebarMenuSubItem({ className, ...props }) { return _jsx("li", { className: cn("list-none ms-0", className), ...props }); }
165
+ // Common interaction logic for SidebarMenuButton and SidebarMenuSubButton
166
+ const Cs_SidebarButton = "flex w-full items-center gap-2 truncate p-2 text-sm btn btn-ghost h-input text-accent data-[active=true]:bg-primary/20 data-[active=true]:font-medium data-[active=true]:text-primary [&>span:last-child]:truncate [&>svg]:size-icon [&>svg]:shrink-0";
167
+ export function SidebarMenuButton({ isActive = false, tooltip, className, ...props }) {
168
+ const { isMobile, state } = useSidebar();
169
+ const button = (_jsx("button", { "data-sidebar": "menu-button", "data-active": isActive, className: cn("peer/menu-button group-has-[[data-sidebar=menu-action]]/menu-item:pr-input group-data-[collapsible=icon]:!size-icon group-data-[collapsible=icon]:!p-2 ", Cs_SidebarButton, className), ...props }));
170
+ if (!tooltip) {
171
+ return button;
172
+ }
173
+ return (_jsxs(TooltipTrigger, { children: [button, _jsx(Tooltip, { hidden: state !== "collapsed" || isMobile, ...tooltip })] }));
174
+ }
175
+ export function SidebarMenuSubButton({ isActive, className, ...props }) {
176
+ return (_jsx("a", { "data-sidebar": "menu-sub-button", "data-active": isActive, className: cn("-translate-x-px [&>svg]:text-accent-foreground", "group-data-[collapsible=icon]:hidden", Cs_SidebarButton, className), ...props }));
177
+ }
@@ -0,0 +1 @@
1
+ export declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "lib/utils/primitives";
3
+ export function Skeleton({ className, ...props }) {
4
+ return (_jsx("div", { className: cn("animate-pulse bg-primary/10", className), ...props }));
5
+ }
@@ -0,0 +1,4 @@
1
+ import { Toaster as Sonner } from "sonner";
2
+ type ToasterProps = React.ComponentProps<typeof Sonner>;
3
+ export declare function Toaster({ ...props }: ToasterProps): import("react/jsx-runtime").JSX.Element;
4
+ export {};
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Toaster as Sonner } from "sonner";
4
+ export function Toaster({ ...props }) {
5
+ return (_jsx(Sonner, { className: "toaster group", toastOptions: {
6
+ classNames: {
7
+ toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
8
+ description: "group-[.toast]:text-muted-foreground",
9
+ actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
10
+ cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
11
+ },
12
+ }, ...props }));
13
+ }
14
+ ;