@brainfish-ai/components 0.20.4 → 0.20.6

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.
@@ -2,10 +2,17 @@ import * as React from 'react';
2
2
  import { SidebarSimple, Sparkle, Question } from '@phosphor-icons/react';
3
3
  import { L as Logo } from './logo.BXk28Fqo.js';
4
4
  import { Button } from '../components/ui/button.js';
5
- import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem } from '../components/ui/dropdown-menu.js';
5
+ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuPortal, DropdownMenuSubContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuItem } from '../components/ui/dropdown-menu.js';
6
6
  import { c as cn } from './utils.Cwtlq8dh.js';
7
7
 
8
- function AccountDropdown({ accountPhoto, accountName, accountDropdownItems, ...props }) {
8
+ function AccountDropdown({
9
+ accountPhoto,
10
+ accountName,
11
+ accountDropdownItems,
12
+ side = "bottom",
13
+ align = "end",
14
+ ...props
15
+ }) {
9
16
  return /* @__PURE__ */ React.createElement(DropdownMenu, { ...props }, /* @__PURE__ */ React.createElement(DropdownMenuTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(Button, { size: "icon", variant: "ghost", className: "rounded-full", "aria-label": "Toggle account dropdown" }, /* @__PURE__ */ React.createElement(
10
17
  "img",
11
18
  {
@@ -15,7 +22,9 @@ function AccountDropdown({ accountPhoto, accountName, accountDropdownItems, ...p
15
22
  height: 32,
16
23
  className: "rounded-full border border-background"
17
24
  }
18
- ))), /* @__PURE__ */ React.createElement(DropdownMenuContent, { align: "end" }, /* @__PURE__ */ React.createElement(DropdownMenuGroup, null, accountDropdownItems.map((accountDropdownItem) => /* @__PURE__ */ React.createElement(DropdownMenuItem, { key: accountDropdownItem.id, onClick: accountDropdownItem.onClick }, accountDropdownItem.label)))));
25
+ ))), /* @__PURE__ */ React.createElement(DropdownMenuContent, { side, align }, /* @__PURE__ */ React.createElement(DropdownMenuGroup, null, accountDropdownItems.map(
26
+ (item) => item.type === "submenu" ? /* @__PURE__ */ React.createElement(DropdownMenuSub, { key: item.id }, /* @__PURE__ */ React.createElement(DropdownMenuSubTrigger, null, item.icon, item.label), /* @__PURE__ */ React.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React.createElement(DropdownMenuSubContent, null, item.value != null && item.onValueChange ? /* @__PURE__ */ React.createElement(DropdownMenuRadioGroup, { value: item.value, onValueChange: item.onValueChange }, item.items.map((option) => /* @__PURE__ */ React.createElement(DropdownMenuRadioItem, { key: option.id, value: option.value }, option.icon, option.label))) : item.items.map((option) => /* @__PURE__ */ React.createElement(DropdownMenuItem, { key: option.id, onClick: option.onClick }, option.icon, option.label))))) : /* @__PURE__ */ React.createElement(DropdownMenuItem, { key: item.id, onClick: item.onClick }, item.icon, item.label)
27
+ ))));
19
28
  }
20
29
 
21
30
  const HEADER_NAV_HEIGHT = 60;
@@ -27,6 +36,8 @@ const HeaderNav = React.forwardRef(function HeaderNav2({
27
36
  accountName,
28
37
  accountPhoto,
29
38
  accountDropdownItems,
39
+ side,
40
+ align,
30
41
  showSuggestionAction,
31
42
  suggestionAction,
32
43
  onSuggestionActionClick,
@@ -51,10 +62,12 @@ const HeaderNav = React.forwardRef(function HeaderNav2({
51
62
  {
52
63
  accountName,
53
64
  accountPhoto,
54
- accountDropdownItems
65
+ accountDropdownItems,
66
+ side,
67
+ align
55
68
  }
56
69
  ))));
57
70
  });
58
71
 
59
72
  export { HEADER_NAV_HEIGHT as H, HeaderNav as a };
