@agent-native/toolkit 0.19.7 → 0.19.8-nightly-20260910195009
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/agent-native.eject.json +8 -1
- package/dist/app-shell/index.d.ts +1 -0
- package/dist/app-shell/index.d.ts.map +1 -1
- package/dist/app-shell/index.js +1 -0
- package/dist/app-shell/index.js.map +1 -1
- package/dist/app-shell/sidebar.d.ts +134 -0
- package/dist/app-shell/sidebar.d.ts.map +1 -0
- package/dist/app-shell/sidebar.js +183 -0
- package/dist/app-shell/sidebar.js.map +1 -0
- package/dist/app-shell/sidebar.spec.d.ts +2 -0
- package/dist/app-shell/sidebar.spec.d.ts.map +1 -0
- package/dist/app-shell/sidebar.spec.js +82 -0
- package/dist/app-shell/sidebar.spec.js.map +1 -0
- package/package.json +1 -1
- package/src/app-shell/index.ts +1 -0
- package/src/app-shell/sidebar.spec.tsx +142 -0
- package/src/app-shell/sidebar.tsx +1000 -0
package/agent-native.eject.json
CHANGED
|
@@ -96,7 +96,14 @@
|
|
|
96
96
|
"strategy": "source-copy",
|
|
97
97
|
"sourceEntries": ["src/app-shell"],
|
|
98
98
|
"targetRoot": "app/components/agent-native/toolkit",
|
|
99
|
-
"dependencies": [
|
|
99
|
+
"dependencies": [
|
|
100
|
+
"@radix-ui/react-collapsible",
|
|
101
|
+
"@radix-ui/react-tooltip",
|
|
102
|
+
"@tabler/icons-react",
|
|
103
|
+
"clsx",
|
|
104
|
+
"react",
|
|
105
|
+
"tailwind-merge"
|
|
106
|
+
],
|
|
100
107
|
"verification": ["pnpm typecheck"]
|
|
101
108
|
},
|
|
102
109
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app-shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app-shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,uCAAuC,CAAC"}
|
package/dist/app-shell/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app-shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app-shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { type ComponentType, type HTMLAttributes, type MouseEvent, type ReactNode } from "react";
|
|
2
|
+
export type AppSidebarLinkComponent = ComponentType<{
|
|
3
|
+
to?: string;
|
|
4
|
+
href?: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
onClick?: (event: MouseEvent) => void;
|
|
7
|
+
children?: ReactNode;
|
|
8
|
+
"aria-label"?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export interface AppSidebarContextValue {
|
|
11
|
+
collapsed: boolean;
|
|
12
|
+
setCollapsed: (collapsed: boolean | ((current: boolean) => boolean)) => void;
|
|
13
|
+
toggleCollapsed: () => void;
|
|
14
|
+
isMobile: boolean;
|
|
15
|
+
/** Router-aware link. Defaults to a native `<a href>`. */
|
|
16
|
+
LinkComponent: AppSidebarLinkComponent;
|
|
17
|
+
}
|
|
18
|
+
export declare function useAppSidebar(): AppSidebarContextValue;
|
|
19
|
+
export interface AppSidebarItemDefinition {
|
|
20
|
+
id?: string;
|
|
21
|
+
to?: string;
|
|
22
|
+
href?: string;
|
|
23
|
+
label: string;
|
|
24
|
+
icon?: ComponentType<{
|
|
25
|
+
className?: string;
|
|
26
|
+
}> | ReactNode;
|
|
27
|
+
active?: boolean;
|
|
28
|
+
count?: number | string;
|
|
29
|
+
badge?: ReactNode;
|
|
30
|
+
actions?: ReactNode;
|
|
31
|
+
onClick?: (event: MouseEvent) => void;
|
|
32
|
+
children?: ReactNode;
|
|
33
|
+
}
|
|
34
|
+
export interface AppSidebarHeaderProps extends HTMLAttributes<HTMLDivElement> {
|
|
35
|
+
brandName?: ReactNode;
|
|
36
|
+
brandHref?: string;
|
|
37
|
+
brandIcon?: ReactNode;
|
|
38
|
+
brandLink?: ReactNode;
|
|
39
|
+
badge?: ReactNode;
|
|
40
|
+
onBrandClick?: (event: MouseEvent) => void;
|
|
41
|
+
collapsed?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare const AppSidebarHeader: import("react").ForwardRefExoticComponent<AppSidebarHeaderProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
44
|
+
export interface AppSidebarNavItemProps extends HTMLAttributes<HTMLDivElement> {
|
|
45
|
+
label: ReactNode;
|
|
46
|
+
icon?: ComponentType<{
|
|
47
|
+
className?: string;
|
|
48
|
+
}> | ReactNode;
|
|
49
|
+
to?: string;
|
|
50
|
+
href?: string;
|
|
51
|
+
active?: boolean;
|
|
52
|
+
count?: number | string;
|
|
53
|
+
badge?: ReactNode;
|
|
54
|
+
actions?: ReactNode;
|
|
55
|
+
onClick?: (event: MouseEvent) => void;
|
|
56
|
+
asChild?: boolean;
|
|
57
|
+
tooltipSide?: "right" | "top" | "bottom" | "left";
|
|
58
|
+
}
|
|
59
|
+
export declare const AppSidebarNavItem: import("react").ForwardRefExoticComponent<AppSidebarNavItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
60
|
+
export interface AppSidebarNavGroupProps extends HTMLAttributes<HTMLDivElement> {
|
|
61
|
+
label: ReactNode;
|
|
62
|
+
icon?: ComponentType<{
|
|
63
|
+
className?: string;
|
|
64
|
+
}> | ReactNode;
|
|
65
|
+
to?: string;
|
|
66
|
+
href?: string;
|
|
67
|
+
active?: boolean;
|
|
68
|
+
count?: number | string;
|
|
69
|
+
open?: boolean;
|
|
70
|
+
onOpenChange?: (open: boolean) => void;
|
|
71
|
+
defaultOpen?: boolean;
|
|
72
|
+
actions?: ReactNode;
|
|
73
|
+
children: ReactNode;
|
|
74
|
+
}
|
|
75
|
+
export declare const AppSidebarNavGroup: import("react").ForwardRefExoticComponent<AppSidebarNavGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
76
|
+
export interface AppSidebarSectionProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
|
|
77
|
+
title?: ReactNode;
|
|
78
|
+
divider?: boolean;
|
|
79
|
+
}
|
|
80
|
+
export declare const AppSidebarSection: import("react").ForwardRefExoticComponent<AppSidebarSectionProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
81
|
+
export interface AppSidebarFeedbackButtonProps {
|
|
82
|
+
label?: string;
|
|
83
|
+
icon?: ComponentType<{
|
|
84
|
+
className?: string;
|
|
85
|
+
}> | ReactNode;
|
|
86
|
+
onClick?: (event: MouseEvent) => void;
|
|
87
|
+
className?: string;
|
|
88
|
+
collapsed?: boolean;
|
|
89
|
+
}
|
|
90
|
+
export declare function AppSidebarFeedbackButton({ label, icon, onClick, className, collapsed: propCollapsed, }: AppSidebarFeedbackButtonProps): import("react").JSX.Element;
|
|
91
|
+
export interface AppSidebarFooterProps extends HTMLAttributes<HTMLDivElement> {
|
|
92
|
+
feedback?: ReactNode;
|
|
93
|
+
orgSwitcher?: ReactNode;
|
|
94
|
+
footerExtras?: ReactNode;
|
|
95
|
+
collapsible?: boolean;
|
|
96
|
+
expandLabel?: string;
|
|
97
|
+
collapseLabel?: string;
|
|
98
|
+
collapsed?: boolean;
|
|
99
|
+
onToggleCollapsed?: () => void;
|
|
100
|
+
}
|
|
101
|
+
export declare const AppSidebarFooter: import("react").ForwardRefExoticComponent<AppSidebarFooterProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
102
|
+
export interface AppSidebarProps extends HTMLAttributes<HTMLElement> {
|
|
103
|
+
collapsed?: boolean;
|
|
104
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
105
|
+
defaultCollapsed?: boolean;
|
|
106
|
+
collapsible?: boolean;
|
|
107
|
+
storageKey?: string;
|
|
108
|
+
isMobile?: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* When set (boolean), the sidebar owns off-canvas mobile drawer positioning.
|
|
111
|
+
* Leave undefined when embedding inside an external Sheet/drawer so the
|
|
112
|
+
* sidebar stays visible without translate offsets.
|
|
113
|
+
*/
|
|
114
|
+
mobileOpen?: boolean;
|
|
115
|
+
onMobileOpenChange?: (open: boolean) => void;
|
|
116
|
+
/** Router-aware link component. Defaults to a native `<a href>`. */
|
|
117
|
+
linkComponent?: AppSidebarLinkComponent;
|
|
118
|
+
brandName?: ReactNode;
|
|
119
|
+
brandHref?: string;
|
|
120
|
+
brandIcon?: ReactNode;
|
|
121
|
+
brandLink?: ReactNode;
|
|
122
|
+
badge?: ReactNode;
|
|
123
|
+
headerContent?: ReactNode;
|
|
124
|
+
items?: AppSidebarItemDefinition[];
|
|
125
|
+
secondaryItems?: AppSidebarItemDefinition[];
|
|
126
|
+
feedback?: ReactNode;
|
|
127
|
+
orgSwitcher?: ReactNode;
|
|
128
|
+
footerExtras?: ReactNode;
|
|
129
|
+
footerContent?: ReactNode;
|
|
130
|
+
expandLabel?: string;
|
|
131
|
+
collapseLabel?: string;
|
|
132
|
+
}
|
|
133
|
+
export declare const AppSidebar: import("react").ForwardRefExoticComponent<AppSidebarProps & import("react").RefAttributes<HTMLElement>>;
|
|
134
|
+
//# sourceMappingURL=sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/app-shell/sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { IconChevronDown, IconLayoutSidebarLeftCollapse, IconLayoutSidebarLeftExpand, IconMessageCircle, } from "@tabler/icons-react";
|
|
3
|
+
import { createContext, forwardRef, isValidElement, useCallback, useContext, useMemo, useState, } from "react";
|
|
4
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "../ui/collapsible.js";
|
|
5
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "../ui/tooltip.js";
|
|
6
|
+
import { cn } from "../utils.js";
|
|
7
|
+
import { usePersistentSidebarCollapsed } from "./use-persistent-sidebar-collapsed.js";
|
|
8
|
+
const AppSidebarContext = createContext(null);
|
|
9
|
+
function NativeSidebarLink({ to, href, className, onClick, children, "aria-label": ariaLabel, }) {
|
|
10
|
+
return (_jsx("a", { href: to ?? href, className: className, onClick: onClick, "aria-label": ariaLabel, children: children }));
|
|
11
|
+
}
|
|
12
|
+
const defaultSidebarContextValue = {
|
|
13
|
+
collapsed: false,
|
|
14
|
+
setCollapsed: () => { },
|
|
15
|
+
toggleCollapsed: () => { },
|
|
16
|
+
isMobile: false,
|
|
17
|
+
LinkComponent: NativeSidebarLink,
|
|
18
|
+
};
|
|
19
|
+
export function useAppSidebar() {
|
|
20
|
+
const context = useContext(AppSidebarContext);
|
|
21
|
+
return context ?? defaultSidebarContextValue;
|
|
22
|
+
}
|
|
23
|
+
function renderSidebarIcon(icon, className = "size-4 shrink-0 text-primary") {
|
|
24
|
+
if (!icon)
|
|
25
|
+
return null;
|
|
26
|
+
if (isValidElement(icon)) {
|
|
27
|
+
return icon;
|
|
28
|
+
}
|
|
29
|
+
const IconComponent = icon;
|
|
30
|
+
return _jsx(IconComponent, { className: className });
|
|
31
|
+
}
|
|
32
|
+
export const AppSidebarHeader = forwardRef(({ brandName, brandHref = "/", brandIcon, brandLink, badge, onBrandClick, collapsed: propCollapsed, className, children, ...props }, ref) => {
|
|
33
|
+
const context = useAppSidebar();
|
|
34
|
+
const collapsed = propCollapsed ?? context.collapsed;
|
|
35
|
+
const LinkComponent = context.LinkComponent;
|
|
36
|
+
return (_jsxs("div", { ref: ref, "data-sidebar-header": true, className: cn("flex h-14 shrink-0 items-center border-b border-border", collapsed ? "flex-col justify-center gap-0.5 px-2" : "gap-2 px-4", className), ...props, children: [brandLink ?? (_jsxs(LinkComponent, { to: brandHref, href: brandHref, "aria-label": typeof brandName === "string" ? brandName : undefined, onClick: onBrandClick, className: cn("flex min-w-0 items-center gap-2 rounded text-start outline-none focus-visible:ring-2 focus-visible:ring-ring", collapsed ? "size-8 justify-center" : "shrink-0"), children: [brandIcon, !collapsed && brandName && (_jsx("span", { className: "truncate text-sm font-semibold text-primary", children: brandName }))] })), badge, children] }));
|
|
37
|
+
});
|
|
38
|
+
AppSidebarHeader.displayName = "AppSidebarHeader";
|
|
39
|
+
export const AppSidebarNavItem = forwardRef(({ label, icon, to, href, active = false, count, badge, actions, onClick, asChild = false, tooltipSide = "right", className, children, ...props }, ref) => {
|
|
40
|
+
const { collapsed, LinkComponent } = useAppSidebar();
|
|
41
|
+
const linkHref = to ?? href;
|
|
42
|
+
if (collapsed) {
|
|
43
|
+
const tooltipLabel = typeof label === "string" ? label : undefined;
|
|
44
|
+
const content = asChild ? (children) : linkHref ? (_jsx(LinkComponent, { to: to, href: href ?? to, "aria-label": tooltipLabel, onClick: onClick, className: cn("flex size-9 items-center justify-center rounded-md text-primary hover:bg-accent/60 hover:text-primary", active &&
|
|
45
|
+
"bg-primary/10 text-primary hover:bg-primary/10 hover:text-primary", className), children: renderSidebarIcon(icon) })) : (_jsx("button", { type: "button", "aria-label": tooltipLabel, onClick: onClick, className: cn("flex size-9 items-center justify-center rounded-md text-primary hover:bg-accent/60 hover:text-primary", active &&
|
|
46
|
+
"bg-primary/10 text-primary hover:bg-primary/10 hover:text-primary", className), children: renderSidebarIcon(icon) }));
|
|
47
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: content }), _jsx(TooltipContent, { side: tooltipSide, children: label })] }));
|
|
48
|
+
}
|
|
49
|
+
if (asChild) {
|
|
50
|
+
return (_jsxs("div", { ref: ref, className: cn("group flex items-center rounded", active
|
|
51
|
+
? "bg-primary/10 font-medium text-primary"
|
|
52
|
+
: "text-primary hover:bg-accent/60", className), ...props, children: [children, actions] }));
|
|
53
|
+
}
|
|
54
|
+
const innerContent = (_jsxs(_Fragment, { children: [renderSidebarIcon(icon), _jsx("span", { className: "flex-1 truncate text-primary", children: label }), count !== undefined &&
|
|
55
|
+
(typeof count === "number" ? count > 0 : Boolean(count)) && (_jsx("span", { className: "shrink-0 tabular-nums text-[11px] text-primary/80", children: count })), badge] }));
|
|
56
|
+
return (_jsxs("div", { ref: ref, className: cn("group flex items-center rounded", active
|
|
57
|
+
? "bg-primary/10 font-medium text-primary"
|
|
58
|
+
: "text-primary hover:bg-accent/60", className), ...props, children: [linkHref ? (_jsx(LinkComponent, { to: to, href: href ?? to, onClick: onClick, className: "flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-xs text-primary", children: innerContent })) : (_jsx("button", { type: "button", onClick: onClick, className: "flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-xs text-primary", children: innerContent })), actions] }));
|
|
59
|
+
});
|
|
60
|
+
AppSidebarNavItem.displayName = "AppSidebarNavItem";
|
|
61
|
+
export const AppSidebarNavGroup = forwardRef(({ label, icon, to, href, active = false, count, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen = false, actions, children, className, ...props }, ref) => {
|
|
62
|
+
const { collapsed, LinkComponent } = useAppSidebar();
|
|
63
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
|
|
64
|
+
const open = controlledOpen ?? uncontrolledOpen;
|
|
65
|
+
const onOpenChange = controlledOnOpenChange ?? setUncontrolledOpen;
|
|
66
|
+
const linkHref = to ?? href;
|
|
67
|
+
if (collapsed) {
|
|
68
|
+
const tooltipLabel = typeof label === "string" ? label : undefined;
|
|
69
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(LinkComponent, { to: to, href: href ?? to ?? "#", "aria-label": tooltipLabel, className: cn("flex size-9 items-center justify-center rounded-md text-primary hover:bg-accent/60 hover:text-primary", active &&
|
|
70
|
+
"bg-primary/10 text-primary hover:bg-primary/10 hover:text-primary", className), children: renderSidebarIcon(icon) }) }), _jsx(TooltipContent, { side: "right", children: label })] }));
|
|
71
|
+
}
|
|
72
|
+
return (_jsxs(Collapsible, { open: open, onOpenChange: onOpenChange, className: cn("group/sidebar-nav", className), ...props, children: [_jsxs("div", { ref: ref, className: cn("group flex items-center rounded", active
|
|
73
|
+
? "bg-primary/10 font-medium text-primary"
|
|
74
|
+
: "text-primary hover:bg-accent/60"), children: [linkHref ? (_jsxs(LinkComponent, { to: to, href: href ?? to, className: "flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-xs text-primary", children: [renderSidebarIcon(icon), _jsx("span", { className: "flex-1 truncate text-primary", children: label }), count !== undefined &&
|
|
75
|
+
(typeof count === "number" ? count > 0 : Boolean(count)) && (_jsx("span", { className: "shrink-0 tabular-nums text-[11px] text-primary/80", children: count }))] })) : (_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-xs text-primary", children: [renderSidebarIcon(icon), _jsx("span", { className: "flex-1 truncate text-primary", children: label }), count !== undefined &&
|
|
76
|
+
(typeof count === "number" ? count > 0 : Boolean(count)) && (_jsx("span", { className: "shrink-0 tabular-nums text-[11px] text-primary/80", children: count }))] })), actions, _jsx(CollapsibleTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": open ? "Collapse" : "Expand", className: "me-1 flex size-7 shrink-0 items-center justify-center rounded text-primary hover:bg-accent hover:text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", children: _jsx(IconChevronDown, { className: cn("size-3.5 transition-transform motion-reduce:transition-none", open && "rotate-180") }) }) })] }), _jsx(CollapsibleContent, { className: "clips-collapsible-content", children: _jsx("div", { className: "ms-3.5 border-s border-border/70 ps-2", children: children }) })] }));
|
|
77
|
+
});
|
|
78
|
+
AppSidebarNavGroup.displayName = "AppSidebarNavGroup";
|
|
79
|
+
export const AppSidebarSection = forwardRef(({ title, divider = true, className, children, ...props }, ref) => {
|
|
80
|
+
const { collapsed } = useAppSidebar();
|
|
81
|
+
return (_jsxs("div", { ref: ref, "data-sidebar-section": true, className: cn(divider && "border-t border-border/70", collapsed
|
|
82
|
+
? "mt-2 flex flex-col items-center gap-1 pt-2"
|
|
83
|
+
: "mt-3 space-y-0.5 pt-3", className), ...props, children: [!collapsed && title && (_jsx("p", { className: "px-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60", children: title })), children] }));
|
|
84
|
+
});
|
|
85
|
+
AppSidebarSection.displayName = "AppSidebarSection";
|
|
86
|
+
export function AppSidebarFeedbackButton({ label = "Report an issue", icon, onClick, className, collapsed: propCollapsed, }) {
|
|
87
|
+
let contextCollapsed = false;
|
|
88
|
+
try {
|
|
89
|
+
const context = useAppSidebar();
|
|
90
|
+
contextCollapsed = context.collapsed;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// coercion-ok: context is optional when AppSidebarFeedbackButton is used standalone
|
|
94
|
+
}
|
|
95
|
+
const isCollapsed = propCollapsed ?? contextCollapsed;
|
|
96
|
+
const button = (_jsxs("button", { type: "button", "aria-label": isCollapsed ? label : undefined, onClick: onClick, className: cn(isCollapsed
|
|
97
|
+
? "flex size-9 items-center justify-center rounded-md bg-transparent text-primary hover:bg-accent/60 hover:text-primary"
|
|
98
|
+
: "flex h-auto w-full items-center justify-start gap-2 rounded bg-transparent px-2 py-1.5 text-xs font-normal text-primary hover:bg-accent/60 hover:text-primary", className), children: [renderSidebarIcon(icon, "size-4 shrink-0 text-primary") ?? (_jsx(IconMessageCircle, { className: "size-4 shrink-0 text-primary" })), !isCollapsed && _jsx("span", { children: label })] }));
|
|
99
|
+
if (!isCollapsed)
|
|
100
|
+
return button;
|
|
101
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { side: "right", children: label })] }));
|
|
102
|
+
}
|
|
103
|
+
export const AppSidebarFooter = forwardRef(({ feedback, orgSwitcher, footerExtras, collapsible = true, expandLabel = "Expand sidebar", collapseLabel = "Collapse sidebar", collapsed: propCollapsed, onToggleCollapsed, className, children, ...props }, ref) => {
|
|
104
|
+
const context = useAppSidebar();
|
|
105
|
+
const collapsed = propCollapsed ?? context.collapsed;
|
|
106
|
+
const toggleCollapsed = onToggleCollapsed ?? context.toggleCollapsed;
|
|
107
|
+
if (children) {
|
|
108
|
+
return (_jsx("div", { ref: ref, "data-sidebar-footer": true, className: cn("shrink-0 border-t border-border p-2", collapsed ? "space-y-1" : "space-y-1.5", className), ...props, children: children }));
|
|
109
|
+
}
|
|
110
|
+
const collapseButton = collapsible ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": collapsed ? expandLabel : collapseLabel, onClick: toggleCollapsed, className: "flex size-9 shrink-0 items-center justify-center rounded-md bg-transparent text-primary hover:bg-accent/60 hover:text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", children: collapsed ? (_jsx(IconLayoutSidebarLeftExpand, { className: "size-4 rtl:-scale-x-100" })) : (_jsx(IconLayoutSidebarLeftCollapse, { className: "size-4 rtl:-scale-x-100" })) }) }), _jsx(TooltipContent, { side: "right", children: collapsed ? expandLabel : collapseLabel })] })) : null;
|
|
111
|
+
const resolvedFeedback = feedback !== undefined ? (feedback) : (_jsx(AppSidebarFeedbackButton, { collapsed: collapsed }));
|
|
112
|
+
return (_jsxs("div", { ref: ref, "data-sidebar-footer": true, className: cn("shrink-0 border-t border-border p-2", collapsed ? "space-y-1" : "space-y-1.5", className), ...props, children: [resolvedFeedback, _jsxs("div", { "data-sidebar-footer-utilities": true, className: cn(collapsed
|
|
113
|
+
? "flex flex-col items-center gap-1"
|
|
114
|
+
: "flex items-center gap-0.5"), children: [orgSwitcher, footerExtras, collapseButton] })] }));
|
|
115
|
+
});
|
|
116
|
+
AppSidebarFooter.displayName = "AppSidebarFooter";
|
|
117
|
+
export const AppSidebar = forwardRef(({ collapsed: controlledCollapsed, onCollapsedChange: controlledOnCollapsedChange, defaultCollapsed = false, collapsible = true, storageKey, isMobile = false, mobileOpen, onMobileOpenChange, linkComponent, brandName, brandHref = "/", brandIcon, brandLink, badge, headerContent, items, secondaryItems, feedback, orgSwitcher, footerExtras, footerContent, expandLabel = "Expand sidebar", collapseLabel = "Collapse sidebar", className, children, ...props }, ref) => {
|
|
118
|
+
// Persistence hook if storageKey is provided and not controlled
|
|
119
|
+
const persistent = usePersistentSidebarCollapsed({
|
|
120
|
+
storageKey: storageKey ?? "app-sidebar-default-key",
|
|
121
|
+
defaultCollapsed,
|
|
122
|
+
});
|
|
123
|
+
const isControlled = controlledCollapsed !== undefined;
|
|
124
|
+
const isUsingStorage = !isControlled && Boolean(storageKey);
|
|
125
|
+
const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultCollapsed);
|
|
126
|
+
const collapsed = isControlled
|
|
127
|
+
? controlledCollapsed
|
|
128
|
+
: isUsingStorage
|
|
129
|
+
? persistent.collapsed
|
|
130
|
+
: uncontrolledCollapsed;
|
|
131
|
+
const setCollapsed = useCallback((value) => {
|
|
132
|
+
const next = typeof value === "function" ? value(collapsed) : value;
|
|
133
|
+
if (controlledOnCollapsedChange) {
|
|
134
|
+
controlledOnCollapsedChange(next);
|
|
135
|
+
}
|
|
136
|
+
if (isUsingStorage) {
|
|
137
|
+
persistent.setCollapsed(next);
|
|
138
|
+
}
|
|
139
|
+
if (!isControlled && !isUsingStorage) {
|
|
140
|
+
setUncontrolledCollapsed(next);
|
|
141
|
+
}
|
|
142
|
+
}, [
|
|
143
|
+
collapsed,
|
|
144
|
+
controlledOnCollapsedChange,
|
|
145
|
+
isControlled,
|
|
146
|
+
isUsingStorage,
|
|
147
|
+
persistent,
|
|
148
|
+
]);
|
|
149
|
+
const toggleCollapsed = useCallback(() => {
|
|
150
|
+
setCollapsed((prev) => !prev);
|
|
151
|
+
}, [setCollapsed]);
|
|
152
|
+
const showCollapsedSidebar = collapsed && !isMobile;
|
|
153
|
+
const LinkComponent = linkComponent ?? NativeSidebarLink;
|
|
154
|
+
// Only self-manage off-canvas transform when the caller controls mobileOpen.
|
|
155
|
+
// Sheet/drawer embeds leave mobileOpen undefined so content stays visible.
|
|
156
|
+
const ownsMobileDrawer = typeof mobileOpen === "boolean";
|
|
157
|
+
const contextValue = useMemo(() => ({
|
|
158
|
+
collapsed: showCollapsedSidebar,
|
|
159
|
+
setCollapsed,
|
|
160
|
+
toggleCollapsed,
|
|
161
|
+
isMobile,
|
|
162
|
+
LinkComponent,
|
|
163
|
+
}), [
|
|
164
|
+
showCollapsedSidebar,
|
|
165
|
+
setCollapsed,
|
|
166
|
+
toggleCollapsed,
|
|
167
|
+
isMobile,
|
|
168
|
+
LinkComponent,
|
|
169
|
+
]);
|
|
170
|
+
return (_jsx(AppSidebarContext.Provider, { value: contextValue, children: _jsx(TooltipProvider, { delayDuration: 0, children: _jsxs("aside", { ref: ref, "data-collapsed": showCollapsedSidebar ? "true" : "false", className: cn("flex h-full w-[260px] flex-col overflow-hidden border-e border-border bg-sidebar transition-[width,transform] duration-200 ease-out", ownsMobileDrawer
|
|
171
|
+
? "agent-layout-left-drawer fixed inset-y-0 start-0 z-50 md:static md:z-auto"
|
|
172
|
+
: "relative md:static", showCollapsedSidebar && "md:w-14", ownsMobileDrawer &&
|
|
173
|
+
(mobileOpen
|
|
174
|
+
? "translate-x-0"
|
|
175
|
+
: "-translate-x-full rtl:translate-x-full md:translate-x-0"), className), ...props, children: [headerContent ?? (_jsx(AppSidebarHeader, { brandName: brandName, brandHref: brandHref, brandIcon: brandIcon, brandLink: brandLink, badge: badge })), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: showCollapsedSidebar ? (_jsxs("nav", { className: "flex flex-col items-center gap-1 px-2 py-3", children: [items?.map((item) => (_jsx(AppSidebarNavItem, { to: item.to, href: item.href, label: item.label, icon: item.icon, active: item.active, count: item.count, badge: item.badge, onClick: item.onClick }, item.id ?? item.to ?? item.href ?? item.label))), children, secondaryItems && secondaryItems.length > 0 && (_jsx("div", { className: "mt-2 flex flex-col items-center gap-1 border-t border-border/70 pt-2", children: secondaryItems.map((item) => (_jsx(AppSidebarNavItem, { to: item.to, href: item.href, label: item.label, icon: item.icon, active: item.active, count: item.count, badge: item.badge, onClick: item.onClick }, item.id ?? item.to ?? item.href ?? item.label))) }))] })) : (_jsxs("nav", { className: "space-y-0.5 px-2 py-3", children: [items?.map((item) => {
|
|
176
|
+
if (item.children) {
|
|
177
|
+
return (_jsx(AppSidebarNavGroup, { to: item.to, href: item.href, label: item.label, icon: item.icon, active: item.active, count: item.count, actions: item.actions, children: item.children }, item.id ?? item.to ?? item.href ?? item.label));
|
|
178
|
+
}
|
|
179
|
+
return (_jsx(AppSidebarNavItem, { to: item.to, href: item.href, label: item.label, icon: item.icon, active: item.active, count: item.count, badge: item.badge, actions: item.actions, onClick: item.onClick }, item.id ?? item.to ?? item.href ?? item.label));
|
|
180
|
+
}), children, secondaryItems && secondaryItems.length > 0 && (_jsx("div", { className: "mt-3 space-y-0.5 border-t border-border/70 pt-3", children: secondaryItems.map((item) => (_jsx(AppSidebarNavItem, { to: item.to, href: item.href, label: item.label, icon: item.icon, active: item.active, count: item.count, badge: item.badge, actions: item.actions, onClick: item.onClick }, item.id ?? item.to ?? item.href ?? item.label))) }))] })) }), footerContent ?? (_jsx(AppSidebarFooter, { feedback: feedback, orgSwitcher: orgSwitcher, footerExtras: footerExtras, collapsible: collapsible, expandLabel: expandLabel, collapseLabel: collapseLabel }))] }) }) }));
|
|
181
|
+
});
|
|
182
|
+
AppSidebar.displayName = "AppSidebar";
|
|
183
|
+
//# sourceMappingURL=sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/app-shell/sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.spec.d.ts","sourceRoot":"","sources":["../../src/app-shell/sidebar.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { act } from "react";
|
|
4
|
+
import { createRoot } from "react-dom/client";
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { AppSidebar, AppSidebarNavItem, AppSidebarNavGroup, AppSidebarSection, } from "./sidebar.js";
|
|
7
|
+
describe("AppSidebar", () => {
|
|
8
|
+
let container;
|
|
9
|
+
let root;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
|
|
12
|
+
container = document.createElement("div");
|
|
13
|
+
document.body.appendChild(container);
|
|
14
|
+
root = createRoot(container);
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
act(() => root.unmount());
|
|
18
|
+
container.remove();
|
|
19
|
+
});
|
|
20
|
+
it("renders expanded sidebar with brand, items, and utilities", () => {
|
|
21
|
+
act(() => {
|
|
22
|
+
root.render(_jsx(AppSidebar, { brandName: "My App", brandHref: "/home", badge: _jsx("span", { "data-badge": true, children: "alpha" }), items: [
|
|
23
|
+
{ label: "Inbox", to: "/inbox", count: 5, active: true },
|
|
24
|
+
{ label: "Tasks", to: "/tasks" },
|
|
25
|
+
], secondaryItems: [{ label: "Archive", to: "/archive" }], feedback: _jsx("button", { type: "button", children: "Feedback" }), orgSwitcher: _jsx("button", { type: "button", children: "Acme Org" }) }));
|
|
26
|
+
});
|
|
27
|
+
const aside = container.querySelector("aside");
|
|
28
|
+
expect(aside).not.toBeNull();
|
|
29
|
+
expect(aside?.getAttribute("data-collapsed")).toBe("false");
|
|
30
|
+
expect(aside?.className).toContain("w-[260px]");
|
|
31
|
+
expect(container.textContent).toContain("My App");
|
|
32
|
+
expect(container.textContent).toContain("alpha");
|
|
33
|
+
expect(container.textContent).toContain("Inbox");
|
|
34
|
+
expect(container.textContent).toContain("5");
|
|
35
|
+
expect(container.textContent).toContain("Tasks");
|
|
36
|
+
expect(container.textContent).toContain("Archive");
|
|
37
|
+
expect(container.textContent).toContain("Feedback");
|
|
38
|
+
expect(container.textContent).toContain("Acme Org");
|
|
39
|
+
});
|
|
40
|
+
it("renders collapsed sidebar with md:w-14 and tooltips", () => {
|
|
41
|
+
act(() => {
|
|
42
|
+
root.render(_jsx(AppSidebar, { collapsed: true, brandName: "My App", badge: _jsx("span", { "data-badge": true, children: "alpha" }), items: [{ label: "Inbox", to: "/inbox" }] }));
|
|
43
|
+
});
|
|
44
|
+
const aside = container.querySelector("aside");
|
|
45
|
+
expect(aside?.getAttribute("data-collapsed")).toBe("true");
|
|
46
|
+
expect(aside?.className).toContain("md:w-14");
|
|
47
|
+
// In collapsed mode, brand name is hidden from screen, badge is present
|
|
48
|
+
expect(container.querySelector("[data-badge]")?.textContent).toBe("alpha");
|
|
49
|
+
});
|
|
50
|
+
it("toggles collapsed state via collapse button", () => {
|
|
51
|
+
const onCollapsedChange = vi.fn();
|
|
52
|
+
act(() => {
|
|
53
|
+
root.render(_jsx(AppSidebar, { collapsed: false, onCollapsedChange: onCollapsedChange, brandName: "My App" }));
|
|
54
|
+
});
|
|
55
|
+
const collapseButton = container.querySelector('button[aria-label="Collapse sidebar"]');
|
|
56
|
+
expect(collapseButton).not.toBeNull();
|
|
57
|
+
act(() => {
|
|
58
|
+
collapseButton?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
59
|
+
});
|
|
60
|
+
expect(onCollapsedChange).toHaveBeenCalledWith(true);
|
|
61
|
+
});
|
|
62
|
+
it("renders collapsible nav group and expands/collapses children", () => {
|
|
63
|
+
act(() => {
|
|
64
|
+
root.render(_jsx(AppSidebar, { brandName: "My App", children: _jsx(AppSidebarNavGroup, { label: "Projects", defaultOpen: false, children: _jsx("div", { children: "Project Alpha" }) }) }));
|
|
65
|
+
});
|
|
66
|
+
expect(container.textContent).toContain("Projects");
|
|
67
|
+
const toggleButton = container.querySelector('button[aria-label="Expand"]');
|
|
68
|
+
expect(toggleButton).not.toBeNull();
|
|
69
|
+
act(() => {
|
|
70
|
+
toggleButton?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
71
|
+
});
|
|
72
|
+
expect(container.textContent).toContain("Project Alpha");
|
|
73
|
+
});
|
|
74
|
+
it("renders sections with uppercase headers and dividers", () => {
|
|
75
|
+
act(() => {
|
|
76
|
+
root.render(_jsx(AppSidebar, { brandName: "My App", children: _jsx(AppSidebarSection, { title: "Favorites", children: _jsx(AppSidebarNavItem, { label: "Starred item" }) }) }));
|
|
77
|
+
});
|
|
78
|
+
expect(container.textContent).toContain("Favorites");
|
|
79
|
+
expect(container.textContent).toContain("Starred item");
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=sidebar.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.spec.js","sourceRoot":"","sources":["../../src/app-shell/sidebar.spec.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/app-shell/index.ts
CHANGED