periplo-ui 3.6.1 → 3.7.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.
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +29 -3
- package/dist/components/Breadcrumb/Breadcrumb.js +87 -13
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/Breadcrumb/index.js +1 -1
- package/dist/components/Form/Form.d.ts +2 -1
- package/dist/components/Form/Form.js +14 -2
- package/dist/components/Form/Form.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.d.ts +61 -0
- package/dist/components/Sidebar/Sidebar.js +486 -0
- package/dist/components/Sidebar/Sidebar.js.map +1 -0
- package/dist/components/Sidebar/index.d.ts +1 -0
- package/dist/components/Sidebar/index.js +2 -0
- package/dist/components/Sidebar/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/plugin.js +17 -0
- package/dist/lib/plugin.js.map +1 -1
- package/dist/lib/useMobile.d.ts +1 -0
- package/dist/lib/useMobile.js +19 -0
- package/dist/lib/useMobile.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
* Root container for the breadcrumb navigation.
|
|
4
4
|
* Provides the overall context and ARIA labeling.
|
|
5
5
|
*/
|
|
6
|
-
declare const
|
|
6
|
+
declare const BreadcrumbRoot: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & {
|
|
7
7
|
/** Custom separator element to use between breadcrumb items */
|
|
8
8
|
separator?: React.ReactNode;
|
|
9
9
|
} & React.RefAttributes<HTMLElement>>;
|
|
@@ -17,6 +17,8 @@ declare const BreadcrumbList: React.ForwardRefExoticComponent<Omit<React.Detaile
|
|
|
17
17
|
* Wraps a link or the current page indicator.
|
|
18
18
|
*/
|
|
19
19
|
declare const BreadcrumbItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & React.RefAttributes<HTMLLIElement>>;
|
|
20
|
+
/** Text transform options for breadcrumb links */
|
|
21
|
+
type TextTransformOption = 'capitalize' | 'capitalize-first' | 'uppercase' | 'none';
|
|
20
22
|
/**
|
|
21
23
|
* Interactive link element for breadcrumb navigation.
|
|
22
24
|
* Can be rendered as a custom element using asChild.
|
|
@@ -24,12 +26,16 @@ declare const BreadcrumbItem: React.ForwardRefExoticComponent<Omit<React.Detaile
|
|
|
24
26
|
declare const BreadcrumbLink: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref"> & {
|
|
25
27
|
/** When true, the component will render its children directly instead of wrapping them in an anchor tag */
|
|
26
28
|
asChild?: boolean;
|
|
29
|
+
/** The text transformation to apply to the link text */
|
|
30
|
+
textTransform?: TextTransformOption;
|
|
27
31
|
} & React.RefAttributes<HTMLAnchorElement>>;
|
|
28
32
|
/**
|
|
29
33
|
* Current page indicator in the breadcrumb.
|
|
30
34
|
* Non-interactive element showing the current location.
|
|
31
35
|
*/
|
|
32
|
-
declare const BreadcrumbPage: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> &
|
|
36
|
+
declare const BreadcrumbPage: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
|
|
37
|
+
textTransform?: TextTransformOption;
|
|
38
|
+
} & React.RefAttributes<HTMLSpanElement>>;
|
|
33
39
|
/**
|
|
34
40
|
* Separator element between breadcrumb items.
|
|
35
41
|
* Can be customized with different icons or characters.
|
|
@@ -46,4 +52,24 @@ declare const BreadcrumbEllipsis: {
|
|
|
46
52
|
({ className, ...props }: React.ComponentProps<"span">): import("react/jsx-runtime").JSX.Element;
|
|
47
53
|
displayName: string;
|
|
48
54
|
};
|
|
49
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Navigation breadcrumb component.
|
|
57
|
+
* Displays a breadcrumb navigation for the current path.
|
|
58
|
+
* @param pathname - The current pathname
|
|
59
|
+
* @param pathMappings - Optional object containing custom path mappings
|
|
60
|
+
* @param t - Optional translation function
|
|
61
|
+
*/
|
|
62
|
+
declare const NavigationBreadcrumb: ({ pathname, pathMappings, t, textTransform, }: {
|
|
63
|
+
pathname: string;
|
|
64
|
+
pathMappings?: Record<string, string>;
|
|
65
|
+
t?: (key: string) => string;
|
|
66
|
+
textTransform?: TextTransformOption;
|
|
67
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
68
|
+
declare const PagesBreadcrumb: ({ pages, currentPage }: {
|
|
69
|
+
pages: {
|
|
70
|
+
link: string;
|
|
71
|
+
text: string;
|
|
72
|
+
}[];
|
|
73
|
+
currentPage: string;
|
|
74
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
export { BreadcrumbRoot, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, NavigationBreadcrumb, PagesBreadcrumb, };
|
|
@@ -5,8 +5,8 @@ import * as React from 'react';
|
|
|
5
5
|
import { Typography } from '../Typography/Typography.js';
|
|
6
6
|
import { cn } from '../../lib/utils.js';
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const BreadcrumbRoot = React.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx("nav", { ref, "aria-label": "breadcrumb", ...props }));
|
|
9
|
+
BreadcrumbRoot.displayName = "BreadcrumbRoot";
|
|
10
10
|
const BreadcrumbList = React.forwardRef(
|
|
11
11
|
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
12
12
|
"ol",
|
|
@@ -25,30 +25,54 @@ const BreadcrumbItem = React.forwardRef(
|
|
|
25
25
|
({ className, ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
|
|
26
26
|
);
|
|
27
27
|
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
28
|
-
const
|
|
28
|
+
const getTextTransformClass = (transform) => {
|
|
29
|
+
switch (transform) {
|
|
30
|
+
case "capitalize-first":
|
|
31
|
+
return "[&]:has-[::first-letter]:uppercase";
|
|
32
|
+
case "capitalize":
|
|
33
|
+
return "capitalize";
|
|
34
|
+
case "uppercase":
|
|
35
|
+
return "uppercase";
|
|
36
|
+
default:
|
|
37
|
+
return "";
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const BreadcrumbLink = React.forwardRef(({ asChild, className, textTransform = "capitalize-first", children, ...props }, ref) => {
|
|
29
41
|
const Comp = asChild ? Slot : "a";
|
|
30
|
-
|
|
42
|
+
const content = textTransform === "capitalize-first" && typeof children === "string" ? children.charAt(0).toUpperCase() + children.slice(1) : children;
|
|
43
|
+
return /* @__PURE__ */ jsx(Typography, { variant: "title-sm", weight: "medium", children: /* @__PURE__ */ jsx(
|
|
31
44
|
Comp,
|
|
32
45
|
{
|
|
33
46
|
ref,
|
|
34
|
-
className: cn(
|
|
35
|
-
|
|
47
|
+
className: cn(
|
|
48
|
+
"text-neutral-500 transition-colors hover:text-neutral-950",
|
|
49
|
+
textTransform !== "capitalize-first" && getTextTransformClass(textTransform),
|
|
50
|
+
className
|
|
51
|
+
),
|
|
52
|
+
...props,
|
|
53
|
+
children: content
|
|
36
54
|
}
|
|
37
55
|
) });
|
|
38
56
|
});
|
|
39
57
|
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
40
|
-
const BreadcrumbPage = React.forwardRef(
|
|
41
|
-
|
|
58
|
+
const BreadcrumbPage = React.forwardRef(({ className, textTransform = "capitalize-first", children, ...props }, ref) => {
|
|
59
|
+
const content = textTransform === "capitalize-first" && typeof children === "string" ? children.charAt(0).toUpperCase() + children.slice(1) : children;
|
|
60
|
+
return /* @__PURE__ */ jsx(Typography, { variant: "title-sm", children: /* @__PURE__ */ jsx(
|
|
42
61
|
"span",
|
|
43
62
|
{
|
|
44
63
|
ref,
|
|
45
64
|
"aria-disabled": "true",
|
|
46
65
|
"aria-current": "page",
|
|
47
|
-
className: cn(
|
|
48
|
-
|
|
66
|
+
className: cn(
|
|
67
|
+
"font-medium text-neutral-950",
|
|
68
|
+
textTransform !== "capitalize-first" && getTextTransformClass(textTransform),
|
|
69
|
+
className
|
|
70
|
+
),
|
|
71
|
+
...props,
|
|
72
|
+
children: content
|
|
49
73
|
}
|
|
50
|
-
) })
|
|
51
|
-
);
|
|
74
|
+
) });
|
|
75
|
+
});
|
|
52
76
|
BreadcrumbPage.displayName = "BreadcrumbPage";
|
|
53
77
|
const BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("text-neutral-500 [&>svg]:size-3.5", className), ...props, children: children ?? /* @__PURE__ */ jsx(CaretRight, {}) });
|
|
54
78
|
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
@@ -57,6 +81,56 @@ const BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs("sp
|
|
|
57
81
|
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "More" })
|
|
58
82
|
] });
|
|
59
83
|
BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
|
|
84
|
+
const sanitizeRoute = (route) => {
|
|
85
|
+
return route.replace(/-/g, " ");
|
|
86
|
+
};
|
|
87
|
+
const routeToTranslationKey = (route) => {
|
|
88
|
+
return route.split("-").map((word, index) => index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)).join("");
|
|
89
|
+
};
|
|
90
|
+
const getRoutes = (pathname, pathMappings, t) => {
|
|
91
|
+
const baseRoutes = pathname.split("/").filter(Boolean);
|
|
92
|
+
const routes = baseRoutes.map((route, index) => {
|
|
93
|
+
let displayName = route;
|
|
94
|
+
if (pathMappings && pathMappings[route]) {
|
|
95
|
+
displayName = pathMappings[route];
|
|
96
|
+
} else if (t) {
|
|
97
|
+
const translationKey = routeToTranslationKey(route);
|
|
98
|
+
displayName = t(translationKey);
|
|
99
|
+
} else {
|
|
100
|
+
displayName = sanitizeRoute(route);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
name: displayName,
|
|
104
|
+
href: `/${baseRoutes.slice(0, index + 1).join("/")}`
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
const homeKey = "home";
|
|
108
|
+
routes.unshift({
|
|
109
|
+
name: pathMappings?.[homeKey] || t?.(homeKey) || "Home",
|
|
110
|
+
href: "/"
|
|
111
|
+
});
|
|
112
|
+
return routes;
|
|
113
|
+
};
|
|
114
|
+
const NavigationBreadcrumb = ({
|
|
115
|
+
pathname,
|
|
116
|
+
pathMappings,
|
|
117
|
+
t,
|
|
118
|
+
textTransform
|
|
119
|
+
}) => {
|
|
120
|
+
return /* @__PURE__ */ jsx(BreadcrumbRoot, { children: /* @__PURE__ */ jsx(BreadcrumbList, { children: getRoutes(pathname, pathMappings, t).map((route, index, array) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
121
|
+
/* @__PURE__ */ jsx(BreadcrumbItem, { children: index === array.length - 1 ? /* @__PURE__ */ jsx(BreadcrumbPage, { textTransform, children: route.name }) : /* @__PURE__ */ jsx(BreadcrumbLink, { href: route.href, textTransform, children: route.name }) }),
|
|
122
|
+
index < array.length - 1 && /* @__PURE__ */ jsx(BreadcrumbSeparator, {})
|
|
123
|
+
] }, index)) }) });
|
|
124
|
+
};
|
|
125
|
+
const PagesBreadcrumb = ({ pages, currentPage }) => {
|
|
126
|
+
return /* @__PURE__ */ jsx(BreadcrumbRoot, { children: /* @__PURE__ */ jsxs(BreadcrumbList, { children: [
|
|
127
|
+
pages.map((page) => /* @__PURE__ */ jsxs(BreadcrumbItem, { children: [
|
|
128
|
+
/* @__PURE__ */ jsx(BreadcrumbLink, { href: page.link, children: page.text }),
|
|
129
|
+
/* @__PURE__ */ jsx(BreadcrumbSeparator, {})
|
|
130
|
+
] }, pages.indexOf(page))),
|
|
131
|
+
/* @__PURE__ */ jsx(BreadcrumbItem, { children: /* @__PURE__ */ jsx(BreadcrumbPage, { children: currentPage }) })
|
|
132
|
+
] }) });
|
|
133
|
+
};
|
|
60
134
|
|
|
61
|
-
export {
|
|
135
|
+
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbRoot, BreadcrumbSeparator, NavigationBreadcrumb, PagesBreadcrumb };
|
|
62
136
|
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumb.js","sources":["../../../src/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import { CaretRight, DotsThree } from '@phosphor-icons/react'\nimport { Slot } from '@radix-ui/react-slot'\nimport * as React from 'react'\nimport { Typography } from '../Typography'\nimport { cn } from '@/lib/utils'\n\n/**\n * Root container for the breadcrumb navigation.\n * Provides the overall context and ARIA labeling.\n */\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<'nav'> & {\n /** Custom separator element to use between breadcrumb items */\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumb.displayName = 'Breadcrumb'\n\n/**\n * Container for breadcrumb items.\n * Handles layout and spacing of the breadcrumb navigation.\n */\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n 'text-muted-foreground flex flex-wrap items-center gap-1.5 break-words text-sm sm:gap-2.5',\n className,\n )}\n {...props}\n />\n ),\n)\nBreadcrumbList.displayName = 'BreadcrumbList'\n\n/**\n * Individual breadcrumb item container.\n * Wraps a link or the current page indicator.\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li ref={ref} className={cn('inline-flex items-center gap-1.5', className)} {...props} />\n ),\n)\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\n/**\n * Interactive link element for breadcrumb navigation.\n * Can be rendered as a custom element using asChild.\n */\nconst BreadcrumbLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<'a'> & {\n /** When true, the component will render its children directly instead of wrapping them in an anchor tag */\n asChild?: boolean\n }\n>(({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n return (\n <Typography variant=\"title-sm\">\n <Comp\n ref={ref}\n className={cn('text-neutral-500 transition-colors hover:text-neutral-950', className)}\n {...props}\n />\n </Typography>\n )\n})\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\n/**\n * Current page indicator in the breadcrumb.\n * Non-interactive element showing the current location.\n */\nconst BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<'span'>>(\n ({ className, ...props }, ref) => (\n <Typography variant=\"title-sm\">\n <span\n ref={ref}\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('font-medium text-neutral-950', className)}\n {...props}\n />\n </Typography>\n ),\n)\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\n/**\n * Separator element between breadcrumb items.\n * Can be customized with different icons or characters.\n */\nconst BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden=\"true\" className={cn('text-neutral-500 [&>svg]:size-3.5', className)} {...props}>\n {children ?? <CaretRight />}\n </span>\n)\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\n/**\n * Ellipsis indicator for truncated breadcrumb paths.\n * Used to show that there are hidden items in the path.\n */\nconst BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden=\"true\" className={cn('flex h-9 w-9 items-center justify-center', className)} {...props}>\n <DotsThree className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sources":["../../../src/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import { CaretRight, DotsThree } from '@phosphor-icons/react'\nimport { Slot } from '@radix-ui/react-slot'\nimport * as React from 'react'\nimport { Typography } from '../Typography'\nimport { cn } from '@/lib/utils'\n\n/**\n * Root container for the breadcrumb navigation.\n * Provides the overall context and ARIA labeling.\n */\nconst BreadcrumbRoot = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<'nav'> & {\n /** Custom separator element to use between breadcrumb items */\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumbRoot.displayName = 'BreadcrumbRoot'\n\n/**\n * Container for breadcrumb items.\n * Handles layout and spacing of the breadcrumb navigation.\n */\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n 'text-muted-foreground flex flex-wrap items-center gap-1.5 break-words text-sm sm:gap-2.5',\n className,\n )}\n {...props}\n />\n ),\n)\nBreadcrumbList.displayName = 'BreadcrumbList'\n\n/**\n * Individual breadcrumb item container.\n * Wraps a link or the current page indicator.\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li ref={ref} className={cn('inline-flex items-center gap-1.5', className)} {...props} />\n ),\n)\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\n/** Text transform options for breadcrumb links */\ntype TextTransformOption = 'capitalize' | 'capitalize-first' | 'uppercase' | 'none'\n\n/** Get class names for text transform styling */\nconst getTextTransformClass = (transform: TextTransformOption): string => {\n switch (transform) {\n case 'capitalize-first':\n return '[&]:has-[::first-letter]:uppercase'\n case 'capitalize':\n return 'capitalize'\n case 'uppercase':\n return 'uppercase'\n default:\n return ''\n }\n}\n\n/**\n * Interactive link element for breadcrumb navigation.\n * Can be rendered as a custom element using asChild.\n */\nconst BreadcrumbLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<'a'> & {\n /** When true, the component will render its children directly instead of wrapping them in an anchor tag */\n asChild?: boolean\n /** The text transformation to apply to the link text */\n textTransform?: TextTransformOption\n }\n>(({ asChild, className, textTransform = 'capitalize-first', children, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n // Simplify the capitalization logic using a direct string transformation\n const content =\n textTransform === 'capitalize-first' && typeof children === 'string'\n ? children.charAt(0).toUpperCase() + children.slice(1)\n : children\n\n return (\n <Typography variant=\"title-sm\" weight={'medium'}>\n <Comp\n ref={ref}\n className={cn(\n 'text-neutral-500 transition-colors hover:text-neutral-950',\n textTransform !== 'capitalize-first' && getTextTransformClass(textTransform),\n className,\n )}\n {...props}\n >\n {content}\n </Comp>\n </Typography>\n )\n})\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\n/**\n * Current page indicator in the breadcrumb.\n * Non-interactive element showing the current location.\n */\nconst BreadcrumbPage = React.forwardRef<\n HTMLSpanElement,\n React.ComponentPropsWithoutRef<'span'> & {\n textTransform?: TextTransformOption\n }\n>(({ className, textTransform = 'capitalize-first', children, ...props }, ref) => {\n const content =\n textTransform === 'capitalize-first' && typeof children === 'string'\n ? children.charAt(0).toUpperCase() + children.slice(1)\n : children\n\n return (\n <Typography variant=\"title-sm\">\n <span\n ref={ref}\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\n 'font-medium text-neutral-950',\n textTransform !== 'capitalize-first' && getTextTransformClass(textTransform),\n className,\n )}\n {...props}\n >\n {content}\n </span>\n </Typography>\n )\n})\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\n/**\n * Separator element between breadcrumb items.\n * Can be customized with different icons or characters.\n */\nconst BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden=\"true\" className={cn('text-neutral-500 [&>svg]:size-3.5', className)} {...props}>\n {children ?? <CaretRight />}\n </span>\n)\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\n/**\n * Ellipsis indicator for truncated breadcrumb paths.\n * Used to show that there are hidden items in the path.\n */\nconst BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden=\"true\" className={cn('flex h-9 w-9 items-center justify-center', className)} {...props}>\n <DotsThree className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\n/**\n * Sanitizes a route string by replacing hyphens with spaces.\n * @param route - The route string to sanitize.\n * @returns The sanitized route string.\n */\nconst sanitizeRoute = (route: string) => {\n return route.replace(/-/g, ' ')\n}\n\n/**\n * Transforms a kebab-case route to a camelCase translation key\n * @param route - The route segment in kebab-case\n * @returns The translation key in camelCase\n */\nconst routeToTranslationKey = (route: string): string => {\n return route\n .split('-')\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\n .join('')\n}\n\n/**\n * Gets the routes for the breadcrumb navigation.\n * @param pathname - The current pathname.\n * @param pathMappings - Optional object containing custom path mappings.\n * @param t - Optional translation function.\n * @returns The routes for the breadcrumb navigation.\n */\nconst getRoutes = (pathname: string, pathMappings?: Record<string, string>, t?: (key: string) => string) => {\n const baseRoutes = pathname.split('/').filter(Boolean)\n\n const routes = baseRoutes.map((route, index) => {\n let displayName = route\n\n // Check if there's a custom mapping for this route\n if (pathMappings && pathMappings[route]) {\n displayName = pathMappings[route]\n }\n // If there's a translation function, convert route to translation key\n else if (t) {\n const translationKey = routeToTranslationKey(route)\n displayName = t(translationKey)\n }\n // If no mapping or translation function, sanitize the route\n else {\n displayName = sanitizeRoute(route)\n }\n\n return {\n name: displayName,\n href: `/${baseRoutes.slice(0, index + 1).join('/')}`,\n }\n })\n\n // Handle home translation\n const homeKey = 'home'\n routes.unshift({\n name: pathMappings?.[homeKey] || t?.(homeKey) || 'Home',\n href: '/',\n })\n\n return routes\n}\n\n/**\n * Navigation breadcrumb component.\n * Displays a breadcrumb navigation for the current path.\n * @param pathname - The current pathname\n * @param pathMappings - Optional object containing custom path mappings\n * @param t - Optional translation function\n */\nconst NavigationBreadcrumb = ({\n pathname,\n pathMappings,\n t,\n textTransform,\n}: {\n pathname: string\n pathMappings?: Record<string, string>\n t?: (key: string) => string\n textTransform?: TextTransformOption\n}) => {\n return (\n <BreadcrumbRoot>\n <BreadcrumbList>\n {getRoutes(pathname, pathMappings, t).map((route, index, array) => (\n <React.Fragment key={index}>\n <BreadcrumbItem>\n {index === array.length - 1 ? (\n <BreadcrumbPage textTransform={textTransform}>{route.name}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink href={route.href} textTransform={textTransform}>\n {route.name}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {index < array.length - 1 && <BreadcrumbSeparator />}\n </React.Fragment>\n ))}\n </BreadcrumbList>\n </BreadcrumbRoot>\n )\n}\n\nconst PagesBreadcrumb = ({ pages, currentPage }: { pages: { link: string; text: string }[]; currentPage: string }) => {\n return (\n <BreadcrumbRoot>\n <BreadcrumbList>\n {pages.map((page) => (\n <BreadcrumbItem key={pages.indexOf(page)}>\n <BreadcrumbLink href={page.link}>{page.text}</BreadcrumbLink>\n <BreadcrumbSeparator />\n </BreadcrumbItem>\n ))}\n <BreadcrumbItem>\n <BreadcrumbPage>{currentPage}</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </BreadcrumbRoot>\n )\n}\n\nexport {\n BreadcrumbRoot,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n NavigationBreadcrumb,\n PagesBreadcrumb,\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbRoot, BreadcrumbSeparator, NavigationBreadcrumb, PagesBreadcrumb } from './Breadcrumb.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ControllerProps, FieldPath, FieldValues } from 'react-hook-form';
|
|
2
|
+
import { TypographyProps } from '../Typography';
|
|
2
3
|
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
3
4
|
import * as React from 'react';
|
|
4
5
|
declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues extends FieldValues | undefined = undefined>(props: import('react-hook-form').FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
|
|
@@ -19,5 +20,5 @@ declare const FormItem: React.ForwardRefExoticComponent<React.HTMLAttributes<HTM
|
|
|
19
20
|
declare const FormLabel: React.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & React.RefAttributes<HTMLLabelElement>>;
|
|
20
21
|
declare const FormControl: React.ForwardRefExoticComponent<Omit<import('@radix-ui/react-slot').SlotProps & React.RefAttributes<HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
21
22
|
declare const FormDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
22
|
-
declare const FormMessage: React.ForwardRefExoticComponent<
|
|
23
|
+
declare const FormMessage: React.ForwardRefExoticComponent<TypographyProps & React.RefAttributes<HTMLParagraphElement>>;
|
|
23
24
|
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField };
|
|
@@ -5,6 +5,7 @@ import * as React from 'react';
|
|
|
5
5
|
import { FormProvider, Controller, useFormContext } from 'react-hook-form';
|
|
6
6
|
import { Label } from '../Label/Label.js';
|
|
7
7
|
import { cn } from '../../lib/utils.js';
|
|
8
|
+
import { Typography } from '../Typography/Typography.js';
|
|
8
9
|
|
|
9
10
|
const Form = FormProvider;
|
|
10
11
|
const FormFieldContext = React.createContext({});
|
|
@@ -67,13 +68,24 @@ const FormDescription = React.forwardRef(
|
|
|
67
68
|
);
|
|
68
69
|
FormDescription.displayName = "FormDescription";
|
|
69
70
|
const FormMessage = React.forwardRef(
|
|
70
|
-
({ className, children, ...props }, ref) => {
|
|
71
|
+
({ className = "", children, ...props }, ref) => {
|
|
71
72
|
const { error, formMessageId } = useFormField();
|
|
72
73
|
const body = error ? String(error.message) : children;
|
|
73
74
|
if (!body) {
|
|
74
75
|
return null;
|
|
75
76
|
}
|
|
76
|
-
return /* @__PURE__ */ jsx(
|
|
77
|
+
return /* @__PURE__ */ jsx(
|
|
78
|
+
Typography,
|
|
79
|
+
{
|
|
80
|
+
ref,
|
|
81
|
+
component: "p",
|
|
82
|
+
className: cn("flex items-center gap-2", error ? "text-error" : "text-neutral-500", className),
|
|
83
|
+
variant: "body-md",
|
|
84
|
+
id: formMessageId,
|
|
85
|
+
...props,
|
|
86
|
+
children: body
|
|
87
|
+
}
|
|
88
|
+
);
|
|
77
89
|
}
|
|
78
90
|
);
|
|
79
91
|
FormMessage.displayName = "FormMessage";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.js","sources":["../../../src/components/Form/Form.tsx"],"sourcesContent":["'use client'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { Slot } from '@radix-ui/react-slot'\nimport * as React from 'react'\nimport { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext } from 'react-hook-form'\n\nimport { Label } from '../Label/Label'\n\nimport { cn } from '@/lib/utils'\n\nconst Form = FormProvider\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue)\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n const contextValue = React.useMemo(() => ({ name: props.name }), [props.name])\n\n return (\n <FormFieldContext.Provider value={contextValue}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ninterface FormItemContextValue {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nconst FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const id = React.useId()\n const contextValue = React.useMemo(() => ({ id }), [id])\n\n return (\n <FormItemContext.Provider value={contextValue}>\n <div ref={ref} className={cn('space-y-2', className)} {...props} />\n </FormItemContext.Provider>\n )\n },\n)\nFormItem.displayName = 'FormItem'\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField()\n\n return <Label ref={ref} className={cn(error && '', className)} htmlFor={formItemId} {...props} />\n})\nFormLabel.displayName = 'FormLabel'\n\nconst FormControl = React.forwardRef<React.ElementRef<typeof Slot>, React.ComponentPropsWithoutRef<typeof Slot>>(\n ({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={`${formDescriptionId} ${error ? formMessageId : ''}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n },\n)\nFormControl.displayName = 'FormControl'\n\nconst FormDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n\n return <p ref={ref} id={formDescriptionId} className={cn('text-muted-foreground text-sm', className)} {...props} />\n },\n)\nFormDescription.displayName = 'FormDescription'\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement,
|
|
1
|
+
{"version":3,"file":"Form.js","sources":["../../../src/components/Form/Form.tsx"],"sourcesContent":["'use client'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { Slot } from '@radix-ui/react-slot'\nimport * as React from 'react'\nimport { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext } from 'react-hook-form'\n\nimport { Label } from '../Label/Label'\n\nimport { cn } from '@/lib/utils'\nimport { Typography, TypographyProps } from '../Typography'\n\nconst Form = FormProvider\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue)\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n const contextValue = React.useMemo(() => ({ name: props.name }), [props.name])\n\n return (\n <FormFieldContext.Provider value={contextValue}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ninterface FormItemContextValue {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nconst FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const id = React.useId()\n const contextValue = React.useMemo(() => ({ id }), [id])\n\n return (\n <FormItemContext.Provider value={contextValue}>\n <div ref={ref} className={cn('space-y-2', className)} {...props} />\n </FormItemContext.Provider>\n )\n },\n)\nFormItem.displayName = 'FormItem'\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField()\n\n return <Label ref={ref} className={cn(error && '', className)} htmlFor={formItemId} {...props} />\n})\nFormLabel.displayName = 'FormLabel'\n\nconst FormControl = React.forwardRef<React.ElementRef<typeof Slot>, React.ComponentPropsWithoutRef<typeof Slot>>(\n ({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={`${formDescriptionId} ${error ? formMessageId : ''}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n },\n)\nFormControl.displayName = 'FormControl'\n\nconst FormDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n\n return <p ref={ref} id={formDescriptionId} className={cn('text-muted-foreground text-sm', className)} {...props} />\n },\n)\nFormDescription.displayName = 'FormDescription'\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, TypographyProps>(\n ({ className = '', children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error.message) : children\n\n if (!body) {\n return null\n }\n\n return (\n <Typography\n ref={ref}\n component=\"p\"\n className={cn('flex items-center gap-2', error ? 'text-error' : 'text-neutral-500', className)}\n variant=\"body-md\"\n id={formMessageId}\n {...props}\n >\n {body}\n </Typography>\n )\n },\n)\n\nFormMessage.displayName = 'FormMessage'\n\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField }\n"],"names":[],"mappings":";;;;;;;;;AAWA;AASA;AAEA;AAGE;AAEF;AACE;AAEA;AAKF;AAEA;AACE;AACA;AACA;AAEA;AAEA;AAEA;AAAO;AACL;AACmB;AACF;AACO;AACJ;AACjB;AAEP;AAMA;AAEA;AAAuB;AAEnB;AACA;AAEA;AAGE;AAGN;AACA;AAEM;AAIJ;AAEA;AACF;AACA;AAEA;AAA0B;AAEtB;AAEA;AACE;AAAC;AAAA;AACC;AACI;AACiE;AACrD;AACZ;AAAA;AACN;AAGN;AACA;AAEA;AAA8B;AAE1B;AAEA;AAAiH;AAErH;AACA;AAEA;AAA0B;AAEtB;AACA;AAEA;AACE;AAAO;AAGT;AACE;AAAC;AAAA;AACC;AACU;AACmF;AACrF;AACJ;AACA;AAEH;AAAA;AACH;AAGN;AAEA;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { TooltipContent } from '../Tooltip';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
type SidebarContext = {
|
|
4
|
+
state: 'expanded' | 'collapsed';
|
|
5
|
+
open: boolean;
|
|
6
|
+
setOpen: (open: boolean) => void;
|
|
7
|
+
openMobile: boolean;
|
|
8
|
+
setOpenMobile: (open: boolean) => void;
|
|
9
|
+
isMobile: boolean;
|
|
10
|
+
toggleSidebar: () => void;
|
|
11
|
+
};
|
|
12
|
+
declare const SidebarContext: React.Context<SidebarContext | null>;
|
|
13
|
+
declare function useSidebar(): SidebarContext;
|
|
14
|
+
declare const SidebarProvider: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
15
|
+
defaultOpen?: boolean;
|
|
16
|
+
open?: boolean;
|
|
17
|
+
onOpenChange?: (open: boolean) => void;
|
|
18
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
19
|
+
declare const SidebarRoot: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
20
|
+
side?: "left" | "right";
|
|
21
|
+
variant?: "default" | "hidden";
|
|
22
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
23
|
+
declare const SidebarTrigger: React.ForwardRefExoticComponent<Omit<import('../Button').ButtonProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
24
|
+
declare const SidebarRail: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
25
|
+
declare const SidebarInset: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
26
|
+
declare const SidebarInput: React.ForwardRefExoticComponent<Omit<import('../Input').InputProps & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
|
|
27
|
+
declare const SidebarHeader: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
28
|
+
declare const SidebarFooter: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
29
|
+
declare const SidebarSeparator: React.ForwardRefExoticComponent<Omit<import('../Separator').SeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
30
|
+
declare const SidebarContent: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
31
|
+
declare const SidebarGroup: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
32
|
+
declare const SidebarGroupLabel: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
33
|
+
asChild?: boolean;
|
|
34
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
35
|
+
declare const SidebarGroupAction: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLButtonElement> & React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
36
|
+
asChild?: boolean;
|
|
37
|
+
}, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
38
|
+
declare const SidebarGroupContent: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
39
|
+
declare const SidebarMenu: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & React.RefAttributes<HTMLUListElement>>;
|
|
40
|
+
declare const SidebarMenuItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & React.RefAttributes<HTMLLIElement>>;
|
|
41
|
+
declare const SidebarMenuButton: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLButtonElement> & React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
42
|
+
asChild?: boolean;
|
|
43
|
+
isActive?: boolean;
|
|
44
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
45
|
+
variant?: "navigation-item" | "element";
|
|
46
|
+
}, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
47
|
+
declare const SidebarMenuAction: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLButtonElement> & React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
48
|
+
asChild?: boolean;
|
|
49
|
+
showOnHover?: boolean;
|
|
50
|
+
}, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
51
|
+
declare const SidebarMenuBadge: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
52
|
+
declare const SidebarMenuSkeleton: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
53
|
+
showIcon?: boolean;
|
|
54
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
55
|
+
declare const SidebarMenuSub: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & React.RefAttributes<HTMLUListElement>>;
|
|
56
|
+
declare const SidebarMenuSubItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & React.RefAttributes<HTMLLIElement>>;
|
|
57
|
+
declare const SidebarMenuSubButton: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLAnchorElement> & React.AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
58
|
+
asChild?: boolean;
|
|
59
|
+
isActive?: boolean;
|
|
60
|
+
}, "ref"> & React.RefAttributes<HTMLAnchorElement>>;
|
|
61
|
+
export { SidebarRoot, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, };
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
5
|
+
import { Sidebar } from '@phosphor-icons/react';
|
|
6
|
+
import { Button } from '../Button/Button.js';
|
|
7
|
+
import { Input } from '../Input/Input.js';
|
|
8
|
+
import { Separator } from '../Separator/Separator.js';
|
|
9
|
+
import { SheetRoot, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '../Sheet/Sheet.js';
|
|
10
|
+
import { Skeleton } from '../Skeleton/Skeleton.js';
|
|
11
|
+
import { TooltipProvider, TooltipRoot, TooltipTrigger, TooltipContent } from '../Tooltip/Tooltip.js';
|
|
12
|
+
import { useIsMobile } from '../../lib/useMobile.js';
|
|
13
|
+
import { cn } from '../../lib/utils.js';
|
|
14
|
+
import { Typography } from '../Typography/Typography.js';
|
|
15
|
+
import { cva } from 'class-variance-authority';
|
|
16
|
+
|
|
17
|
+
const SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
18
|
+
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
19
|
+
const SIDEBAR_WIDTH = "16rem";
|
|
20
|
+
const SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
21
|
+
const SIDEBAR_WIDTH_ICON = "3rem";
|
|
22
|
+
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
23
|
+
const SidebarContext = React.createContext(null);
|
|
24
|
+
function useSidebar() {
|
|
25
|
+
const context = React.useContext(SidebarContext);
|
|
26
|
+
if (!context) {
|
|
27
|
+
throw new Error("useSidebar must be used within a SidebarProvider.");
|
|
28
|
+
}
|
|
29
|
+
return context;
|
|
30
|
+
}
|
|
31
|
+
const SidebarProvider = React.forwardRef(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => {
|
|
32
|
+
const isMobile = useIsMobile();
|
|
33
|
+
const [openMobile, setOpenMobile] = React.useState(false);
|
|
34
|
+
const [_open, _setOpen] = React.useState(defaultOpen);
|
|
35
|
+
const open = openProp ?? _open;
|
|
36
|
+
const setOpen = React.useCallback(
|
|
37
|
+
(value) => {
|
|
38
|
+
const openState = typeof value === "function" ? value(open) : value;
|
|
39
|
+
if (setOpenProp) {
|
|
40
|
+
setOpenProp(openState);
|
|
41
|
+
} else {
|
|
42
|
+
_setOpen(openState);
|
|
43
|
+
}
|
|
44
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
|
|
45
|
+
},
|
|
46
|
+
[setOpenProp, open]
|
|
47
|
+
);
|
|
48
|
+
const toggleSidebar = React.useCallback(() => {
|
|
49
|
+
return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
|
|
50
|
+
}, [isMobile, setOpen, setOpenMobile]);
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
const handleKeyDown = (event) => {
|
|
53
|
+
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (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
|
+
const state = open ? "expanded" : "collapsed";
|
|
62
|
+
const contextValue = React.useMemo(
|
|
63
|
+
() => ({
|
|
64
|
+
state,
|
|
65
|
+
open,
|
|
66
|
+
setOpen,
|
|
67
|
+
isMobile,
|
|
68
|
+
openMobile,
|
|
69
|
+
setOpenMobile,
|
|
70
|
+
toggleSidebar
|
|
71
|
+
}),
|
|
72
|
+
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
|
|
73
|
+
);
|
|
74
|
+
return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx(
|
|
75
|
+
"div",
|
|
76
|
+
{
|
|
77
|
+
style: {
|
|
78
|
+
"--sidebar-width": SIDEBAR_WIDTH,
|
|
79
|
+
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
80
|
+
...style
|
|
81
|
+
},
|
|
82
|
+
className: cn("group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar", className),
|
|
83
|
+
ref,
|
|
84
|
+
...props,
|
|
85
|
+
children
|
|
86
|
+
}
|
|
87
|
+
) }) });
|
|
88
|
+
});
|
|
89
|
+
SidebarProvider.displayName = "SidebarProvider";
|
|
90
|
+
const SidebarRoot = React.forwardRef(({ side = "left", variant = "default", className, children, ...props }, ref) => {
|
|
91
|
+
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
|
|
92
|
+
if (isMobile) {
|
|
93
|
+
return /* @__PURE__ */ jsx(SheetRoot, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs(
|
|
94
|
+
SheetContent,
|
|
95
|
+
{
|
|
96
|
+
"data-sidebar": "sidebar",
|
|
97
|
+
"data-mobile": "true",
|
|
98
|
+
className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
|
|
99
|
+
style: {
|
|
100
|
+
"--sidebar-width": SIDEBAR_WIDTH_MOBILE
|
|
101
|
+
},
|
|
102
|
+
side,
|
|
103
|
+
children: [
|
|
104
|
+
/* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [
|
|
105
|
+
/* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }),
|
|
106
|
+
/* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
) });
|
|
112
|
+
}
|
|
113
|
+
return /* @__PURE__ */ jsxs(
|
|
114
|
+
"div",
|
|
115
|
+
{
|
|
116
|
+
ref,
|
|
117
|
+
className: "group peer hidden text-sidebar-foreground shadow-md md:block",
|
|
118
|
+
"data-state": state,
|
|
119
|
+
"data-side": side,
|
|
120
|
+
"data-variant": variant,
|
|
121
|
+
children: [
|
|
122
|
+
/* @__PURE__ */ jsx(
|
|
123
|
+
"div",
|
|
124
|
+
{
|
|
125
|
+
className: cn(
|
|
126
|
+
"relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
|
|
127
|
+
variant === "default" && "group-data-[state=collapsed]:w-[--sidebar-width-icon]",
|
|
128
|
+
variant === "hidden" && "group-data-[state=collapsed]:w-0",
|
|
129
|
+
"group-data-[side=right]:rotate-180"
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ jsx(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
className: cn(
|
|
137
|
+
"fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
|
|
138
|
+
side === "left" ? [
|
|
139
|
+
"left-0",
|
|
140
|
+
variant === "default" && "group-data-[state=collapsed]:w-[--sidebar-width-icon]",
|
|
141
|
+
variant === "hidden" && "group-data-[state=collapsed]:left-[calc(var(--sidebar-width)*-1)]"
|
|
142
|
+
] : [
|
|
143
|
+
"right-0",
|
|
144
|
+
variant === "default" && "group-data-[state=collapsed]:w-[--sidebar-width-icon]",
|
|
145
|
+
variant === "hidden" && "group-data-[state=collapsed]:right-[calc(var(--sidebar-width)*-1)]"
|
|
146
|
+
],
|
|
147
|
+
"group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
148
|
+
className
|
|
149
|
+
),
|
|
150
|
+
...props,
|
|
151
|
+
children: /* @__PURE__ */ jsx("div", { "data-sidebar": "sidebar", className: "flex h-full w-full flex-col bg-sidebar", children })
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
SidebarRoot.displayName = "SidebarRoot";
|
|
159
|
+
const SidebarTrigger = React.forwardRef(
|
|
160
|
+
({ className, onClick, ...props }, ref) => {
|
|
161
|
+
const { toggleSidebar } = useSidebar();
|
|
162
|
+
return /* @__PURE__ */ jsx(
|
|
163
|
+
Button,
|
|
164
|
+
{
|
|
165
|
+
ref,
|
|
166
|
+
"data-sidebar": "trigger",
|
|
167
|
+
variant: "text",
|
|
168
|
+
className: cn("h-8 w-8 p-1 text-primary-foreground", className),
|
|
169
|
+
onClick: (event) => {
|
|
170
|
+
onClick?.(event);
|
|
171
|
+
toggleSidebar();
|
|
172
|
+
},
|
|
173
|
+
...props,
|
|
174
|
+
StartIcon: Sidebar,
|
|
175
|
+
children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
|
|
176
|
+
}
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
SidebarTrigger.displayName = "SidebarTrigger";
|
|
181
|
+
const SidebarRail = React.forwardRef(
|
|
182
|
+
({ className, ...props }, ref) => {
|
|
183
|
+
const { toggleSidebar } = useSidebar();
|
|
184
|
+
return /* @__PURE__ */ jsx(
|
|
185
|
+
"button",
|
|
186
|
+
{
|
|
187
|
+
ref,
|
|
188
|
+
"data-sidebar": "rail",
|
|
189
|
+
"aria-label": "Toggle Sidebar",
|
|
190
|
+
tabIndex: -1,
|
|
191
|
+
onClick: toggleSidebar,
|
|
192
|
+
title: "Toggle Sidebar",
|
|
193
|
+
className: cn(
|
|
194
|
+
"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
|
|
195
|
+
"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
|
|
196
|
+
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
|
|
197
|
+
"group-data-[variant=offcanvas]:translate-x-0 group-data-[variant=offcanvas]:after:left-full group-data-[variant=offcanvas]:hover:bg-sidebar",
|
|
198
|
+
"[[data-side=left][data-variant=offcanvas]_&]:-right-2",
|
|
199
|
+
"[[data-side=right][data-variant=offcanvas]_&]:-left-2",
|
|
200
|
+
className
|
|
201
|
+
),
|
|
202
|
+
...props
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
SidebarRail.displayName = "SidebarRail";
|
|
208
|
+
const SidebarInset = React.forwardRef(({ className, ...props }, ref) => {
|
|
209
|
+
return /* @__PURE__ */ jsx(
|
|
210
|
+
"main",
|
|
211
|
+
{
|
|
212
|
+
ref,
|
|
213
|
+
className: cn(
|
|
214
|
+
"relative flex w-full flex-1 flex-col bg-background",
|
|
215
|
+
"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",
|
|
216
|
+
className
|
|
217
|
+
),
|
|
218
|
+
...props
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
});
|
|
222
|
+
SidebarInset.displayName = "SidebarInset";
|
|
223
|
+
const SidebarInput = React.forwardRef(
|
|
224
|
+
({ className, ...props }, ref) => {
|
|
225
|
+
return /* @__PURE__ */ jsx(
|
|
226
|
+
Input,
|
|
227
|
+
{
|
|
228
|
+
ref,
|
|
229
|
+
"data-sidebar": "input",
|
|
230
|
+
className: cn(
|
|
231
|
+
"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
|
|
232
|
+
className
|
|
233
|
+
),
|
|
234
|
+
...props
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
SidebarInput.displayName = "SidebarInput";
|
|
240
|
+
const SidebarHeader = React.forwardRef(({ className, ...props }, ref) => {
|
|
241
|
+
return /* @__PURE__ */ jsx("div", { ref, "data-sidebar": "header", className: cn("flex flex-col gap-2 p-2", className), ...props });
|
|
242
|
+
});
|
|
243
|
+
SidebarHeader.displayName = "SidebarHeader";
|
|
244
|
+
const SidebarFooter = React.forwardRef(({ className, ...props }, ref) => {
|
|
245
|
+
return /* @__PURE__ */ jsx("div", { ref, "data-sidebar": "footer", className: cn("flex flex-col gap-2 p-2", className), ...props });
|
|
246
|
+
});
|
|
247
|
+
SidebarFooter.displayName = "SidebarFooter";
|
|
248
|
+
const SidebarSeparator = React.forwardRef(
|
|
249
|
+
({ className, ...props }, ref) => {
|
|
250
|
+
return /* @__PURE__ */ jsx(
|
|
251
|
+
Separator,
|
|
252
|
+
{
|
|
253
|
+
ref,
|
|
254
|
+
"data-sidebar": "separator",
|
|
255
|
+
className: cn("mx-2 w-auto bg-sidebar-border", className),
|
|
256
|
+
...props
|
|
257
|
+
}
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
SidebarSeparator.displayName = "SidebarSeparator";
|
|
262
|
+
const SidebarContent = React.forwardRef(({ className, ...props }, ref) => {
|
|
263
|
+
return /* @__PURE__ */ jsx(
|
|
264
|
+
"div",
|
|
265
|
+
{
|
|
266
|
+
ref,
|
|
267
|
+
"data-sidebar": "content",
|
|
268
|
+
className: cn(
|
|
269
|
+
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto",
|
|
270
|
+
"group-data-[variant=default]:group-data-[state=collapsed]:overflow-hidden",
|
|
271
|
+
className
|
|
272
|
+
),
|
|
273
|
+
...props
|
|
274
|
+
}
|
|
275
|
+
);
|
|
276
|
+
});
|
|
277
|
+
SidebarContent.displayName = "SidebarContent";
|
|
278
|
+
const SidebarGroup = React.forwardRef(({ className, ...props }, ref) => {
|
|
279
|
+
return /* @__PURE__ */ jsx(
|
|
280
|
+
"div",
|
|
281
|
+
{
|
|
282
|
+
ref,
|
|
283
|
+
"data-sidebar": "group",
|
|
284
|
+
className: cn("relative flex w-full min-w-0 flex-col p-2", className),
|
|
285
|
+
...props
|
|
286
|
+
}
|
|
287
|
+
);
|
|
288
|
+
});
|
|
289
|
+
SidebarGroup.displayName = "SidebarGroup";
|
|
290
|
+
const SidebarGroupLabel = React.forwardRef(
|
|
291
|
+
({ className, asChild = false, children, ...props }, ref) => {
|
|
292
|
+
const Comp = asChild ? Slot : "div";
|
|
293
|
+
return /* @__PURE__ */ jsx(
|
|
294
|
+
Comp,
|
|
295
|
+
{
|
|
296
|
+
ref,
|
|
297
|
+
"data-sidebar": "group-label",
|
|
298
|
+
className: cn(
|
|
299
|
+
"flex h-8 shrink-0 items-center rounded-md px-2 text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
300
|
+
"group-data-[state=collapsed]:group-data-[variant=hidden]:hidden",
|
|
301
|
+
"group-data-[state=collapsed]:group-data-[variant=default]:-mt-8 group-data-[state=collapsed]:group-data-[variant=default]:opacity-0",
|
|
302
|
+
className
|
|
303
|
+
),
|
|
304
|
+
...props,
|
|
305
|
+
children: typeof children === "string" ? /* @__PURE__ */ jsx(Typography, { variant: "label-md", color: "secondary", children }) : children
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
SidebarGroupLabel.displayName = "SidebarGroupLabel";
|
|
311
|
+
const SidebarGroupAction = React.forwardRef(
|
|
312
|
+
({ className, asChild = false, ...props }, ref) => {
|
|
313
|
+
const Comp = asChild ? Slot : "button";
|
|
314
|
+
return /* @__PURE__ */ jsx(
|
|
315
|
+
Comp,
|
|
316
|
+
{
|
|
317
|
+
ref,
|
|
318
|
+
"data-sidebar": "group-action",
|
|
319
|
+
className: cn(
|
|
320
|
+
"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-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
321
|
+
"after:absolute after:-inset-2 after:md:hidden",
|
|
322
|
+
"group-data-[state=collapsed]:hidden",
|
|
323
|
+
className
|
|
324
|
+
),
|
|
325
|
+
...props
|
|
326
|
+
}
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
);
|
|
330
|
+
SidebarGroupAction.displayName = "SidebarGroupAction";
|
|
331
|
+
const SidebarGroupContent = React.forwardRef(
|
|
332
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, "data-sidebar": "group-content", className: cn("w-full text-sm", className), ...props })
|
|
333
|
+
);
|
|
334
|
+
SidebarGroupContent.displayName = "SidebarGroupContent";
|
|
335
|
+
const SidebarMenu = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("ul", { ref, "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-1", className), ...props }));
|
|
336
|
+
SidebarMenu.displayName = "SidebarMenu";
|
|
337
|
+
const SidebarMenuItem = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props }));
|
|
338
|
+
SidebarMenuItem.displayName = "SidebarMenuItem";
|
|
339
|
+
const SidebarMenuButton = React.forwardRef(({ asChild = false, isActive = false, tooltip, className, children, variant = "navigation-item", ...props }, ref) => {
|
|
340
|
+
const Comp = asChild ? Slot : "button";
|
|
341
|
+
const { isMobile, state } = useSidebar();
|
|
342
|
+
const sidebarMenuButtonVariants = cva(
|
|
343
|
+
"peer/menu-button flex w-full text-sm hover:bg-sidebar-accent hover:text-sidebar-accent-foreground items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=expanded]:hover:bg-sidebar-accent data-[state=expanded]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
|
344
|
+
{
|
|
345
|
+
variants: {
|
|
346
|
+
variant: {
|
|
347
|
+
"navigation-item": "h-8",
|
|
348
|
+
element: "group-data-[state=collapsed]:!p-0"
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
defaultVariants: {
|
|
352
|
+
variant: "navigation-item"
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
);
|
|
356
|
+
const button = /* @__PURE__ */ jsx(
|
|
357
|
+
Comp,
|
|
358
|
+
{
|
|
359
|
+
ref,
|
|
360
|
+
"data-sidebar": "menu-button",
|
|
361
|
+
"data-active": isActive,
|
|
362
|
+
className: cn(sidebarMenuButtonVariants({ variant }), className),
|
|
363
|
+
...props,
|
|
364
|
+
children
|
|
365
|
+
}
|
|
366
|
+
);
|
|
367
|
+
if (!tooltip) {
|
|
368
|
+
return button;
|
|
369
|
+
}
|
|
370
|
+
if (typeof tooltip === "string") {
|
|
371
|
+
tooltip = {
|
|
372
|
+
children: tooltip
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
return /* @__PURE__ */ jsxs(TooltipRoot, { children: [
|
|
376
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
|
|
377
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "right", align: "center", hidden: state !== "collapsed" || isMobile, ...tooltip })
|
|
378
|
+
] });
|
|
379
|
+
});
|
|
380
|
+
SidebarMenuButton.displayName = "SidebarMenuButton";
|
|
381
|
+
const SidebarMenuAction = React.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
|
|
382
|
+
const Comp = asChild ? Slot : "button";
|
|
383
|
+
return /* @__PURE__ */ jsx(
|
|
384
|
+
Comp,
|
|
385
|
+
{
|
|
386
|
+
ref,
|
|
387
|
+
"data-sidebar": "menu-action",
|
|
388
|
+
className: cn(
|
|
389
|
+
"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-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
|
|
390
|
+
"after:absolute after:-inset-2 after:md:hidden",
|
|
391
|
+
"group-data-[state=collapsed]:hidden",
|
|
392
|
+
showOnHover && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=expanded]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
|
|
393
|
+
className
|
|
394
|
+
),
|
|
395
|
+
...props
|
|
396
|
+
}
|
|
397
|
+
);
|
|
398
|
+
});
|
|
399
|
+
SidebarMenuAction.displayName = "SidebarMenuAction";
|
|
400
|
+
const SidebarMenuBadge = React.forwardRef(
|
|
401
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
402
|
+
"div",
|
|
403
|
+
{
|
|
404
|
+
ref,
|
|
405
|
+
"data-sidebar": "menu-badge",
|
|
406
|
+
className: cn(
|
|
407
|
+
"pointer-events-none absolute right-1 top-1.5 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",
|
|
408
|
+
"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
|
|
409
|
+
"group-data-[state=collapsed]:group-data-[variant=hidden]:hidden",
|
|
410
|
+
"group-data-[state=collapsed]:group-data-[variant=default]:opacity-0",
|
|
411
|
+
className
|
|
412
|
+
),
|
|
413
|
+
...props
|
|
414
|
+
}
|
|
415
|
+
)
|
|
416
|
+
);
|
|
417
|
+
SidebarMenuBadge.displayName = "SidebarMenuBadge";
|
|
418
|
+
const SidebarMenuSkeleton = React.forwardRef(({ className, showIcon = false, ...props }, ref) => {
|
|
419
|
+
const width = React.useMemo(() => {
|
|
420
|
+
return `${Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0] % 40 + 50)}%`;
|
|
421
|
+
}, []);
|
|
422
|
+
return /* @__PURE__ */ jsxs(
|
|
423
|
+
"div",
|
|
424
|
+
{
|
|
425
|
+
ref,
|
|
426
|
+
"data-sidebar": "menu-skeleton",
|
|
427
|
+
className: cn("flex h-8 items-center gap-2 rounded-md px-2", className),
|
|
428
|
+
...props,
|
|
429
|
+
children: [
|
|
430
|
+
showIcon && /* @__PURE__ */ jsx(Skeleton, { className: "size-4 rounded-md", "data-sidebar": "menu-skeleton-icon" }),
|
|
431
|
+
/* @__PURE__ */ jsx(
|
|
432
|
+
Skeleton,
|
|
433
|
+
{
|
|
434
|
+
className: "h-4 max-w-[--skeleton-width] flex-1",
|
|
435
|
+
"data-sidebar": "menu-skeleton-text",
|
|
436
|
+
style: {
|
|
437
|
+
"--skeleton-width": width
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
)
|
|
441
|
+
]
|
|
442
|
+
}
|
|
443
|
+
);
|
|
444
|
+
});
|
|
445
|
+
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
|
|
446
|
+
const SidebarMenuSub = React.forwardRef(
|
|
447
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
448
|
+
"ul",
|
|
449
|
+
{
|
|
450
|
+
ref,
|
|
451
|
+
"data-sidebar": "menu-sub",
|
|
452
|
+
className: cn(
|
|
453
|
+
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
|
|
454
|
+
"group-data-[state=collapsed]:hidden",
|
|
455
|
+
className
|
|
456
|
+
),
|
|
457
|
+
...props
|
|
458
|
+
}
|
|
459
|
+
)
|
|
460
|
+
);
|
|
461
|
+
SidebarMenuSub.displayName = "SidebarMenuSub";
|
|
462
|
+
const SidebarMenuSubItem = React.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, ...props }));
|
|
463
|
+
SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
|
|
464
|
+
const SidebarMenuSubButton = React.forwardRef(({ asChild = false, isActive, className, children, ...props }, ref) => {
|
|
465
|
+
const Comp = asChild ? Slot : "a";
|
|
466
|
+
return /* @__PURE__ */ jsx(
|
|
467
|
+
Comp,
|
|
468
|
+
{
|
|
469
|
+
ref,
|
|
470
|
+
"data-sidebar": "menu-sub-button",
|
|
471
|
+
"data-active": isActive,
|
|
472
|
+
className: cn(
|
|
473
|
+
"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
|
|
474
|
+
"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
|
|
475
|
+
"group-data-[state=collapsed]:hidden",
|
|
476
|
+
className
|
|
477
|
+
),
|
|
478
|
+
...props,
|
|
479
|
+
children: typeof children === "string" ? /* @__PURE__ */ jsx(Typography, { variant: "body-md", children }) : children
|
|
480
|
+
}
|
|
481
|
+
);
|
|
482
|
+
});
|
|
483
|
+
SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
|
|
484
|
+
|
|
485
|
+
export { SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarRoot, SidebarSeparator, SidebarTrigger, useSidebar };
|
|
486
|
+
//# sourceMappingURL=Sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sources":["../../../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { Sidebar as SidebarIcon } from '@phosphor-icons/react'\n\nimport { Button } from '../Button'\nimport { Input } from '../Input'\nimport { Separator } from '../Separator'\nimport { SheetContent, SheetDescription, SheetHeader, SheetRoot, SheetTitle } from '../Sheet'\nimport { Skeleton } from '../Skeleton'\nimport { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from '../Tooltip'\nimport { useIsMobile } from '../../lib/useMobile'\nimport { cn } from '@/lib/utils'\nimport { Typography } from '../Typography'\nimport { cva } from 'class-variance-authority'\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state'\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = '16rem'\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\nconst SIDEBAR_WIDTH_ICON = '3rem'\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\n\ntype SidebarContext = {\n state: 'expanded' | 'collapsed'\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContext | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n return context\n}\n\nconst SidebarProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n }\n>(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open],\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed'\n\n const contextValue = React.useMemo<SidebarContext>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn('group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar', className)}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n})\nSidebarProvider.displayName = 'SidebarProvider'\n\nconst SidebarRoot = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n side?: 'left' | 'right'\n variant?: 'default' | 'hidden'\n }\n>(({ side = 'left', variant = 'default', className, children, ...props }, ref) => {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (isMobile) {\n return (\n <SheetRoot open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </SheetRoot>\n )\n }\n\n return (\n <div\n ref={ref}\n className=\"group peer hidden text-sidebar-foreground shadow-md md:block\"\n data-state={state}\n data-side={side}\n data-variant={variant}\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n className={cn(\n 'relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear',\n variant === 'default' && 'group-data-[state=collapsed]:w-[--sidebar-width-icon]',\n variant === 'hidden' && 'group-data-[state=collapsed]:w-0',\n 'group-data-[side=right]:rotate-180',\n )}\n />\n <div\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex',\n side === 'left'\n ? [\n 'left-0',\n variant === 'default' && 'group-data-[state=collapsed]:w-[--sidebar-width-icon]',\n variant === 'hidden' && 'group-data-[state=collapsed]:left-[calc(var(--sidebar-width)*-1)]',\n ]\n : [\n 'right-0',\n variant === 'default' && 'group-data-[state=collapsed]:w-[--sidebar-width-icon]',\n variant === 'hidden' && 'group-data-[state=collapsed]:right-[calc(var(--sidebar-width)*-1)]',\n ],\n 'group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div data-sidebar=\"sidebar\" className=\"flex h-full w-full flex-col bg-sidebar\">\n {children}\n </div>\n </div>\n </div>\n )\n})\nSidebarRoot.displayName = 'SidebarRoot'\n\nconst SidebarTrigger = React.forwardRef<React.ElementRef<typeof Button>, React.ComponentProps<typeof Button>>(\n ({ className, onClick, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"text\"\n className={cn('h-8 w-8 p-1 text-primary-foreground', className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n StartIcon={SidebarIcon}\n >\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n },\n)\nSidebarTrigger.displayName = 'SidebarTrigger'\n\nconst SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<'button'>>(\n ({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\n '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'group-data-[variant=offcanvas]:translate-x-0 group-data-[variant=offcanvas]:after:left-full group-data-[variant=offcanvas]:hover:bg-sidebar',\n '[[data-side=left][data-variant=offcanvas]_&]:-right-2',\n '[[data-side=right][data-variant=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarRail.displayName = 'SidebarRail'\n\nconst SidebarInset = React.forwardRef<HTMLDivElement, React.ComponentProps<'main'>>(({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n 'relative flex w-full flex-1 flex-col bg-background',\n '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',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarInset.displayName = 'SidebarInset'\n\nconst SidebarInput = React.forwardRef<React.ElementRef<typeof Input>, React.ComponentProps<typeof Input>>(\n ({ className, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n data-sidebar=\"input\"\n className={cn(\n 'h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarInput.displayName = 'SidebarInput'\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(({ className, ...props }, ref) => {\n return <div ref={ref} data-sidebar=\"header\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />\n})\nSidebarHeader.displayName = 'SidebarHeader'\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(({ className, ...props }, ref) => {\n return <div ref={ref} data-sidebar=\"footer\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />\n})\nSidebarFooter.displayName = 'SidebarFooter'\n\nconst SidebarSeparator = React.forwardRef<React.ElementRef<typeof Separator>, React.ComponentProps<typeof Separator>>(\n ({ className, ...props }, ref) => {\n return (\n <Separator\n ref={ref}\n data-sidebar=\"separator\"\n className={cn('mx-2 w-auto bg-sidebar-border', className)}\n {...props}\n />\n )\n },\n)\nSidebarSeparator.displayName = 'SidebarSeparator'\n\nconst SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto',\n 'group-data-[variant=default]:group-data-[state=collapsed]:overflow-hidden',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarContent.displayName = 'SidebarContent'\n\nconst SidebarGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n )\n})\nSidebarGroup.displayName = 'SidebarGroup'\n\nconst SidebarGroupLabel = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'> & { asChild?: boolean }>(\n ({ className, asChild = false, children, ...props }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n 'flex h-8 shrink-0 items-center rounded-md px-2 text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[state=collapsed]:group-data-[variant=hidden]:hidden',\n 'group-data-[state=collapsed]:group-data-[variant=default]:-mt-8 group-data-[state=collapsed]:group-data-[variant=default]:opacity-0',\n className,\n )}\n {...props}\n >\n {typeof children === 'string' ? (\n <Typography variant=\"label-md\" color=\"secondary\">\n {children}\n </Typography>\n ) : (\n children\n )}\n </Comp>\n )\n },\n)\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\n\nconst SidebarGroupAction = React.forwardRef<HTMLButtonElement, React.ComponentProps<'button'> & { asChild?: boolean }>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n '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-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 after:md:hidden',\n 'group-data-[state=collapsed]:hidden',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarGroupAction.displayName = 'SidebarGroupAction'\n\nconst SidebarGroupContent = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-sidebar=\"group-content\" className={cn('w-full text-sm', className)} {...props} />\n ),\n)\nSidebarGroupContent.displayName = 'SidebarGroupContent'\n\nconst SidebarMenu = React.forwardRef<HTMLUListElement, React.ComponentProps<'ul'>>(({ className, ...props }, ref) => (\n <ul ref={ref} data-sidebar=\"menu\" className={cn('flex w-full min-w-0 flex-col gap-1', className)} {...props} />\n))\nSidebarMenu.displayName = 'SidebarMenu'\n\nconst SidebarMenuItem = React.forwardRef<HTMLLIElement, React.ComponentProps<'li'>>(({ className, ...props }, ref) => (\n <li ref={ref} data-sidebar=\"menu-item\" className={cn('group/menu-item relative', className)} {...props} />\n))\nSidebarMenuItem.displayName = 'SidebarMenuItem'\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<'button'> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n variant?: 'navigation-item' | 'element'\n }\n>(({ asChild = false, isActive = false, tooltip, className, children, variant = 'navigation-item', ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n const { isMobile, state } = useSidebar()\n\n const sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full text-sm hover:bg-sidebar-accent hover:text-sidebar-accent-foreground items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=expanded]:hover:bg-sidebar-accent data-[state=expanded]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n 'navigation-item': 'h-8',\n element: 'group-data-[state=collapsed]:!p-0',\n },\n },\n defaultVariants: {\n variant: 'navigation-item',\n },\n },\n )\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant }), className)}\n {...props}\n >\n {children}\n </Comp>\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <TooltipRoot>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltip} />\n </TooltipRoot>\n )\n})\nSidebarMenuButton.displayName = 'SidebarMenuButton'\n\nconst SidebarMenuAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<'button'> & {\n asChild?: boolean\n showOnHover?: boolean\n }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n '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-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 after:md:hidden',\n 'group-data-[state=collapsed]:hidden',\n showOnHover &&\n 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=expanded]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarMenuAction.displayName = 'SidebarMenuAction'\n\nconst SidebarMenuBadge = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n 'pointer-events-none absolute right-1 top-1.5 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',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'group-data-[state=collapsed]:group-data-[variant=hidden]:hidden',\n 'group-data-[state=collapsed]:group-data-[variant=default]:opacity-0',\n className,\n )}\n {...props}\n />\n ),\n)\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\n\nconst SidebarMenuSkeleton = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n showIcon?: boolean\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor((window.crypto.getRandomValues(new Uint32Array(1))[0] % 40) + 50)}%`\n }, [])\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-[--skeleton-width] flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n})\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\n\nconst SidebarMenuSub = React.forwardRef<HTMLUListElement, React.ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n 'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',\n 'group-data-[state=collapsed]:hidden',\n className,\n )}\n {...props}\n />\n ),\n)\nSidebarMenuSub.displayName = 'SidebarMenuSub'\n\nconst SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<'li'>>(({ ...props }, ref) => (\n <li ref={ref} {...props} />\n))\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\n\nconst SidebarMenuSubButton = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<'a'> & {\n asChild?: boolean\n isActive?: boolean\n }\n>(({ asChild = false, isActive, className, children, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-active={isActive}\n className={cn(\n 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n 'group-data-[state=collapsed]:hidden',\n className,\n )}\n {...props}\n >\n {typeof children === 'string' ? <Typography variant=\"body-md\">{children}</Typography> : children}\n </Comp>\n )\n})\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\n\nexport {\n SidebarRoot,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAiBA;AACA;AACA;AACA;AACA;AACA;AAYA;AAEA;AACE;AACA;AACE;AAAmE;AAGrE;AACF;AAEA;AAQE;AACA;AAIA;AACA;AACA;AAAsB;AAElB;AACA;AACE;AAAqB;AAErB;AAAkB;AAIpB;AAAgG;AAClG;AACkB;AAIpB;AACE;AAA0E;AAI5E;AACE;AACE;AACE;AACA;AAAc;AAChB;AAGF;AACA;AAAgE;AAKlE;AAEA;AAA2B;AAClB;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AACyE;AAG3E;AAGM;AAAC;AAAA;AAEG;AACqB;AACK;AACrB;AACL;AAE0G;AAC5G;AACI;AAEH;AAAA;AAKX;AACA;AAEA;AAOE;AAEA;AACE;AAEI;AAAC;AAAA;AACc;AACD;AACF;AAER;AACqB;AACrB;AAEF;AAEA;AACE;AAAmB;AAC2B;AAChD;AACuD;AAAA;AAAA;AAE3D;AAIJ;AACE;AAAC;AAAA;AACC;AACU;AACE;AACD;AACG;AAGd;AAAA;AAAC;AAAA;AACY;AACT;AACyB;AACD;AACxB;AACF;AAAA;AACF;AACA;AAAC;AAAA;AACY;AACT;AAEI;AACE;AACyB;AACD;AAE1B;AACE;AACyB;AACD;AAC1B;AACJ;AACA;AACF;AACI;AAIJ;AAAA;AACF;AAAA;AAAA;AAGN;AACA;AAEA;AAA6B;AAEzB;AAEA;AACE;AAAC;AAAA;AACC;AACa;AACL;AACsD;AAE5D;AACA;AAAc;AAChB;AACI;AACO;AAE6B;AAAA;AAC1C;AAGN;AACA;AAEA;AAA0B;AAEtB;AAEA;AACE;AAAC;AAAA;AACC;AACa;AACF;AACD;AACD;AACH;AACK;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AACI;AAAA;AACN;AAGN;AACA;AAEM;AACJ;AACE;AAAC;AAAA;AACC;AACW;AACT;AACA;AACA;AACF;AACI;AAAA;AAGV;AACA;AAEA;AAA2B;AAEvB;AACE;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACF;AACI;AAAA;AACN;AAGN;AACA;AAEM;AACJ;AACF;AACA;AAEM;AACJ;AACF;AACA;AAEA;AAA+B;AAE3B;AACE;AAAC;AAAA;AACC;AACa;AAC2C;AACpD;AAAA;AACN;AAGN;AACA;AAEM;AACJ;AACE;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACA;AACF;AACI;AAAA;AAGV;AACA;AAEM;AACJ;AACE;AAAC;AAAA;AACC;AACa;AACuD;AAChE;AAAA;AAGV;AACA;AAEA;AAAgC;AAE5B;AAEA;AACE;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACA;AACA;AACF;AACI;AAOF;AAAA;AAEJ;AAGN;AACA;AAEA;AAAiC;AAE7B;AAEA;AACE;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACA;AACA;AACF;AACI;AAAA;AACN;AAGN;AACA;AAEA;AAAkC;AAIlC;AACA;AAEM;AAGN;AAEM;AAGN;AAEA;AASE;AACA;AAEA;AAAkC;AAChC;AACA;AACY;AACC;AACY;AACV;AACX;AACF;AACiB;AACN;AACX;AACF;AAGF;AACE;AAAC;AAAA;AACC;AACa;AACA;AACkD;AAC3D;AAEH;AAAA;AAIL;AACE;AAAO;AAGT;AACE;AAAU;AACE;AACZ;AAGF;AAEI;AAAgC;AACoE;AAG1G;AACA;AAEA;AAOE;AAEA;AACE;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACA;AAEE;AACF;AACF;AACI;AAAA;AAGV;AACA;AAEA;AAA+B;AAE3B;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACA;AACA;AACA;AACF;AACI;AAAA;AAGV;AACA;AAEM;AAOJ;AACE;AAAsF;AAGxF;AACE;AAAC;AAAA;AACC;AACa;AACyD;AAClE;AAEH;AAAsF;AACvF;AAAC;AAAA;AACW;AACG;AAEX;AACsB;AACtB;AAAA;AAEJ;AAAA;AAAA;AAGN;AACA;AAEA;AAA6B;AAEzB;AAAC;AAAA;AACC;AACa;AACF;AACT;AACA;AACA;AACF;AACI;AAAA;AAGV;AACA;AAEA;AAGA;AAEA;AAOE;AAEA;AACE;AAAC;AAAA;AACC;AACa;AACA;AACF;AACT;AACA;AACA;AACA;AACF;AACI;AAEoF;AAAA;AAG9F;AACA;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Sidebar';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarRoot, SidebarSeparator, SidebarTrigger, useSidebar } from './Sidebar.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -16,7 +16,7 @@ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, Comma
|
|
|
16
16
|
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetRoot, SheetTitle, SheetTrigger } from './components/Sheet/Sheet.js';
|
|
17
17
|
export { Toaster, toast } from './components/Toaster/Toaster.js';
|
|
18
18
|
export { Tabs, TabsContent, TabsList, TabsTrigger } from './components/Tabs/Tabs.js';
|
|
19
|
-
export {
|
|
19
|
+
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbRoot, BreadcrumbSeparator, NavigationBreadcrumb, PagesBreadcrumb } from './components/Breadcrumb/Breadcrumb.js';
|
|
20
20
|
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './components/Table/Table.js';
|
|
21
21
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from './components/Accordion/Accordion.js';
|
|
22
22
|
export { RadioGroup, RadioGroupItem } from './components/RadioGroup/RadioGroup.js';
|
|
@@ -33,4 +33,5 @@ export { Progress } from './components/Progress/Progress.js';
|
|
|
33
33
|
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './components/DropdownMenu/DropdownMenu.js';
|
|
34
34
|
export { Separator } from './components/Separator/Separator.js';
|
|
35
35
|
export { Marquee } from './components/Marquee/Marquee.js';
|
|
36
|
+
export { SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarRoot, SidebarSeparator, SidebarTrigger, useSidebar } from './components/Sidebar/Sidebar.js';
|
|
36
37
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/lib/plugin.js
CHANGED
|
@@ -165,9 +165,26 @@ function periploTheme() {
|
|
|
165
165
|
DEFAULT: "#FBC45F",
|
|
166
166
|
foreground: "#1D1D1B"
|
|
167
167
|
},
|
|
168
|
+
sidebar: {
|
|
169
|
+
DEFAULT: "#FFFFFF",
|
|
170
|
+
foreground: "#1D1D1B",
|
|
171
|
+
primary: "#F7F7F6",
|
|
172
|
+
"primary-foreground": "#1D1D1B",
|
|
173
|
+
accent: "#F7F7F6",
|
|
174
|
+
"accent-foreground": "#1D1D1B",
|
|
175
|
+
border: "#E4E4E3",
|
|
176
|
+
ring: "#FAB700"
|
|
177
|
+
},
|
|
168
178
|
border: "#F7F7F6",
|
|
169
179
|
input: "#F7F7F6",
|
|
170
180
|
ring: "#FAB700"
|
|
181
|
+
},
|
|
182
|
+
boxShadow: {
|
|
183
|
+
tooltip: "0 2px 5px 2px rgba(0, 0, 0, 0.1)",
|
|
184
|
+
toast: "0 4px 12px #0000001a"
|
|
185
|
+
},
|
|
186
|
+
borderWidth: {
|
|
187
|
+
1.5: "1.5px"
|
|
171
188
|
}
|
|
172
189
|
}
|
|
173
190
|
}
|
package/dist/lib/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../src/lib/plugin.ts"],"sourcesContent":["import plugin from 'tailwindcss/plugin'\n\nexport function handler() {\n return true\n}\n\nexport function periploTheme() {\n return plugin(handler, {\n theme: {\n extend: {\n keyframes: {\n marquee: {\n from: { transform: \"translateX(0)\" },\n to: { transform: \"translateX(calc(-100% - var(--gap)))\" },\n },\n \"marquee-vertical\": {\n from: { transform: \"translateY(0)\" },\n to: { transform: \"translateY(calc(-100% - var(--gap)))\" },\n },\n 'accordion-down': {\n from: { height: '0' },\n to: { height: 'var(--radix-accordion-content-height)' },\n },\n 'accordion-up': {\n from: { height: 'var(--radix-accordion-content-height)' },\n to: { height: '0' },\n },\n shine: {\n '0%': { backgroundPosition: '200% 0' },\n '100%': { backgroundPosition: '-100% 0' },\n },\n 'shine-infinite': {\n '0%': { backgroundPosition: '200% 0' },\n '10%': { backgroundPosition: '-100% 0' },\n '100%': { backgroundPosition: '-100% 0' },\n },\n 'icon-down-up': {\n '0%': { transform: 'translateY(0%)' },\n '50%': { transform: 'translateY(100%)' },\n '50.01%': { transform: 'translateY(-100%)' },\n '100%': { transform: 'translateY(0%)' },\n },\n },\n animation: {\n 'accordion-down': 'accordion-down 0.2s ease-out',\n 'accordion-up': 'accordion-up 0.2s ease-out',\n shine: 'shine 1s ease',\n 'shine-infinite': 'shine-infinite 10s ease infinite',\n 'icon-down-up': 'icon-down-up 0.2s ease-out',\n marquee: \"marquee var(--duration) linear infinite\",\n \"marquee-vertical\": \"marquee-vertical var(--duration) linear infinite\",\n },\n fontFamily: {\n montserrat: ['var(--font-montserrat)', 'sans-serif'],\n opensans: ['var(--font-opensans)', 'sans-serif'],\n },\n colors: {\n foreground: '#1D1D1B',\n white: '#FFFFFF',\n card: '#F7F7F6',\n 'card-foreground': '#1D1D1B',\n popover: '#F7F7F6',\n 'popover-foreground': '#1D1D1B',\n neutral: {\n '50': '#F7F7F6',\n '100': '#E4E4E3',\n '200': '#C9C9C6',\n '300': '#A7A6A1',\n '400': '#84837D',\n '500': '#696963',\n '600': '#53534E',\n '700': '#454440',\n '800': '#393936',\n '900': '#32322F',\n '950': '#1D1D1B',\n DEFAULT: '#696963',\n foreground: '#F7F7F6',\n },\n primary: {\n '50': '#FFF0DE',\n '100': '#FFE182',\n '200': '#FFD685',\n '300': '#FFCE59',\n '400': '#FFC92F',\n '500': '#FBBA00',\n '600': '#F1A100',\n '700': '#F8A800',\n '800': '#FAA100',\n '900': '#F19700',\n '950': '#ED8C00',\n DEFAULT: '#FBBA00',\n foreground: '#1D1D1B',\n },\n accent: {\n '50': '#FFD5A8',\n '100': '#FFCC93',\n '200': '#FFB86A',\n '300': '#FFA542',\n '400': '#FF9119',\n '500': '#F77D00',\n '600': '#D57000',\n '700': '#BC6200',\n '800': '#A35500',\n '900': '#894800',\n '950': '#7C4100',\n DEFAULT: '#F77D00',\n foreground: '#1D1D1B',\n },\n success: {\n '50': '#F2FBF2',\n '100': '#E1F8E0',\n '200': '#C5EFC3',\n '300': '#90E194',\n '400': '#5FCB5D',\n '500': '#2EC03C',\n '600': '#299128',\n '700': '#247223',\n '800': '#215B20',\n '900': '#1C4B1D',\n '950': '#0A290B',\n DEFAULT: '#247223',\n foreground: '#FFFFFF',\n },\n warning: {\n '50': '#FCF5EE',\n '100': '#F7E4CE',\n '200': '#EEC799',\n '300': '#E6A563',\n '400': '#DE8334',\n '500': '#D76929',\n '600': '#BE4D21',\n '700': '#9E331F',\n '800': '#812B1F',\n '900': '#6B251C',\n '950': '#3D100B',\n DEFAULT: '#D76929',\n foreground: '#FFFFFF',\n },\n error: {\n '50': '#FEF2F2',\n '100': '#FEE2E2',\n '200': '#FFC9C9',\n '300': '#FDA4A4',\n '400': '#FA6F70',\n '500': '#F13637',\n '600': '#DF2324',\n '700': '#BC191A',\n '800': '#9B191A',\n '900': '#811B1C',\n '950': '#460909',\n DEFAULT: '#BC191A',\n foreground: '#FFFFFF',\n },\n background: {\n '50': '#FFFFFF',\n '100': '#FBFBFB',\n '200': '#FEF0D6',\n '300': '#FDE1AE',\n '400': '#FCD386',\n '500': '#FBC45F',\n '600': '#FAB637',\n '700': '#F9A70F',\n '800': '#DA8F05',\n '900': '#B27504',\n '950': '#9E6804',\n DEFAULT: '#FBC45F',\n foreground: '#1D1D1B',\n },\n border: '#F7F7F6',\n input: '#F7F7F6',\n ring: '#FAB700',\n },\n },\n },\n })\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../src/lib/plugin.ts"],"sourcesContent":["import plugin from 'tailwindcss/plugin'\n\nexport function handler() {\n return true\n}\n\nexport function periploTheme() {\n return plugin(handler, {\n theme: {\n extend: {\n keyframes: {\n marquee: {\n from: { transform: 'translateX(0)' },\n to: { transform: 'translateX(calc(-100% - var(--gap)))' },\n },\n 'marquee-vertical': {\n from: { transform: 'translateY(0)' },\n to: { transform: 'translateY(calc(-100% - var(--gap)))' },\n },\n 'accordion-down': {\n from: { height: '0' },\n to: { height: 'var(--radix-accordion-content-height)' },\n },\n 'accordion-up': {\n from: { height: 'var(--radix-accordion-content-height)' },\n to: { height: '0' },\n },\n shine: {\n '0%': { backgroundPosition: '200% 0' },\n '100%': { backgroundPosition: '-100% 0' },\n },\n 'shine-infinite': {\n '0%': { backgroundPosition: '200% 0' },\n '10%': { backgroundPosition: '-100% 0' },\n '100%': { backgroundPosition: '-100% 0' },\n },\n 'icon-down-up': {\n '0%': { transform: 'translateY(0%)' },\n '50%': { transform: 'translateY(100%)' },\n '50.01%': { transform: 'translateY(-100%)' },\n '100%': { transform: 'translateY(0%)' },\n },\n },\n animation: {\n 'accordion-down': 'accordion-down 0.2s ease-out',\n 'accordion-up': 'accordion-up 0.2s ease-out',\n shine: 'shine 1s ease',\n 'shine-infinite': 'shine-infinite 10s ease infinite',\n 'icon-down-up': 'icon-down-up 0.2s ease-out',\n marquee: 'marquee var(--duration) linear infinite',\n 'marquee-vertical': 'marquee-vertical var(--duration) linear infinite',\n },\n fontFamily: {\n montserrat: ['var(--font-montserrat)', 'sans-serif'],\n opensans: ['var(--font-opensans)', 'sans-serif'],\n },\n colors: {\n foreground: '#1D1D1B',\n white: '#FFFFFF',\n card: '#F7F7F6',\n 'card-foreground': '#1D1D1B',\n popover: '#F7F7F6',\n 'popover-foreground': '#1D1D1B',\n neutral: {\n '50': '#F7F7F6',\n '100': '#E4E4E3',\n '200': '#C9C9C6',\n '300': '#A7A6A1',\n '400': '#84837D',\n '500': '#696963',\n '600': '#53534E',\n '700': '#454440',\n '800': '#393936',\n '900': '#32322F',\n '950': '#1D1D1B',\n DEFAULT: '#696963',\n foreground: '#F7F7F6',\n },\n primary: {\n '50': '#FFF0DE',\n '100': '#FFE182',\n '200': '#FFD685',\n '300': '#FFCE59',\n '400': '#FFC92F',\n '500': '#FBBA00',\n '600': '#F1A100',\n '700': '#F8A800',\n '800': '#FAA100',\n '900': '#F19700',\n '950': '#ED8C00',\n DEFAULT: '#FBBA00',\n foreground: '#1D1D1B',\n },\n accent: {\n '50': '#FFD5A8',\n '100': '#FFCC93',\n '200': '#FFB86A',\n '300': '#FFA542',\n '400': '#FF9119',\n '500': '#F77D00',\n '600': '#D57000',\n '700': '#BC6200',\n '800': '#A35500',\n '900': '#894800',\n '950': '#7C4100',\n DEFAULT: '#F77D00',\n foreground: '#1D1D1B',\n },\n success: {\n '50': '#F2FBF2',\n '100': '#E1F8E0',\n '200': '#C5EFC3',\n '300': '#90E194',\n '400': '#5FCB5D',\n '500': '#2EC03C',\n '600': '#299128',\n '700': '#247223',\n '800': '#215B20',\n '900': '#1C4B1D',\n '950': '#0A290B',\n DEFAULT: '#247223',\n foreground: '#FFFFFF',\n },\n warning: {\n '50': '#FCF5EE',\n '100': '#F7E4CE',\n '200': '#EEC799',\n '300': '#E6A563',\n '400': '#DE8334',\n '500': '#D76929',\n '600': '#BE4D21',\n '700': '#9E331F',\n '800': '#812B1F',\n '900': '#6B251C',\n '950': '#3D100B',\n DEFAULT: '#D76929',\n foreground: '#FFFFFF',\n },\n error: {\n '50': '#FEF2F2',\n '100': '#FEE2E2',\n '200': '#FFC9C9',\n '300': '#FDA4A4',\n '400': '#FA6F70',\n '500': '#F13637',\n '600': '#DF2324',\n '700': '#BC191A',\n '800': '#9B191A',\n '900': '#811B1C',\n '950': '#460909',\n DEFAULT: '#BC191A',\n foreground: '#FFFFFF',\n },\n background: {\n '50': '#FFFFFF',\n '100': '#FBFBFB',\n '200': '#FEF0D6',\n '300': '#FDE1AE',\n '400': '#FCD386',\n '500': '#FBC45F',\n '600': '#FAB637',\n '700': '#F9A70F',\n '800': '#DA8F05',\n '900': '#B27504',\n '950': '#9E6804',\n DEFAULT: '#FBC45F',\n foreground: '#1D1D1B',\n },\n sidebar: {\n DEFAULT: '#FFFFFF',\n foreground: '#1D1D1B',\n primary: '#F7F7F6',\n 'primary-foreground': '#1D1D1B',\n accent: '#F7F7F6',\n 'accent-foreground': '#1D1D1B',\n border: '#E4E4E3',\n ring: '#FAB700',\n },\n border: '#F7F7F6',\n input: '#F7F7F6',\n ring: '#FAB700',\n },\n boxShadow: {\n tooltip: '0 2px 5px 2px rgba(0, 0, 0, 0.1)',\n toast: '0 4px 12px #0000001a',\n },\n borderWidth: {\n 1.5: '1.5px',\n },\n },\n },\n })\n}\n"],"names":[],"mappings":";;AAEO,SAAS,OAAU,GAAA;AACxB,EAAO,OAAA,IAAA;AACT;AAEO,SAAS,YAAe,GAAA;AAC7B,EAAA,OAAO,OAAO,OAAS,EAAA;AAAA,IACrB,KAAO,EAAA;AAAA,MACL,MAAQ,EAAA;AAAA,QACN,SAAW,EAAA;AAAA,UACT,OAAS,EAAA;AAAA,YACP,IAAA,EAAM,EAAE,SAAA,EAAW,eAAgB,EAAA;AAAA,YACnC,EAAA,EAAI,EAAE,SAAA,EAAW,sCAAuC;AAAA,WAC1D;AAAA,UACA,kBAAoB,EAAA;AAAA,YAClB,IAAA,EAAM,EAAE,SAAA,EAAW,eAAgB,EAAA;AAAA,YACnC,EAAA,EAAI,EAAE,SAAA,EAAW,sCAAuC;AAAA,WAC1D;AAAA,UACA,gBAAkB,EAAA;AAAA,YAChB,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAI,EAAA;AAAA,YACpB,EAAA,EAAI,EAAE,MAAA,EAAQ,uCAAwC;AAAA,WACxD;AAAA,UACA,cAAgB,EAAA;AAAA,YACd,IAAA,EAAM,EAAE,MAAA,EAAQ,uCAAwC,EAAA;AAAA,YACxD,EAAA,EAAI,EAAE,MAAA,EAAQ,GAAI;AAAA,WACpB;AAAA,UACA,KAAO,EAAA;AAAA,YACL,IAAA,EAAM,EAAE,kBAAA,EAAoB,QAAS,EAAA;AAAA,YACrC,MAAA,EAAQ,EAAE,kBAAA,EAAoB,SAAU;AAAA,WAC1C;AAAA,UACA,gBAAkB,EAAA;AAAA,YAChB,IAAA,EAAM,EAAE,kBAAA,EAAoB,QAAS,EAAA;AAAA,YACrC,KAAA,EAAO,EAAE,kBAAA,EAAoB,SAAU,EAAA;AAAA,YACvC,MAAA,EAAQ,EAAE,kBAAA,EAAoB,SAAU;AAAA,WAC1C;AAAA,UACA,cAAgB,EAAA;AAAA,YACd,IAAA,EAAM,EAAE,SAAA,EAAW,gBAAiB,EAAA;AAAA,YACpC,KAAA,EAAO,EAAE,SAAA,EAAW,kBAAmB,EAAA;AAAA,YACvC,QAAA,EAAU,EAAE,SAAA,EAAW,mBAAoB,EAAA;AAAA,YAC3C,MAAA,EAAQ,EAAE,SAAA,EAAW,gBAAiB;AAAA;AACxC,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,gBAAkB,EAAA,8BAAA;AAAA,UAClB,cAAgB,EAAA,4BAAA;AAAA,UAChB,KAAO,EAAA,eAAA;AAAA,UACP,gBAAkB,EAAA,kCAAA;AAAA,UAClB,cAAgB,EAAA,4BAAA;AAAA,UAChB,OAAS,EAAA,yCAAA;AAAA,UACT,kBAAoB,EAAA;AAAA,SACtB;AAAA,QACA,UAAY,EAAA;AAAA,UACV,UAAA,EAAY,CAAC,wBAAA,EAA0B,YAAY,CAAA;AAAA,UACnD,QAAA,EAAU,CAAC,sBAAA,EAAwB,YAAY;AAAA,SACjD;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,UAAY,EAAA,SAAA;AAAA,UACZ,KAAO,EAAA,SAAA;AAAA,UACP,IAAM,EAAA,SAAA;AAAA,UACN,iBAAmB,EAAA,SAAA;AAAA,UACnB,OAAS,EAAA,SAAA;AAAA,UACT,oBAAsB,EAAA,SAAA;AAAA,UACtB,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,SAAA;AAAA,YACN,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA;AAAA,WACd;AAAA,UACA,OAAS,EAAA;AAAA,YACP,OAAS,EAAA,SAAA;AAAA,YACT,UAAY,EAAA,SAAA;AAAA,YACZ,OAAS,EAAA,SAAA;AAAA,YACT,oBAAsB,EAAA,SAAA;AAAA,YACtB,MAAQ,EAAA,SAAA;AAAA,YACR,mBAAqB,EAAA,SAAA;AAAA,YACrB,MAAQ,EAAA,SAAA;AAAA,YACR,IAAM,EAAA;AAAA,WACR;AAAA,UACA,MAAQ,EAAA,SAAA;AAAA,UACR,KAAO,EAAA,SAAA;AAAA,UACP,IAAM,EAAA;AAAA,SACR;AAAA,QACA,SAAW,EAAA;AAAA,UACT,OAAS,EAAA,kCAAA;AAAA,UACT,KAAO,EAAA;AAAA,SACT;AAAA,QACA,WAAa,EAAA;AAAA,UACX,GAAK,EAAA;AAAA;AACP;AACF;AACF,GACD,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useIsMobile(): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
const MOBILE_BREAKPOINT = 768;
|
|
4
|
+
function useIsMobile() {
|
|
5
|
+
const [isMobile, setIsMobile] = React.useState(undefined);
|
|
6
|
+
React.useEffect(() => {
|
|
7
|
+
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
|
|
8
|
+
const onChange = () => {
|
|
9
|
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
10
|
+
};
|
|
11
|
+
mql.addEventListener("change", onChange);
|
|
12
|
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
13
|
+
return () => mql.removeEventListener("change", onChange);
|
|
14
|
+
}, []);
|
|
15
|
+
return !!isMobile;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { useIsMobile };
|
|
19
|
+
//# sourceMappingURL=useMobile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMobile.js","sources":["../../src/lib/useMobile.tsx"],"sourcesContent":["import * as React from 'react'\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener('change', onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener('change', onChange)\n }, [])\n\n return !!isMobile\n}\n"],"names":[],"mappings":";;AAEA,MAAM,iBAAoB,GAAA,GAAA;AAEnB,SAAS,WAAc,GAAA;AAC5B,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,KAAA,CAAM,SAA8B,SAAS,CAAA;AAE7E,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,MAAM,MAAO,CAAA,UAAA,CAAW,CAAe,YAAA,EAAA,iBAAA,GAAoB,CAAC,CAAK,GAAA,CAAA,CAAA;AACvE,IAAA,MAAM,WAAW,MAAM;AACrB,MAAY,WAAA,CAAA,MAAA,CAAO,aAAa,iBAAiB,CAAA;AAAA,KACnD;AACA,IAAI,GAAA,CAAA,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,IAAY,WAAA,CAAA,MAAA,CAAO,aAAa,iBAAiB,CAAA;AACjD,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAoB,CAAA,QAAA,EAAU,QAAQ,CAAA;AAAA,GACzD,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,CAAC,CAAC,QAAA;AACX;;;;"}
|