60
- //# sourceMappingURL=header-nav.FxSa8fGL.js.map
73
+ //# sourceMappingURL=header-nav.D42PynKd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-nav.D42PynKd.js","sources":["../../../src/layouts/header-nav/account-dropdown.tsx","../../../src/layouts/header-nav/header-nav.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '../../components/ui/dropdown-menu';\nimport { Button } from '../../components/ui/button';\n\nexport type AccountDropdownActionItem = {\n type?: 'action';\n id: string;\n label: string;\n icon?: React.ReactNode;\n onClick: () => void;\n};\n\nexport type AccountDropdownSubOption = {\n id: string;\n label: string;\n icon?: React.ReactNode;\n /** Required for radio mode. */\n value?: string;\n /** Used in plain (non-radio) mode. */\n onClick?: () => void;\n};\n\n/** Sub-option with a required `value`, used in radio-mode submenus. */\nexport type AccountDropdownRadioSubOption = Omit<AccountDropdownSubOption, 'value' | 'onClick'> & {\n value: string;\n};\n\ntype AccountDropdownSubmenuBase = {\n type: 'submenu';\n id: string;\n label: string;\n icon?: React.ReactNode;\n};\n\nexport type AccountDropdownSubmenuItem = AccountDropdownSubmenuBase &\n (\n | {\n /** The currently selected value. When provided with onValueChange, renders items as a radio group with selection indicators. */\n value: string;\n onValueChange: (value: string) => void;\n items: AccountDropdownRadioSubOption[];\n }\n | {\n value?: never;\n onValueChange?: never;\n items: AccountDropdownSubOption[];\n }\n );\n\nexport type AccountDropdownItem = AccountDropdownActionItem | AccountDropdownSubmenuItem;\n\nexport interface AccountDropdownProps extends React.ComponentPropsWithoutRef<typeof DropdownMenu> {\n accountPhoto: string;\n accountName: string;\n accountDropdownItems: AccountDropdownItem[];\n /** Side the dropdown opens on relative to the trigger. Defaults to 'bottom'. */\n side?: React.ComponentPropsWithoutRef<typeof DropdownMenuContent>['side'];\n /** Alignment of the dropdown relative to the trigger. Defaults to 'end'. */\n align?: React.ComponentPropsWithoutRef<typeof DropdownMenuContent>['align'];\n}\n\nexport function AccountDropdown({\n accountPhoto,\n accountName,\n accountDropdownItems,\n side = 'bottom',\n align = 'end',\n ...props\n}: AccountDropdownProps) {\n return (\n <DropdownMenu {...props}>\n <DropdownMenuTrigger asChild>\n <Button size=\"icon\" variant=\"ghost\" className=\"rounded-full\" aria-label=\"Toggle account dropdown\">\n <img\n src={accountPhoto}\n alt={`${accountName}'s account`}\n width={32}\n height={32}\n className=\"rounded-full border border-background\"\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side={side} align={align}>\n <DropdownMenuGroup>\n {accountDropdownItems.map((item) =>\n item.type === 'submenu' ? (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger>\n {item.icon}\n {item.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.value != null && item.onValueChange ? (\n <DropdownMenuRadioGroup value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((option) => (\n <DropdownMenuRadioItem key={option.id} value={option.value}>\n {option.icon}\n {option.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n ) : (\n item.items.map((option) => (\n <DropdownMenuItem key={option.id} onClick={option.onClick}>\n {option.icon}\n {option.label}\n </DropdownMenuItem>\n ))\n )}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n ) : (\n <DropdownMenuItem key={item.id} onClick={item.onClick}>\n {item.icon}\n {item.label}\n </DropdownMenuItem>\n ),\n )}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import * as React from 'react';\nimport { Question, SidebarSimple, Sparkle } from '@phosphor-icons/react';\n\nimport { Logo } from '../../components/logo';\nimport { Button } from '../../components/ui/button';\nimport { AccountDropdown, AccountDropdownProps } from './account-dropdown';\n\nimport { cn } from '@/lib/utils';\n\ninterface HeaderNavProps extends React.ComponentPropsWithoutRef<'header'>, Omit<AccountDropdownProps, 'dir'> {\n isSideNavOpen?: boolean;\n onSideNavigationToggle: () => void;\n onHelpClick: () => void;\n showSuggestionAction?: boolean;\n suggestionAction?: React.ReactNode;\n onSuggestionActionClick?: () => void;\n showSidebarToggle?: boolean;\n /** Ref for the sidebar toggle button; used by layout to move focus here when sidebar is collapsed. */\n sidebarToggleRef?: React.Ref<HTMLButtonElement>;\n}\n\nexport const HEADER_NAV_HEIGHT = 60;\n\nexport const HeaderNav = React.forwardRef<HTMLElement, HeaderNavProps>(function HeaderNav(\n {\n className,\n isSideNavOpen = false,\n onSideNavigationToggle,\n onHelpClick,\n accountName,\n accountPhoto,\n accountDropdownItems,\n side,\n align,\n showSuggestionAction,\n suggestionAction,\n onSuggestionActionClick,\n showSidebarToggle = true,\n sidebarToggleRef,\n ...props\n },\n ref,\n) {\n const hasSuggestionAction = showSuggestionAction && !!suggestionAction && !!onSuggestionActionClick;\n\n return (\n <header ref={ref} {...props} className={cn('px-4 py-3', className)}>\n <nav aria-label=\"Account navigation\" className=\"flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <a href=\"/\">\n <Logo variant=\"full\" color=\"outline\" width={140} height={22} />\n </a>\n {showSidebarToggle && (\n <Button\n ref={sidebarToggleRef}\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Toggle side navigation\"\n className=\"[&_svg]:size-6\"\n onClick={onSideNavigationToggle}\n >\n <SidebarSimple aria-hidden=\"true\" weight={isSideNavOpen ? 'fill' : 'regular'} />\n </Button>\n )}\n </div>\n <div className=\"flex items-center gap-4\">\n {hasSuggestionAction && (\n <Button variant=\"suggestion\" onClick={onSuggestionActionClick}>\n <Sparkle weight=\"fill\" aria-hidden=\"true\" /> {suggestionAction}\n </Button>\n )}\n <Button size=\"icon\" variant=\"ghost\" aria-label=\"Open help\" className=\"[&_svg]:size-6\" onClick={onHelpClick}>\n <Question aria-hidden=\"true\" />\n </Button>\n <AccountDropdown\n accountName={accountName}\n accountPhoto={accountPhoto}\n accountDropdownItems={accountDropdownItems}\n side={side}\n align={align}\n />\n </div>\n </nav>\n </header>\n );\n});\n"],"names":["HeaderNav"],"mappings":";;;;;;;AA0EO,SAAS,eAAA,CAAgB;AAAA,EAC9B,YAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,KAAA,GAAQ,KAAA;AAAA,EACR,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,2CACG,YAAA,EAAA,EAAc,GAAG,KAAA,EAAA,kBAChB,KAAA,CAAA,aAAA,CAAC,uBAAoB,OAAA,EAAO,IAAA,EAAA,kBAC1B,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,MAAK,MAAA,EAAO,OAAA,EAAQ,SAAQ,SAAA,EAAU,cAAA,EAAe,cAAW,yBAAA,EAAA,kBACtE,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,GAAA,EAAK,GAAG,WAAW,CAAA,UAAA,CAAA;AAAA,MACnB,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,SAAA,EAAU;AAAA;AAAA,GAEd,CACF,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,uBAAoB,IAAA,EAAY,KAAA,EAAA,kBAC/B,KAAA,CAAA,aAAA,CAAC,iBAAA,EAAA,IAAA,EACE,oBAAA,CAAqB,GAAA;AAAA,IAAI,CAAC,IAAA,KACzB,IAAA,CAAK,SAAS,SAAA,mBACZ,KAAA,CAAA,aAAA,CAAC,mBAAgB,GAAA,EAAK,IAAA,CAAK,EAAA,EAAA,kBACzB,KAAA,CAAA,aAAA,CAAC,8BACE,IAAA,CAAK,IAAA,EACL,KAAK,KACR,CAAA,sCACC,kBAAA,EAAA,IAAA,kBACC,KAAA,CAAA,aAAA,CAAC,sBAAA,EAAA,IAAA,EACE,IAAA,CAAK,SAAS,IAAA,IAAQ,IAAA,CAAK,gCAC1B,KAAA,CAAA,aAAA,CAAC,sBAAA,EAAA,EAAuB,OAAO,IAAA,CAAK,KAAA,EAAO,eAAe,IAAA,CAAK,aAAA,EAAA,EAC5D,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,MAAA,qBACf,KAAA,CAAA,aAAA,CAAC,yBAAsB,GAAA,EAAK,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,OAAO,KAAA,EAAA,EAClD,MAAA,CAAO,MACP,MAAA,CAAO,KACV,CACD,CACH,CAAA,GAEA,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,MAAA,qBACd,KAAA,CAAA,aAAA,CAAC,oBAAiB,GAAA,EAAK,MAAA,CAAO,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,EAAA,EAC/C,MAAA,CAAO,MACP,MAAA,CAAO,KACV,CACD,CAEL,CACF,CACF,CAAA,mBAEA,KAAA,CAAA,aAAA,CAAC,oBAAiB,GAAA,EAAK,IAAA,CAAK,IAAI,OAAA,EAAS,IAAA,CAAK,WAC3C,IAAA,CAAK,IAAA,EACL,KAAK,KACR;AAAA,GAGN,CACF,CACF,CAAA;AAEJ;;ACpHO,MAAM,iBAAA,GAAoB;AAE1B,MAAM,SAAA,GAAY,KAAA,CAAM,UAAA,CAAwC,SAASA,UAAAA,CAC9E;AAAA,EACE,SAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,sBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,uBAAA;AAAA,EACA,iBAAA,GAAoB,IAAA;AAAA,EACpB,gBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,sBAAsB,oBAAA,IAAwB,CAAC,CAAC,gBAAA,IAAoB,CAAC,CAAC,uBAAA;AAE5E,EAAA,2CACG,QAAA,EAAA,EAAO,GAAA,EAAW,GAAG,KAAA,EAAO,WAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAAA,sCAC9D,KAAA,EAAA,EAAI,YAAA,EAAW,oBAAA,EAAqB,SAAA,EAAU,uDAC7C,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,sCACZ,GAAA,EAAA,EAAE,IAAA,EAAK,GAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,QAAK,OAAA,EAAQ,MAAA,EAAO,KAAA,EAAM,SAAA,EAAU,OAAO,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAI,CAC/D,GACC,iBAAA,oBACC,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,gBAAA;AAAA,MACL,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,OAAA;AAAA,MACR,YAAA,EAAW,wBAAA;AAAA,MACX,SAAA,EAAU,gBAAA;AAAA,MACV,OAAA,EAAS;AAAA,KAAA;AAAA,wCAER,aAAA,EAAA,EAAc,aAAA,EAAY,QAAO,MAAA,EAAQ,aAAA,GAAgB,SAAS,SAAA,EAAW;AAAA,GAGpF,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAAA,EACZ,uCACC,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,YAAA,EAAa,SAAS,uBAAA,EAAA,kBACpC,KAAA,CAAA,aAAA,CAAC,WAAQ,MAAA,EAAO,MAAA,EAAO,eAAY,MAAA,EAAO,CAAA,EAAE,GAAA,EAAE,gBAChD,mBAEF,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,MAAK,MAAA,EAAO,OAAA,EAAQ,SAAQ,YAAA,EAAW,WAAA,EAAY,SAAA,EAAU,gBAAA,EAAiB,SAAS,WAAA,EAAA,kBAC7F,KAAA,CAAA,aAAA,CAAC,YAAS,aAAA,EAAY,MAAA,EAAO,CAC/B,CAAA,kBACA,KAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,YAAA;AAAA,MACA,oBAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA;AAAA,GAEJ,CACF,CACF,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,430 @@
1
+ import React__default, { useContext, useState, useRef, useEffect, useCallback, useMemo, isValidElement } from 'react';
2
+ import { useMediaQuery } from 'usehooks-ts';
3
+ import { a as HeaderNav, H as HEADER_NAV_HEIGHT } from './header-nav.D42PynKd.js';
4
+ import { ScrollArea } from '../components/ui/scroll-area.js';
5
+ import { c as cn } from './utils.Cwtlq8dh.js';
6
+ import { Item } from '../components/ui/item.js';
7
+ import { S as Sidebar } from './sidebar.NrHnIkbU.js';
8
+
9
+ const FullLayoutNavStateContext = React__default.createContext(null);
10
+ const FullLayoutContext = React__default.createContext(null);
11
+ function FullLayoutProvider({ value, children }) {
12
+ return /* @__PURE__ */ React__default.createElement(FullLayoutContext.Provider, { value }, children);
13
+ }
14
+ function useFullLayoutContext() {
15
+ return React__default.useContext(FullLayoutContext);
16
+ }
17
+ function useRightSidebar() {
18
+ const ctx = React__default.useContext(FullLayoutContext);
19
+ if (!ctx) {
20
+ throw new Error("useRightSidebar must be used within a <FullLayout> component.");
21
+ }
22
+ return {
23
+ isOpen: ctx.isRightSidebarOpen,
24
+ open: ctx.openRightSidebar,
25
+ close: ctx.closeRightSidebar,
26
+ toggle: ctx.toggleRightSidebar
27
+ };
28
+ }
29
+
30
+ function MainArea({ children }) {
31
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, children);
32
+ }
33
+ MainArea.displayName = "FullLayout.MainArea";
34
+
35
+ function Body({ children }) {
36
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, children);
37
+ }
38
+ Body.displayName = "FullLayout.Body";
39
+
40
+ function Header(props) {
41
+ const ctx = useFullLayoutContext();
42
+ if (!ctx) return null;
43
+ return /* @__PURE__ */ React__default.createElement(
44
+ HeaderNav,
45
+ {
46
+ ...props,
47
+ showSidebarToggle: !ctx.disableLeftSideNav,
48
+ isSideNavOpen: ctx.isSideNavOpen,
49
+ onSideNavigationToggle: ctx.toggleSidebar,
50
+ onHelpClick: ctx.toggleRightSidebar,
51
+ sidebarToggleRef: ctx.sidebarToggleRef
52
+ }
53
+ );
54
+ }
55
+ Header.displayName = "FullLayout.Header";
56
+
57
+ const FullLayoutLeftSidebar = React__default.forwardRef(
58
+ ({
59
+ open,
60
+ widthPx,
61
+ onResizeStart,
62
+ onResizeKeyDown,
63
+ ariaValuenow,
64
+ ariaValuemin,
65
+ ariaValuemax,
66
+ sidebarProps,
67
+ className,
68
+ ...props
69
+ }, ref) => {
70
+ return /* @__PURE__ */ React__default.createElement(
71
+ "div",
72
+ {
73
+ ref,
74
+ id: "left-sidebar-pane",
75
+ "data-slot": "full-layout-left-sidebar",
76
+ tabIndex: -1,
77
+ "data-state": open ? "open" : "closed",
78
+ className: cn(
79
+ "min-w-0 overflow-hidden flex flex-col relative transition-[width] data-[state=closed]:w-0 data-[state=closed]:pointer-events-none data-[state=open]:w-full md:data-[state=open]:w-[var(--left-nav-width)]",
80
+ className
81
+ ),
82
+ style: {
83
+ ["--left-nav-width"]: `${widthPx}px`
84
+ },
85
+ ...props
86
+ },
87
+ /* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100dvh-var(--header-nav-height))]" }, /* @__PURE__ */ React__default.createElement(Sidebar, { ...sidebarProps, collapsed: !open, className: "w-[inherit] transition-[width]" })),
88
+ /* @__PURE__ */ React__default.createElement(
89
+ "div",
90
+ {
91
+ role: "separator",
92
+ "aria-orientation": "vertical",
93
+ "aria-valuenow": ariaValuenow,
94
+ "aria-valuemin": ariaValuemin,
95
+ "aria-valuemax": ariaValuemax,
96
+ "aria-label": "Resize left sidebar",
97
+ "aria-controls": "left-sidebar-pane",
98
+ "data-slot": "full-layout-left-sidebar-resize-handle",
99
+ tabIndex: 0,
100
+ onMouseDown: onResizeStart,
101
+ onKeyDown: onResizeKeyDown,
102
+ className: "hidden lg:block absolute top-0 right-0 bottom-0 w-1 bg-transparent hover:bg-blue-500 cursor-ew-resize shrink-0 [&>div]:pointer-events-none"
103
+ },
104
+ /* @__PURE__ */ React__default.createElement("div", { className: "absolute inset-y-0 -right-1 w-3" })
105
+ )
106
+ );
107
+ }
108
+ );
109
+ FullLayoutLeftSidebar.displayName = "FullLayoutLeftSidebar";
110
+
111
+ function LeftSidebar(props) {
112
+ const ctx = useFullLayoutContext();
113
+ const navState = useContext(FullLayoutNavStateContext);
114
+ if (!ctx) return null;
115
+ if (ctx.disableLeftSideNav) return null;
116
+ const sidebarProps = navState != null ? {
117
+ ...props,
118
+ appNavActiveId: navState.appNavActiveId ?? props.appNavActiveId,
119
+ sectionNavActiveId: navState.sectionNavActiveId ?? props.sectionNavActiveId,
120
+ activeArticleId: navState.activeArticleId ?? props.activeArticleId
121
+ } : props;
122
+ return /* @__PURE__ */ React__default.createElement(
123
+ FullLayoutLeftSidebar,
124
+ {
125
+ ref: ctx.sideNavRef,
126
+ open: ctx.isSideNavOpen,
127
+ widthPx: ctx.leftNavWidth,
128
+ onResizeStart: ctx.handleResizeStart,
129
+ onResizeKeyDown: ctx.handleResizeKeyDown,
130
+ ariaValuenow: ctx.ariaValuenow,
131
+ ariaValuemin: ctx.ariaValuemin,
132
+ ariaValuemax: ctx.ariaValuemax,
133
+ sidebarProps
134
+ }
135
+ );
136
+ }
137
+ LeftSidebar.displayName = "FullLayout.LeftSidebar";
138
+
139
+ function Main({ children }) {
140
+ return /* @__PURE__ */ React__default.createElement(Item, { className: "p-0" }, children);
141
+ }
142
+ Main.displayName = "FullLayout.Main";
143
+
144
+ const FullLayoutRightSidebar = React__default.forwardRef(
145
+ ({ open, className, children, ...props }, ref) => {
146
+ return /* @__PURE__ */ React__default.createElement(
147
+ "aside",
148
+ {
149
+ ref,
150
+ "data-slot": "full-layout-right-sidebar",
151
+ "data-state": open ? "open" : "closed",
152
+ className: cn(
153
+ "bg-background shadow-lg flex flex-col",
154
+ "fixed h-[calc(100dvh-var(--header-nav-height))] z-10 w-screen transition-transform duration-300 ease-in-out data-[state=closed]:translate-x-full data-[state=open]:translate-x-0",
155
+ "md:relative md:h-full md:w-80 md:top-0",
156
+ className
157
+ ),
158
+ ...props
159
+ },
160
+ /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col flex-1 min-h-0 overflow-hidden", "data-slot": "full-layout-right-sidebar-content" }, /* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100dvh-var(--header-nav-height))]" }, children))
161
+ );
162
+ }
163
+ );
164
+ FullLayoutRightSidebar.displayName = "FullLayoutRightSidebar";
165
+
166
+ function RightSidebar({ children }) {
167
+ const ctx = useFullLayoutContext();
168
+ if (!ctx) return null;
169
+ return /* @__PURE__ */ React__default.createElement(
170
+ FullLayoutRightSidebar,
171
+ {
172
+ ref: ctx.rightSidebarRef,
173
+ open: ctx.isRightSidebarOpen,
174
+ className: "top-[var(--header-nav-height)]"
175
+ },
176
+ children
177
+ );
178
+ }
179
+ RightSidebar.displayName = "FullLayout.RightSidebar";
180
+
181
+ const MIN_SIDENAV_WIDTH = 260;
182
+ const CLOSE_SIDENAV_THRESHOLD = MIN_SIDENAV_WIDTH - 32;
183
+ const MAX_SIDENAV_WIDTH = 350;
184
+ const RIGHT_SIDEBAR_WIDTH = 320;
185
+ function extractSlots(children, refs) {
186
+ const out = {};
187
+ const arr = React__default.Children.toArray(children);
188
+ for (const key of Object.keys(refs)) {
189
+ const match = arr.find((c) => isValidElement(c) && c.type === refs[key]);
190
+ out[key] = match ?? null;
191
+ }
192
+ return out;
193
+ }
194
+ function FullLayoutRoot({ children, disableLeftSideNav = false, className }) {
195
+ const [isSideNavOpen, setIsSideNavOpen] = useState(() => typeof window !== "undefined" && window.innerWidth > 767);
196
+ const [isRightSidebarOpen, setIsRightSidebarOpen] = useState(false);
197
+ const [leftNavWidth, setLeftNavWidth] = useState(MIN_SIDENAV_WIDTH);
198
+ const [isResizing, setIsResizing] = useState(false);
199
+ const [gridWidth, setGridWidth] = useState(() => typeof window !== "undefined" ? window.innerWidth : 0);
200
+ const sideNavRef = useRef(null);
201
+ const rightSidebarRef = useRef(null);
202
+ const sidebarToggleRef = useRef(null);
203
+ const gridRef = useRef(null);
204
+ const prevSideNavOpenRef = useRef(isSideNavOpen);
205
+ const resizeAcRef = useRef(null);
206
+ const isMobile = useMediaQuery("(max-width: 767px)");
207
+ const isWideDesktop = useMediaQuery("(min-width: 1280px)");
208
+ useEffect(() => {
209
+ document.body.style.overflow = "hidden";
210
+ return () => {
211
+ document.body.style.overflow = "";
212
+ };
213
+ }, []);
214
+ useEffect(() => {
215
+ const el = gridRef.current;
216
+ if (!el) return;
217
+ const ro = new ResizeObserver(([entry]) => setGridWidth(entry.contentRect.width));
218
+ ro.observe(el);
219
+ return () => ro.disconnect();
220
+ }, []);
221
+ const closeOtherSidebar = useCallback(
222
+ (opening) => {
223
+ if (isWideDesktop) return;
224
+ if (opening === "left") setIsRightSidebarOpen(false);
225
+ else setIsSideNavOpen(false);
226
+ },
227
+ [isWideDesktop]
228
+ );
229
+ const showSidenav = useCallback(() => {
230
+ closeOtherSidebar("left");
231
+ setIsSideNavOpen(true);
232
+ setLeftNavWidth(MIN_SIDENAV_WIDTH);
233
+ sideNavRef.current?.focus();
234
+ }, [closeOtherSidebar]);
235
+ const toggleSidebar = useCallback(() => {
236
+ closeOtherSidebar("left");
237
+ setIsSideNavOpen((prev) => !prev);
238
+ }, [closeOtherSidebar]);
239
+ const openRightSidebar = useCallback(() => {
240
+ closeOtherSidebar("right");
241
+ setIsRightSidebarOpen(true);
242
+ }, [closeOtherSidebar]);
243
+ const closeRightSidebar = useCallback(() => {
244
+ setIsRightSidebarOpen(false);
245
+ }, []);
246
+ const toggleRightSidebar = useCallback(() => {
247
+ closeOtherSidebar("right");
248
+ setIsRightSidebarOpen((prev) => !prev);
249
+ }, [closeOtherSidebar]);
250
+ const applyLeftNavWidth = useCallback((newWidth, useThreshold = true) => {
251
+ const threshold = useThreshold ? CLOSE_SIDENAV_THRESHOLD : MIN_SIDENAV_WIDTH;
252
+ if (newWidth < threshold) {
253
+ setLeftNavWidth(MIN_SIDENAV_WIDTH);
254
+ setIsSideNavOpen(false);
255
+ return true;
256
+ } else {
257
+ setLeftNavWidth(Math.min(MAX_SIDENAV_WIDTH, newWidth));
258
+ return false;
259
+ }
260
+ }, []);
261
+ const handleResizeStart = useCallback((e) => {
262
+ e.preventDefault();
263
+ resizeAcRef.current = new AbortController();
264
+ setIsResizing(true);
265
+ }, []);
266
+ const endResize = useCallback(() => {
267
+ setIsResizing(false);
268
+ document.body.style.cursor = "";
269
+ document.body.style.userSelect = "";
270
+ }, []);
271
+ const handleMouseMove = useCallback(
272
+ (e) => {
273
+ if (!isResizing) return;
274
+ if (applyLeftNavWidth(e.clientX)) {
275
+ endResize();
276
+ }
277
+ },
278
+ [isResizing, applyLeftNavWidth, endResize]
279
+ );
280
+ const handleMouseUp = useCallback(() => endResize(), [endResize]);
281
+ const setInert = useCallback((el, open) => {
282
+ if (!el) return;
283
+ if (open) el.removeAttribute("inert");
284
+ else el.setAttribute("inert", "");
285
+ }, []);
286
+ useEffect(() => {
287
+ setInert(sideNavRef.current, isSideNavOpen);
288
+ setInert(rightSidebarRef.current, isRightSidebarOpen);
289
+ }, [isSideNavOpen, isRightSidebarOpen]);
290
+ useEffect(() => {
291
+ if (!isResizing || !resizeAcRef.current) return;
292
+ const { signal } = resizeAcRef.current;
293
+ document.body.style.cursor = "ew-resize";
294
+ document.body.style.userSelect = "none";
295
+ document.addEventListener("mousemove", handleMouseMove, { signal });
296
+ document.addEventListener("mouseup", handleMouseUp, { signal });
297
+ window.addEventListener("mouseup", handleMouseUp, { signal });
298
+ setInert(sideNavRef.current, false);
299
+ return () => {
300
+ resizeAcRef.current?.abort();
301
+ resizeAcRef.current = null;
302
+ document.body.style.cursor = "";
303
+ document.body.style.userSelect = "";
304
+ setInert(sideNavRef.current, true);
305
+ };
306
+ }, [isResizing]);
307
+ const handleResizeKeyDown = useCallback(
308
+ (e) => {
309
+ const step = 16;
310
+ if (e.key === "ArrowLeft") {
311
+ e.preventDefault();
312
+ applyLeftNavWidth(leftNavWidth - step, false);
313
+ } else if (e.key === "ArrowRight") {
314
+ e.preventDefault();
315
+ applyLeftNavWidth(Math.min(MAX_SIDENAV_WIDTH, leftNavWidth + step));
316
+ }
317
+ },
318
+ [leftNavWidth]
319
+ );
320
+ const leftCol = disableLeftSideNav ? 0 : isSideNavOpen ? isMobile ? gridWidth : leftNavWidth : 0;
321
+ const rightCol = isMobile ? 0 : isRightSidebarOpen ? RIGHT_SIDEBAR_WIDTH : 0;
322
+ useEffect(() => {
323
+ setIsSideNavOpen(isMobile ? false : true);
324
+ }, [isMobile]);
325
+ useEffect(() => {
326
+ if (prevSideNavOpenRef.current && !isSideNavOpen) {
327
+ sidebarToggleRef.current?.focus();
328
+ }
329
+ prevSideNavOpenRef.current = isSideNavOpen;
330
+ }, [isSideNavOpen]);
331
+ const ariaValuenow = Math.round((leftNavWidth - MIN_SIDENAV_WIDTH) / (MAX_SIDENAV_WIDTH - MIN_SIDENAV_WIDTH) * 100);
332
+ const layoutContextValue = useMemo(
333
+ () => ({
334
+ isSideNavOpen,
335
+ isRightSidebarOpen,
336
+ toggleSidebar,
337
+ openRightSidebar,
338
+ closeRightSidebar,
339
+ toggleRightSidebar,
340
+ showSidenav,
341
+ disableLeftSideNav: disableLeftSideNav ?? false,
342
+ leftNavWidth,
343
+ isMobile,
344
+ sideNavRef,
345
+ rightSidebarRef,
346
+ sidebarToggleRef,
347
+ handleResizeStart,
348
+ handleResizeKeyDown,
349
+ ariaValuenow,
350
+ ariaValuemin: 0,
351
+ ariaValuemax: 100
352
+ }),
353
+ [
354
+ isSideNavOpen,
355
+ isRightSidebarOpen,
356
+ toggleSidebar,
357
+ openRightSidebar,
358
+ closeRightSidebar,
359
+ toggleRightSidebar,
360
+ showSidenav,
361
+ leftNavWidth,
362
+ isMobile,
363
+ disableLeftSideNav,
364
+ handleResizeStart,
365
+ handleResizeKeyDown,
366
+ ariaValuenow
367
+ ]
368
+ );
369
+ const { MainArea: mainArea, RightSidebar: rightSidebar } = extractSlots(children, {
370
+ MainArea: MainArea,
371
+ RightSidebar: RightSidebar
372
+ });
373
+ const mainAreaChildren = isValidElement(mainArea) ? mainArea.props.children : null;
374
+ const { Header: header, Body: body } = extractSlots(mainAreaChildren ?? null, {
375
+ Header: Header,
376
+ Body: Body
377
+ });
378
+ const bodyChildren = isValidElement(body) ? body.props.children : null;
379
+ const { LeftSidebar: leftSidebar, Main: main } = extractSlots(bodyChildren ?? null, {
380
+ LeftSidebar: LeftSidebar,
381
+ Main: Main
382
+ });
383
+ const hasRightSidebar = rightSidebar != null;
384
+ return /* @__PURE__ */ React__default.createElement(FullLayoutProvider, { value: layoutContextValue }, /* @__PURE__ */ React__default.createElement(
385
+ "div",
386
+ {
387
+ className: cn(
388
+ "min-h-screen w-screen bg-background grid transition-[grid-template-columns] duration-300 ease-in-out",
389
+ className
390
+ ),
391
+ style: {
392
+ gridTemplateColumns: hasRightSidebar ? "minmax(0, 1fr) var(--right-col)" : "minmax(0, 1fr)",
393
+ ["--right-col"]: hasRightSidebar ? `${rightCol}px` : "0px",
394
+ ["--header-nav-height"]: `${HEADER_NAV_HEIGHT}px`
395
+ }
396
+ },
397
+ /* @__PURE__ */ React__default.createElement("div", { className: "min-w-0 grid grid-rows-[auto_1fr]" }, header, /* @__PURE__ */ React__default.createElement(
398
+ "div",
399
+ {
400
+ ref: gridRef,
401
+ "data-sidenav-state": isSideNavOpen ? "open" : "closed",
402
+ "data-right-sidebar-state": isRightSidebarOpen ? "open" : "closed",
403
+ className: cn(
404
+ "group/sidenav group/rightsidebar min-h-0 min-w-0 grid transition-[grid-template-columns] ease-linear"
405
+ ),
406
+ style: {
407
+ gridTemplateColumns: `var(--left-col) minmax(0, 1fr)`,
408
+ ["--left-col"]: `${leftCol}px`
409
+ }
410
+ },
411
+ disableLeftSideNav ? /* @__PURE__ */ React__default.createElement("div", { className: "w-0" }) : leftSidebar,
412
+ /* @__PURE__ */ React__default.createElement("div", { className: cn("relative md:mr-4", { "md:mx-4": !isSideNavOpen || disableLeftSideNav }) }, /* @__PURE__ */ React__default.createElement(ScrollArea, { className: " bg-surface h-[calc(100dvh-var(--header-nav-height))] md:h-[calc(100dvh-var(--header-nav-height)-1rem)] md:shadow-[2px_4px_12px_0_rgba(0,0,0,0.14)] md:dark:shadow-[2px_4px_12px_0_rgba(255,255,255,0.14)] md:rounded-lg" }, /* @__PURE__ */ React__default.createElement("main", { className: cn("min-w-0 overflow-visible relative p-4 md:p-8") }, main)), /* @__PURE__ */ React__default.createElement("div", { className: "from-background via-background/90 to-background/40 bg-gradient-to-t blur-xs sticky bottom-0 md:bottom-4 z-10 h-4 md:h-8 shrink-0 rounded-lg mr-4" }))
413
+ )),
414
+ hasRightSidebar ? rightSidebar : null
415
+ ));
416
+ }
417
+ function fullLayoutRootPropsAreEqual(prev, next) {
418
+ return prev.children === next.children && prev.className === next.className && prev.disableLeftSideNav === next.disableLeftSideNav;
419
+ }
420
+ const FullLayout = Object.assign(React__default.memo(FullLayoutRoot, fullLayoutRootPropsAreEqual), {
421
+ MainArea: MainArea,
422
+ Body: Body,
423
+ Header: Header,
424
+ LeftSidebar: LeftSidebar,
425
+ Main: Main,
426
+ RightSidebar: RightSidebar
427
+ });
428
+
429
+ export { FullLayout as F, FullLayoutProvider as a, useRightSidebar as b, FullLayoutNavStateContext as c, FullLayoutLeftSidebar as d, FullLayoutRightSidebar as e, useFullLayoutContext as u };
430
+ //# sourceMappingURL=layout.C3eMxnqI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.C3eMxnqI.js","sources":["../../../src/layouts/full-layout/context.tsx","../../../src/layouts/full-layout/components/main-area.tsx","../../../src/layouts/full-layout/components/body.tsx","../../../src/layouts/full-layout/components/header.tsx","../../../src/layouts/full-layout/left-sidebar-pane.tsx","../../../src/layouts/full-layout/components/left-sidebar.tsx","../../../src/layouts/full-layout/components/main.tsx","../../../src/layouts/full-layout/right-sidebar-pane.tsx","../../../src/layouts/full-layout/components/right-sidebar.tsx","../../../src/layouts/full-layout/layout.tsx"],"sourcesContent":["import React from 'react';\n\n/** Nav state derived from route (e.g. active ids). Provided by Platform; when null, layout uses props only. */\nexport interface FullLayoutNavState {\n appNavActiveId?: string;\n sectionNavActiveId?: string;\n activeArticleId?: string;\n}\n\nconst FullLayoutNavStateContext = React.createContext<FullLayoutNavState | null>(null);\n\nexport { FullLayoutNavStateContext };\n\nexport interface FullLayoutContextValue {\n isSideNavOpen: boolean;\n isRightSidebarOpen: boolean;\n toggleSidebar: () => void;\n openRightSidebar: () => void;\n closeRightSidebar: () => void;\n toggleRightSidebar: () => void;\n showSidenav: () => void;\n disableLeftSideNav: boolean;\n leftNavWidth: number;\n isMobile: boolean;\n sideNavRef: React.RefObject<HTMLDivElement | null>;\n rightSidebarRef: React.RefObject<HTMLElement | null>;\n sidebarToggleRef: React.RefObject<HTMLButtonElement | null>;\n handleResizeStart: (e: React.MouseEvent) => void;\n handleResizeKeyDown: (e: React.KeyboardEvent) => void;\n ariaValuenow: number;\n ariaValuemin: number;\n ariaValuemax: number;\n}\n\nconst FullLayoutContext = React.createContext<FullLayoutContextValue | null>(null);\n\nexport interface FullLayoutProviderProps {\n value: FullLayoutContextValue;\n children: React.ReactNode;\n}\n\nexport function FullLayoutProvider({ value, children }: FullLayoutProviderProps) {\n return <FullLayoutContext.Provider value={value}>{children}</FullLayoutContext.Provider>;\n}\n\nexport function useFullLayoutContext(): FullLayoutContextValue | null {\n return React.useContext(FullLayoutContext);\n}\n\nexport interface UseRightSidebarReturn {\n /** Whether the right sidebar is currently open. */\n isOpen: boolean;\n /** Open the right sidebar (no-op if already open). */\n open: () => void;\n /** Close the right sidebar (no-op if already closed). */\n close: () => void;\n /** Toggle the right sidebar open/closed. */\n toggle: () => void;\n}\n\n/**\n * Convenience hook for programmatically controlling the right sidebar.\n *\n * Must be used inside a `<FullLayout>` tree.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const rightSidebar = useRightSidebar();\n * return <button onClick={rightSidebar.open}>Open sidebar</button>;\n * }\n * ```\n */\nexport function useRightSidebar(): UseRightSidebarReturn {\n const ctx = React.useContext(FullLayoutContext);\n if (!ctx) {\n throw new Error('useRightSidebar must be used within a <FullLayout> component.');\n }\n\n return {\n isOpen: ctx.isRightSidebarOpen,\n open: ctx.openRightSidebar,\n close: ctx.closeRightSidebar,\n toggle: ctx.toggleRightSidebar,\n };\n}\n","import React from 'react';\n\nexport function MainArea({ children }: { children?: React.ReactNode }) {\n return <>{children}</>;\n}\nMainArea.displayName = 'FullLayout.MainArea';\n","import React from 'react';\n\nexport function Body({ children }: { children?: React.ReactNode }) {\n return <>{children}</>;\n}\nBody.displayName = 'FullLayout.Body';\n","import React, { ComponentProps } from 'react';\n\nimport { HeaderNav } from '../../header-nav';\nimport { useFullLayoutContext } from '../context';\n\nexport function Header(props: ComponentProps<typeof HeaderNav>) {\n const ctx = useFullLayoutContext();\n if (!ctx) return null;\n\n return (\n <HeaderNav\n {...props}\n showSidebarToggle={!ctx.disableLeftSideNav}\n isSideNavOpen={ctx.isSideNavOpen}\n onSideNavigationToggle={ctx.toggleSidebar}\n onHelpClick={ctx.toggleRightSidebar}\n sidebarToggleRef={ctx.sidebarToggleRef as React.Ref<HTMLButtonElement>}\n />\n );\n}\nHeader.displayName = 'FullLayout.Header';\n","import React, { ComponentProps } from 'react';\n\nimport { Sidebar } from '../sidebar';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { cn } from '@/lib/utils';\n\nexport interface FullLayoutLeftSidebarProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n open: boolean;\n widthPx: number;\n onResizeStart: (e: React.MouseEvent) => void;\n onResizeKeyDown: (e: React.KeyboardEvent) => void;\n ariaValuenow: number;\n ariaValuemin: number;\n ariaValuemax: number;\n sidebarProps: ComponentProps<typeof Sidebar>;\n}\n\nconst FullLayoutLeftSidebar = React.forwardRef<HTMLDivElement, FullLayoutLeftSidebarProps>(\n (\n {\n open,\n widthPx,\n onResizeStart,\n onResizeKeyDown,\n ariaValuenow,\n ariaValuemin,\n ariaValuemax,\n sidebarProps,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n id=\"left-sidebar-pane\"\n data-slot=\"full-layout-left-sidebar\"\n tabIndex={-1}\n data-state={open ? 'open' : 'closed'}\n className={cn(\n 'min-w-0 overflow-hidden flex flex-col relative transition-[width] data-[state=closed]:w-0 data-[state=closed]:pointer-events-none data-[state=open]:w-full md:data-[state=open]:w-[var(--left-nav-width)]',\n className,\n )}\n style={{\n ['--left-nav-width' as string]: `${widthPx}px`,\n }}\n {...props}\n >\n <ScrollArea className=\"h-[calc(100dvh-var(--header-nav-height))]\">\n <Sidebar {...sidebarProps} collapsed={!open} className=\"w-[inherit] transition-[width]\" />\n </ScrollArea>\n {/* Window Splitter per APG: https://www.w3.org/ARIA/apg/patterns/windowsplitter/ */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- focusable separator per APG Window Splitter pattern */}\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-valuenow={ariaValuenow}\n aria-valuemin={ariaValuemin}\n aria-valuemax={ariaValuemax}\n aria-label=\"Resize left sidebar\"\n aria-controls=\"left-sidebar-pane\"\n data-slot=\"full-layout-left-sidebar-resize-handle\"\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- focusable separator per APG Window Splitter pattern */\n tabIndex={0}\n onMouseDown={onResizeStart}\n onKeyDown={onResizeKeyDown}\n className=\"hidden lg:block absolute top-0 right-0 bottom-0 w-1 bg-transparent hover:bg-blue-500 cursor-ew-resize shrink-0 [&>div]:pointer-events-none\"\n >\n <div className=\"absolute inset-y-0 -right-1 w-3\" />\n </div>\n </div>\n );\n },\n);\n\nFullLayoutLeftSidebar.displayName = 'FullLayoutLeftSidebar';\n\nexport { FullLayoutLeftSidebar };\n","import React, { ComponentProps, useContext } from 'react';\n\nimport { Sidebar } from '../../sidebar';\nimport { FullLayoutNavStateContext, useFullLayoutContext } from '../context';\nimport { FullLayoutLeftSidebar } from '../left-sidebar-pane';\n\nexport function LeftSidebar(props: ComponentProps<typeof Sidebar>) {\n const ctx = useFullLayoutContext();\n const navState = useContext(FullLayoutNavStateContext);\n if (!ctx) return null;\n if (ctx.disableLeftSideNav) return null;\n\n const sidebarProps: ComponentProps<typeof Sidebar> =\n navState != null\n ? {\n ...props,\n appNavActiveId: navState.appNavActiveId ?? props.appNavActiveId,\n sectionNavActiveId: navState.sectionNavActiveId ?? props.sectionNavActiveId,\n activeArticleId: navState.activeArticleId ?? props.activeArticleId,\n }\n : props;\n\n return (\n <FullLayoutLeftSidebar\n ref={ctx.sideNavRef as React.Ref<HTMLDivElement>}\n open={ctx.isSideNavOpen}\n widthPx={ctx.leftNavWidth}\n onResizeStart={ctx.handleResizeStart}\n onResizeKeyDown={ctx.handleResizeKeyDown}\n ariaValuenow={ctx.ariaValuenow}\n ariaValuemin={ctx.ariaValuemin}\n ariaValuemax={ctx.ariaValuemax}\n sidebarProps={sidebarProps}\n />\n );\n}\nLeftSidebar.displayName = 'FullLayout.LeftSidebar';\n","import React from 'react';\n\nimport { Item } from '@/components/ui/item';\n\nexport function Main({ children }: { children?: React.ReactNode }) {\n return <Item className=\"p-0\">{children}</Item>;\n}\nMain.displayName = 'FullLayout.Main';\n","import React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport { ScrollArea } from '@/components/ui/scroll-area';\n\nexport interface FullLayoutRightSidebarProps extends Omit<React.ComponentPropsWithoutRef<'aside'>, 'children'> {\n open: boolean;\n children: React.ReactNode;\n}\n\nconst FullLayoutRightSidebar = React.forwardRef<HTMLElement, FullLayoutRightSidebarProps>(\n ({ open, className, children, ...props }, ref) => {\n return (\n <aside\n ref={ref as React.Ref<HTMLDivElement>}\n data-slot=\"full-layout-right-sidebar\"\n data-state={open ? 'open' : 'closed'}\n className={cn(\n 'bg-background shadow-lg flex flex-col',\n 'fixed h-[calc(100dvh-var(--header-nav-height))] z-10 w-screen transition-transform duration-300 ease-in-out data-[state=closed]:translate-x-full data-[state=open]:translate-x-0',\n 'md:relative md:h-full md:w-80 md:top-0',\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\" data-slot=\"full-layout-right-sidebar-content\">\n <ScrollArea className=\"h-[calc(100dvh-var(--header-nav-height))]\">{children}</ScrollArea>\n </div>\n </aside>\n );\n },\n);\n\nFullLayoutRightSidebar.displayName = 'FullLayoutRightSidebar';\n\nexport { FullLayoutRightSidebar };\n","import React from 'react';\n\nimport { useFullLayoutContext } from '../context';\nimport { FullLayoutRightSidebar } from '../right-sidebar-pane';\n\nexport function RightSidebar({ children }: { children?: React.ReactNode }) {\n const ctx = useFullLayoutContext();\n if (!ctx) return null;\n\n return (\n <FullLayoutRightSidebar\n ref={ctx.rightSidebarRef as React.Ref<HTMLElement>}\n open={ctx.isRightSidebarOpen}\n className=\"top-[var(--header-nav-height)]\"\n >\n {children}\n </FullLayoutRightSidebar>\n );\n}\nRightSidebar.displayName = 'FullLayout.RightSidebar';\n","import React, { useState, useRef, useEffect, useMemo, useCallback, isValidElement } from 'react';\nimport { useMediaQuery } from 'usehooks-ts';\n\nimport { FullLayoutProvider } from './context';\nimport { HEADER_NAV_HEIGHT } from '../header-nav';\nimport * as Compounds from './components';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { cn } from '@/lib/utils';\n\nconst MIN_SIDENAV_WIDTH = 260;\nconst CLOSE_SIDENAV_THRESHOLD = MIN_SIDENAV_WIDTH - 32;\nconst MAX_SIDENAV_WIDTH = 350;\nconst RIGHT_SIDEBAR_WIDTH = 320;\n\nexport interface FullLayoutRootProps {\n children?: React.ReactNode;\n disableLeftSideNav?: boolean;\n className?: string;\n}\n\n// Helper function to extract slots from children\nfunction extractSlots<T extends Record<string, React.ComponentType<any>>>(\n children: React.ReactNode,\n refs: T,\n): { [K in keyof T]: React.ReactElement | null } {\n const out = {} as { [K in keyof T]: React.ReactElement | null };\n const arr = React.Children.toArray(children);\n for (const key of Object.keys(refs) as (keyof T)[]) {\n const match = arr.find((c): c is React.ReactElement => isValidElement(c) && c.type === refs[key]);\n out[key] = match ?? null;\n }\n\n return out;\n}\n\n// --- Root component ---\n\nfunction FullLayoutRoot({ children, disableLeftSideNav = false, className }: FullLayoutRootProps) {\n // Match isMobile breakpoint (max-width: 767px) so no flash on 768–1023px\n const [isSideNavOpen, setIsSideNavOpen] = useState(() => typeof window !== 'undefined' && window.innerWidth > 767);\n const [isRightSidebarOpen, setIsRightSidebarOpen] = useState(false);\n const [leftNavWidth, setLeftNavWidth] = useState(MIN_SIDENAV_WIDTH);\n const [isResizing, setIsResizing] = useState(false);\n const [gridWidth, setGridWidth] = useState(() => (typeof window !== 'undefined' ? window.innerWidth : 0));\n const sideNavRef = useRef<HTMLDivElement>(null);\n const rightSidebarRef = useRef<HTMLElement>(null);\n const sidebarToggleRef = useRef<HTMLButtonElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const prevSideNavOpenRef = useRef(isSideNavOpen);\n const resizeAcRef = useRef<AbortController | null>(null);\n const isMobile = useMediaQuery('(max-width: 767px)');\n const isWideDesktop = useMediaQuery('(min-width: 1280px)');\n\n // Prevent native scrollbar from appearing\n useEffect(() => {\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = '';\n };\n }, []);\n\n // Handle grid width changes\n useEffect(() => {\n const el = gridRef.current;\n if (!el) return;\n\n const ro = new ResizeObserver(([entry]) => setGridWidth(entry.contentRect.width));\n ro.observe(el);\n\n return () => ro.disconnect();\n }, []);\n\n // Close other sidebar if opening a new one on wide desktop\n const closeOtherSidebar = useCallback(\n (opening: 'left' | 'right') => {\n if (isWideDesktop) return;\n if (opening === 'left') setIsRightSidebarOpen(false);\n else setIsSideNavOpen(false);\n },\n [isWideDesktop],\n );\n\n // Show left sidebar\n const showSidenav = useCallback(() => {\n closeOtherSidebar('left');\n setIsSideNavOpen(true);\n setLeftNavWidth(MIN_SIDENAV_WIDTH);\n sideNavRef.current?.focus();\n }, [closeOtherSidebar]);\n\n // Toggle left sidebar\n const toggleSidebar = useCallback(() => {\n closeOtherSidebar('left');\n setIsSideNavOpen((prev) => !prev);\n }, [closeOtherSidebar]);\n\n // Open right sidebar (no-op if already open)\n const openRightSidebar = useCallback(() => {\n closeOtherSidebar('right');\n setIsRightSidebarOpen(true);\n }, [closeOtherSidebar]);\n\n // Close right sidebar (no-op if already closed)\n const closeRightSidebar = useCallback(() => {\n setIsRightSidebarOpen(false);\n }, []);\n\n // Toggle right sidebar\n const toggleRightSidebar = useCallback(() => {\n closeOtherSidebar('right');\n setIsRightSidebarOpen((prev) => !prev);\n }, [closeOtherSidebar]);\n\n // Apply left nav width - used for resizing left sidebar\n const applyLeftNavWidth = useCallback((newWidth: number, useThreshold = true): boolean => {\n const threshold = useThreshold ? CLOSE_SIDENAV_THRESHOLD : MIN_SIDENAV_WIDTH;\n\n if (newWidth < threshold) {\n setLeftNavWidth(MIN_SIDENAV_WIDTH);\n setIsSideNavOpen(false);\n\n return true;\n } else {\n // clamp to MAX_SIDENAV_WIDTH\n setLeftNavWidth(Math.min(MAX_SIDENAV_WIDTH, newWidth));\n\n return false;\n }\n }, []);\n\n // Handle resize start\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizeAcRef.current = new AbortController();\n setIsResizing(true);\n }, []);\n\n // Handle resize end\n const endResize = useCallback(() => {\n setIsResizing(false);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }, []);\n\n // Handle mouse move during resize\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isResizing) return;\n if (applyLeftNavWidth(e.clientX)) {\n endResize();\n }\n },\n [isResizing, applyLeftNavWidth, endResize],\n );\n\n // Handle mouse up during resize\n const handleMouseUp = useCallback(() => endResize(), [endResize]);\n\n // Set inert attribute on side nav and right sidebar - disables tabbing to elements inside when sidebar is closed\n const setInert = useCallback((el: HTMLElement | null, open: boolean) => {\n if (!el) return;\n if (open) el.removeAttribute('inert');\n else el.setAttribute('inert', '');\n }, []);\n\n useEffect(() => {\n setInert(sideNavRef.current, isSideNavOpen);\n setInert(rightSidebarRef.current, isRightSidebarOpen);\n }, [isSideNavOpen, isRightSidebarOpen]);\n\n // Attach resize listeners when isResizing becomes true (controller already set in handleResizeStart)\n useEffect(() => {\n if (!isResizing || !resizeAcRef.current) return;\n\n const { signal } = resizeAcRef.current;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove, { signal });\n document.addEventListener('mouseup', handleMouseUp, { signal });\n window.addEventListener('mouseup', handleMouseUp, { signal });\n setInert(sideNavRef.current, false);\n\n return () => {\n resizeAcRef.current?.abort();\n resizeAcRef.current = null;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n setInert(sideNavRef.current, true);\n };\n }, [isResizing]);\n\n // Handle resize key down\n const handleResizeKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const step = 16;\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n applyLeftNavWidth(leftNavWidth - step, false);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n applyLeftNavWidth(Math.min(MAX_SIDENAV_WIDTH, leftNavWidth + step));\n }\n },\n [leftNavWidth],\n );\n\n const leftCol = disableLeftSideNav ? 0 : isSideNavOpen ? (isMobile ? gridWidth : leftNavWidth) : 0;\n const rightCol = isMobile ? 0 : isRightSidebarOpen ? RIGHT_SIDEBAR_WIDTH : 0;\n\n // Set left sidebar open state based on mobile\n useEffect(() => {\n setIsSideNavOpen(isMobile ? false : true);\n }, [isMobile]);\n\n // Focus sidebar toggle when left sidebar is closed\n useEffect(() => {\n if (prevSideNavOpenRef.current && !isSideNavOpen) {\n sidebarToggleRef.current?.focus();\n }\n prevSideNavOpenRef.current = isSideNavOpen;\n }, [isSideNavOpen]);\n\n const ariaValuenow = Math.round(((leftNavWidth - MIN_SIDENAV_WIDTH) / (MAX_SIDENAV_WIDTH - MIN_SIDENAV_WIDTH)) * 100);\n\n const layoutContextValue = useMemo(\n () => ({\n isSideNavOpen,\n isRightSidebarOpen,\n toggleSidebar,\n openRightSidebar,\n closeRightSidebar,\n toggleRightSidebar,\n showSidenav,\n disableLeftSideNav: disableLeftSideNav ?? false,\n leftNavWidth,\n isMobile,\n sideNavRef,\n rightSidebarRef,\n sidebarToggleRef,\n handleResizeStart,\n handleResizeKeyDown,\n ariaValuenow,\n ariaValuemin: 0,\n ariaValuemax: 100,\n }),\n [\n isSideNavOpen,\n isRightSidebarOpen,\n toggleSidebar,\n openRightSidebar,\n closeRightSidebar,\n toggleRightSidebar,\n showSidenav,\n leftNavWidth,\n isMobile,\n disableLeftSideNav,\n handleResizeStart,\n handleResizeKeyDown,\n ariaValuenow,\n ],\n );\n\n // --- Extract slots from children ---\n const { MainArea: mainArea, RightSidebar: rightSidebar } = extractSlots(children, {\n MainArea: Compounds.MainArea,\n RightSidebar: Compounds.RightSidebar,\n });\n const mainAreaChildren = isValidElement(mainArea)\n ? (mainArea.props as { children?: React.ReactNode }).children\n : null;\n const { Header: header, Body: body } = extractSlots(mainAreaChildren ?? null, {\n Header: Compounds.Header,\n Body: Compounds.Body,\n });\n const bodyChildren = isValidElement(body) ? (body.props as { children?: React.ReactNode }).children : null;\n const { LeftSidebar: leftSidebar, Main: main } = extractSlots(bodyChildren ?? null, {\n LeftSidebar: Compounds.LeftSidebar,\n Main: Compounds.Main,\n });\n\n const hasRightSidebar = rightSidebar != null;\n\n // --- Render the layout ---\n return (\n <FullLayoutProvider value={layoutContextValue}>\n <div\n className={cn(\n 'min-h-screen w-screen bg-background grid transition-[grid-template-columns] duration-300 ease-in-out',\n className,\n )}\n style={{\n gridTemplateColumns: hasRightSidebar ? 'minmax(0, 1fr) var(--right-col)' : 'minmax(0, 1fr)',\n ['--right-col' as string]: hasRightSidebar ? `${rightCol}px` : '0px',\n ['--header-nav-height' as string]: `${HEADER_NAV_HEIGHT}px`,\n }}\n >\n <div className=\"min-w-0 grid grid-rows-[auto_1fr]\">\n {header}\n\n <div\n ref={gridRef}\n data-sidenav-state={isSideNavOpen ? 'open' : 'closed'}\n data-right-sidebar-state={isRightSidebarOpen ? 'open' : 'closed'}\n className={cn(\n 'group/sidenav group/rightsidebar min-h-0 min-w-0 grid transition-[grid-template-columns] ease-linear',\n )}\n style={{\n gridTemplateColumns: `var(--left-col) minmax(0, 1fr)`,\n ['--left-col' as string]: `${leftCol}px`,\n }}\n >\n {disableLeftSideNav ? <div className=\"w-0\" /> : leftSidebar}\n <div className={cn('relative md:mr-4', { 'md:mx-4': !isSideNavOpen || disableLeftSideNav })}>\n <ScrollArea className=\" bg-surface h-[calc(100dvh-var(--header-nav-height))] md:h-[calc(100dvh-var(--header-nav-height)-1rem)] md:shadow-[2px_4px_12px_0_rgba(0,0,0,0.14)] md:dark:shadow-[2px_4px_12px_0_rgba(255,255,255,0.14)] md:rounded-lg\">\n <main className={cn('min-w-0 overflow-visible relative p-4 md:p-8')}>{main}</main>\n </ScrollArea>\n <div className=\"from-background via-background/90 to-background/40 bg-gradient-to-t blur-xs sticky bottom-0 md:bottom-4 z-10 h-4 md:h-8 shrink-0 rounded-lg mr-4\" />\n </div>\n </div>\n </div>\n\n {hasRightSidebar ? rightSidebar : null}\n </div>\n </FullLayoutProvider>\n );\n}\n\n/**\n * Custom memo comparator: re-render only when these props change by reference/value.\n * Use this so changing other props (e.g. from a parent) does not force the layout shell to re-render.\n */\nfunction fullLayoutRootPropsAreEqual(prev: FullLayoutRootProps, next: FullLayoutRootProps): boolean {\n return (\n prev.children === next.children &&\n prev.className === next.className &&\n prev.disableLeftSideNav === next.disableLeftSideNav\n );\n}\n\nconst FullLayout = Object.assign(React.memo(FullLayoutRoot, fullLayoutRootPropsAreEqual), {\n MainArea: Compounds.MainArea,\n Body: Compounds.Body,\n Header: Compounds.Header,\n LeftSidebar: Compounds.LeftSidebar,\n Main: Compounds.Main,\n RightSidebar: Compounds.RightSidebar,\n});\n\nexport default FullLayout;\n"],"names":["React","Compounds.MainArea","Compounds.RightSidebar","Compounds.Header","Compounds.Body","Compounds.LeftSidebar","Compounds.Main"],"mappings":"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"}
@@ -411,7 +411,7 @@ function AttributesDialog({ conversationId, open, onOpenChange, ...args }) {
411
411
  "aria-label": "Open Custom attributes dialog"
412
412
  },
413
413
  /* @__PURE__ */ React__default.createElement(UserFocus, { size: 24 })
414
- ))), /* @__PURE__ */ React__default.createElement(TooltipContent, null, "Customer attributes")), /* @__PURE__ */ React__default.createElement(SheetContent, { className: "space-y-4" }, /* @__PURE__ */ React__default.createElement(SheetHeader, null, /* @__PURE__ */ React__default.createElement(SheetTitle, { className: "heading-sm m-0" }, "Custom attributes"), /* @__PURE__ */ React__default.createElement(SheetDescription, { className: "sr-only" }, "Custom attributes are used to store additional information about the conversation.")), sortedAttributesKeys && /* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100vh-8rem)]" }, " ", /* @__PURE__ */ React__default.createElement(Table, { className: "bg-surface", "data-test-id": "attributes-table" }, /* @__PURE__ */ React__default.createElement(TableHeader, null, /* @__PURE__ */ React__default.createElement(TableRow, null, sortedAttributesKeys.map((key) => /* @__PURE__ */ React__default.createElement(TableHead, { key, className: "capitalize font-bold" }, key)))), /* @__PURE__ */ React__default.createElement(TableBody, null, attributes.map((record) => /* @__PURE__ */ React__default.createElement(TableRow, { key: record?.id ?? createId(), className: "border-none" }, sortedAttributesKeys.map((key) => /* @__PURE__ */ React__default.createElement(TableCell, { key, "data-title": key }, record[key])))))))));
414
+ ))), /* @__PURE__ */ React__default.createElement(TooltipContent, null, "Customer attributes")), /* @__PURE__ */ React__default.createElement(SheetContent, { className: "space-y-4" }, /* @__PURE__ */ React__default.createElement(SheetHeader, null, /* @__PURE__ */ React__default.createElement(SheetTitle, { className: "heading-sm m-0" }, "Custom attributes"), /* @__PURE__ */ React__default.createElement(SheetDescription, { className: "sr-only" }, "Custom attributes are used to store additional information about the conversation.")), sortedAttributesKeys && /* @__PURE__ */ React__default.createElement(ScrollArea, { className: "h-[calc(100vh-8rem)]" }, " ", /* @__PURE__ */ React__default.createElement(Table, { className: "bg-surface", "data-test-id": "attributes-table" }, /* @__PURE__ */ React__default.createElement(TableHeader, null, /* @__PURE__ */ React__default.createElement(TableRow, null, sortedAttributesKeys.map((key) => /* @__PURE__ */ React__default.createElement(TableHead, { key, className: "capitalize font-bold" }, key)))), /* @__PURE__ */ React__default.createElement(TableBody, null, attributes.map((record) => /* @__PURE__ */ React__default.createElement(TableRow, { key: record?.id ?? createId(), className: "border-none" }, sortedAttributesKeys.map((key) => /* @__PURE__ */ React__default.createElement(TableCell, { key, "data-title": key }, typeof record[key] === "boolean" ? String(record[key]) : record[key])))))))));
415
415
  }
416
416
 
417
417
  const StreamBadge = React__default.forwardRef(