@brainfish-ai/components 0.22.6 → 0.22.8

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.
@@ -4,7 +4,7 @@ import { a as HeaderNav, H as HEADER_NAV_HEIGHT } from './header-nav.DSUAniYA.js
4
4
  import { ScrollArea } from '../components/ui/scroll-area.js';
5
5
  import { c as cn } from './utils.Cwtlq8dh.js';
6
6
  import { Item } from '../components/ui/item.js';
7
- import { S as Sidebar } from './sidebar.DhtJw8iP.js';
7
+ import { S as Sidebar } from './sidebar.kcc3uFga.js';
8
8
 
9
9
  const FullLayoutNavStateContext = React__default.createContext(null);
10
10
  const FullLayoutContext = React__default.createContext(null);
@@ -445,4 +445,4 @@ const FullLayout = Object.assign(React__default.memo(FullLayoutRoot, fullLayoutR
445
445
  });
446
446
 
447
447
  export { FullLayout as F, FullLayoutProvider as a, useRightSidebar as b, FullLayoutNavStateContext as c, FullLayoutLeftSidebar as d, FullLayoutRightSidebar as e, useFullLayoutContext as u };
448
- //# sourceMappingURL=layout.Cnco8VrE.js.map
448
+ //# sourceMappingURL=layout.ClofLZcT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.Cnco8VrE.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 { 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 <Sidebar\n {...sidebarProps}\n collapsed={!open}\n className=\"transition-[width] w-[var(--left-nav-width)] h-[calc(100dvh-var(--header-nav-height,0))]\"\n />\n\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, useCallback, isValidElement, useMemo } 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 = 330;\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 [isResizing, setIsResizing] = useState(false);\n const [gridWidth, setGridWidth] = useState(() => (typeof window !== 'undefined' ? window.innerWidth : 0));\n\n const newMinNavWidth = useMemo(\n () =>\n gridWidth > 0\n ? Math.max(MIN_SIDENAV_WIDTH, Math.min(MAX_SIDENAV_WIDTH, Math.round(gridWidth * 0.18)))\n : MIN_SIDENAV_WIDTH,\n [gridWidth],\n );\n const [leftNavWidth, setLeftNavWidth] = useState(newMinNavWidth);\n\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 if (!document.body.querySelector('.sbdocs')) {\n document.body.style.overflow = 'hidden';\n }\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]) => {\n setGridWidth(entry.contentRect.width);\n });\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(newMinNavWidth);\n sideNavRef.current?.focus();\n }, [closeOtherSidebar, newMinNavWidth]);\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(\n (newWidth: number): boolean => {\n if (newWidth < CLOSE_SIDENAV_THRESHOLD) {\n setLeftNavWidth(newMinNavWidth);\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 [newMinNavWidth],\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);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n applyLeftNavWidth(Math.min(MAX_SIDENAV_WIDTH, leftNavWidth + step));\n }\n },\n [leftNavWidth, applyLeftNavWidth],\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 ariaRange = MAX_SIDENAV_WIDTH - newMinNavWidth;\n const ariaValuenow = ariaRange === 0 ? 100 : Math.round(((leftNavWidth - newMinNavWidth) / ariaRange) * 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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"}
1
+ {"version":3,"file":"layout.ClofLZcT.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 { 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 <Sidebar\n {...sidebarProps}\n collapsed={!open}\n className=\"transition-[width] w-[var(--left-nav-width)] h-[calc(100dvh-var(--header-nav-height,0))]\"\n />\n\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, useCallback, isValidElement, useMemo } 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 = 330;\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 [isResizing, setIsResizing] = useState(false);\n const [gridWidth, setGridWidth] = useState(() => (typeof window !== 'undefined' ? window.innerWidth : 0));\n\n const newMinNavWidth = useMemo(\n () =>\n gridWidth > 0\n ? Math.max(MIN_SIDENAV_WIDTH, Math.min(MAX_SIDENAV_WIDTH, Math.round(gridWidth * 0.18)))\n : MIN_SIDENAV_WIDTH,\n [gridWidth],\n );\n const [leftNavWidth, setLeftNavWidth] = useState(newMinNavWidth);\n\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 if (!document.body.querySelector('.sbdocs')) {\n document.body.style.overflow = 'hidden';\n }\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]) => {\n setGridWidth(entry.contentRect.width);\n });\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(newMinNavWidth);\n sideNavRef.current?.focus();\n }, [closeOtherSidebar, newMinNavWidth]);\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(\n (newWidth: number): boolean => {\n if (newWidth < CLOSE_SIDENAV_THRESHOLD) {\n setLeftNavWidth(newMinNavWidth);\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 [newMinNavWidth],\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);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n applyLeftNavWidth(Math.min(MAX_SIDENAV_WIDTH, leftNavWidth + step));\n }\n },\n [leftNavWidth, applyLeftNavWidth],\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 ariaRange = MAX_SIDENAV_WIDTH - newMinNavWidth;\n const ariaValuenow = ariaRange === 0 ? 100 : Math.round(((leftNavWidth - newMinNavWidth) / ariaRange) * 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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"}
@@ -43,7 +43,8 @@ function ReviewsSelectionProvider({
43
43
  onApproveAllSuggestions,
44
44
  onRejectAllSuggestions,
45
45
  onOpenArticleLink,
46
- onSourceLinkClick
46
+ onSourceLinkClick,
47
+ breadcrumb
47
48
  }) {
48
49
  const [userSelectedItem, setUserSelectedItem] = useState(null);
49
50
  const selectedItem = userSelectedItem ?? defaultSelectedItem;
@@ -61,7 +62,8 @@ function ReviewsSelectionProvider({
61
62
  onApproveAllSuggestions,
62
63
  onRejectAllSuggestions,
63
64
  onOpenArticleLink,
64
- onSourceLinkClick
65
+ onSourceLinkClick,
66
+ breadcrumb
65
67
  }),
66
68
  [
67
69
  selectedItem,
@@ -71,7 +73,8 @@ function ReviewsSelectionProvider({
71
73
  onApproveAllSuggestions,
72
74
  onRejectAllSuggestions,
73
75
  onOpenArticleLink,
74
- onSourceLinkClick
76
+ onSourceLinkClick,
77
+ breadcrumb
75
78
  ]
76
79
  );
77
80
  return /* @__PURE__ */ React__default.createElement(ReviewsContext.Provider, { value }, children);
@@ -102,4 +105,4 @@ const ReviewList = forwardRef(({ items, className, ...props }, ref) => {
102
105
  ReviewList.displayName = "ReviewList";
103
106
 
104
107
  export { EditCount as E, ReviewListItem as R, ReviewList as a, ReviewsSelectionProvider as b, useReviewsSelection as u };
105
- //# sourceMappingURL=review-list.vkpTfjUb.js.map
108
+ //# sourceMappingURL=review-list.COTpWPmq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-list.COTpWPmq.js","sources":["../../../src/scenes/knowledge-review/review-list/edit-count.tsx","../../../src/scenes/knowledge-review/review-list/review-list-item.tsx","../../../src/scenes/knowledge-review/context.tsx","../../../src/scenes/knowledge-review/review-list/review-list.tsx"],"sourcesContent":["import React from 'react';\nimport { Circle } from '@phosphor-icons/react';\n\nexport function EditCount({ count }: { count: number }) {\n return (\n <span className=\"inline-flex items-center gap-0.5\">\n <Circle size={8} weight=\"fill\" aria-hidden=\"true\" className=\"text-blue\" />\n <span className=\"text-xs leading-4 text-subtle\">\n {count} {count === 1 ? 'edit' : 'edits'}\n </span>\n </span>\n );\n}\n","import * as React from 'react';\n\nimport { EditCount } from './edit-count';\n\nimport { cn } from '@/lib/utils';\nimport { formatDistance } from '@/lib/formatDate';\nimport { StatusBadge } from '@/components/convos/status-badge';\n\nexport interface ReviewListItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Unique identifier for the knowledge article */\n id: string;\n /** Primary text displayed in the first row */\n title: string;\n /** Content rendered in the top-right corner (e.g. relative timestamp) */\n timestamp: Date;\n /** Icon rendered at the start of the second row */\n icon?: React.ReactNode;\n /** Text or content next to the icon in the second row */\n description?: string | null;\n /** Whether this item is new */\n isNew?: boolean;\n /** Number of edits for this item */\n editCount?: number;\n /** Whether this item is currently selected */\n isSelected?: boolean;\n}\n\nexport const ReviewListItem = React.forwardRef<HTMLButtonElement, ReviewListItemProps>(function ReviewListItem(\n { title, timestamp, icon, description, isNew, editCount, isSelected = false, className, ...props },\n ref,\n) {\n let status: React.ReactNode | undefined;\n if (isNew) {\n status = <StatusBadge variant=\"success\">New</StatusBadge>;\n } else if (editCount) {\n status = <EditCount count={editCount} />;\n }\n\n return (\n <button\n {...props}\n ref={ref}\n type=\"button\"\n aria-pressed={isSelected}\n className={cn(\n 'relative flex w-full flex-col gap-1 bg-surface rounded p-4 cursor-pointer transition-colors text-left border border-transparent',\n isSelected\n ? [\n 'shadow-[0px_1px_3px_0px_rgba(95,95,95,0.26)]',\n 'after:content-[\"\"] after:block after:absolute after:right-[-2px] after:top-1/2 after:-translate-y-1/2 after:w-1 after:h-14 after:rounded-sm after:bg-primary',\n ]\n : 'hover:bg-dark-100 hover:border-dark-300',\n className,\n )}\n >\n {/* Row 1: Title + Timestamp */}\n <span className=\"flex items-center justify-between w-full gap-2\">\n <span className={cn('text-sm text-default truncate min-w-0 flex-1', isSelected ? 'font-bold' : 'font-normal')}>\n {title}\n </span>\n {timestamp && <span className=\"text-xs leading-4 text-subtlest shrink-0\">{formatDistance(timestamp)}</span>}\n </span>\n\n {/* Row 2: Icon + Description + Status */}\n {(icon || description || status) && (\n <span className=\"flex items-center gap-1 leading-4\">\n {icon && <span className=\"shrink-0 flex items-center\">{icon}</span>}\n {description && <span className=\"text-xs text-subtle truncate\">{description}</span>}\n {status && <span className=\"shrink-0 ml-1 flex items-center\">{status}</span>}\n </span>\n )}\n </button>\n );\n});\n","import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport type { ReviewListItemProps } from './review-list/review-list-item';\n\nexport type LoadedDiffDoc = {\n isNew: boolean;\n diffTitle: string;\n diffContent: React.ReactNode;\n};\n\ntype ReviewsSelectionValue = {\n selectedItem: ReviewListItemProps | null;\n setSelectedItem: (item: ReviewListItemProps | null) => void;\n loadedDiffDoc: LoadedDiffDoc | null;\n setLoadedDiffDoc: (doc: LoadedDiffDoc | null) => void;\n loadingDiff: boolean;\n setLoadingDiff: (loading: boolean) => void;\n onApproveAllSuggestions: () => void;\n onRejectAllSuggestions: () => void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n};\n\nconst ReviewsContext = createContext<ReviewsSelectionValue | null>(null);\n\nexport type ReviewsProviderProps = {\n children: React.ReactNode;\n /** Optional initial selection (e.g. from server or mock data) */\n defaultSelectedItem?: ReviewListItemProps | null;\n onApproveAllSuggestions: () => void;\n onRejectAllSuggestions: () => void;\n onOpenArticleLink?: () => void;\n onSourceLinkClick?: () => void;\n breadcrumb?: string;\n};\n\nexport function ReviewsSelectionProvider({\n children,\n defaultSelectedItem = null,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n}: ReviewsProviderProps) {\n const [userSelectedItem, setUserSelectedItem] = useState<ReviewListItemProps | null>(null);\n const selectedItem = userSelectedItem ?? defaultSelectedItem;\n\n const [loadedDiffDoc, setLoadedDiffDoc] = useState<LoadedDiffDoc | null>(null);\n\n const [loadingDiff, setLoadingDiff] = useState(false);\n\n const handleSelect = useCallback((item: ReviewListItemProps | null) => setUserSelectedItem(item), []);\n const value = useMemo<ReviewsSelectionValue>(\n () => ({\n selectedItem,\n setSelectedItem: handleSelect,\n loadedDiffDoc,\n setLoadedDiffDoc,\n loadingDiff,\n setLoadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n }),\n [\n selectedItem,\n handleSelect,\n loadedDiffDoc,\n loadingDiff,\n onApproveAllSuggestions,\n onRejectAllSuggestions,\n onOpenArticleLink,\n onSourceLinkClick,\n breadcrumb,\n ],\n );\n\n return <ReviewsContext.Provider value={value}>{children}</ReviewsContext.Provider>;\n}\n\nexport function useReviewsSelection(): ReviewsSelectionValue {\n const ctx = useContext(ReviewsContext);\n if (!ctx) {\n throw new Error('useReviewsSelection must be used within ReviewsSelectionProvider');\n }\n\n return ctx;\n}\n","import React, { forwardRef } from 'react';\n\nimport { ReviewListItem, ReviewListItemProps } from './review-list-item';\nimport { useReviewsSelection } from '../context';\n\nimport { cn } from '@/lib/utils';\n\ninterface ReviewListProps {\n items: ReviewListItemProps[];\n className?: string;\n}\n\nexport const ReviewList = forwardRef<HTMLUListElement, ReviewListProps>(({ items, className, ...props }, ref) => {\n const { selectedItem, setSelectedItem } = useReviewsSelection();\n\n return (\n <ul\n ref={ref}\n className={cn(\n 'min-w-0 w-full overflow-hidden bg-muted border border-dark-300 rounded-lg p-2 space-y-2 list-none m-0',\n className,\n )}\n {...props}\n >\n {items.map((item) => (\n <li key={item.id}>\n <ReviewListItem {...item} isSelected={selectedItem?.id === item.id} onClick={() => setSelectedItem(item)} />\n </li>\n ))}\n </ul>\n );\n});\nReviewList.displayName = 'ReviewList';\n"],"names":["React","ReviewListItem"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ScrollArea } from '../components/ui/scroll-area.js';
3
3
  import { c as cn } from './utils.Cwtlq8dh.js';
4
- import { ArrowBendUpLeft, MagnifyingGlass, Folder, FolderOpen, FolderDashed, DotsThree, Plus, FileDashed, File, Lightning, Article } from '@phosphor-icons/react';
4
+ import { ArrowBendUpLeft, X, MagnifyingGlass, Folder, FolderOpen, FolderDashed, DotsThree, Plus, FileDashed, File, Lightning, Article } from '@phosphor-icons/react';
5
5
  import { Button } from '../components/ui/button.js';
6
6
  import { u as useDebounce } from './hooks.CKojclfe.js';
7
7
  import { Input } from '../components/ui/input.js';
@@ -22,9 +22,12 @@ function SidebarProvider({
22
22
  children
23
23
  }) {
24
24
  const [isSearching, setIsSearching] = React.useState(false);
25
+ const [searchValue, setSearchValue] = React.useState("");
26
+ const [lastSelectedArticleId, setLastSelectedArticleId] = React.useState(null);
25
27
  const handleSearchArticles = React.useCallback(
26
28
  (value) => {
27
- setIsSearching(value.trim() !== "");
29
+ const trimmedValue = value.trim();
30
+ setIsSearching(trimmedValue !== "");
28
31
  onSearchArticles?.(value);
29
32
  },
30
33
  [onSearchArticles]
@@ -41,10 +44,16 @@ function SidebarProvider({
41
44
  canMoveArticle,
42
45
  onMoveArticle,
43
46
  isSearching,
47
+ searchValue,
48
+ setSearchValue,
49
+ lastSelectedArticleId,
50
+ setLastSelectedArticleId,
44
51
  handleSearchArticles
45
52
  }),
46
53
  [
47
54
  isSearching,
55
+ searchValue,
56
+ lastSelectedArticleId,
48
57
  collapsed,
49
58
  ItemLinkComponent2,
50
59
  activeArticleId,
@@ -97,25 +106,34 @@ function AppNav({ className, items, activeId, showBack, onBack }) {
97
106
  }
98
107
 
99
108
  function ArticleSearch() {
100
- const { handleSearchArticles } = useSidebar();
109
+ const { handleSearchArticles, searchValue, setSearchValue } = useSidebar();
101
110
  const [searchInteracted, setSearchInteracted] = React.useState(false);
102
- const [searchValue, setSearchValue] = React.useState("");
103
- const debouncedSearchValue = useDebounce(searchValue, 500);
111
+ const debouncedSearchValue = useDebounce(searchValue, 300);
112
+ const searchInputRef = React.useRef(null);
104
113
  React.useEffect(() => {
105
114
  if (searchInteracted) handleSearchArticles?.(debouncedSearchValue);
106
115
  }, [debouncedSearchValue, handleSearchArticles, searchInteracted]);
107
116
  return /* @__PURE__ */ React.createElement("div", { className: "mb-2" }, /* @__PURE__ */ React.createElement(
108
117
  Input,
109
118
  {
119
+ ref: searchInputRef,
110
120
  className: "h-auto text-subtlest border-border-subtle",
111
- endIcon: MagnifyingGlass,
121
+ startIcon: MagnifyingGlass,
122
+ endIcon: searchValue ? X : void 0,
123
+ onEndIconClick: () => {
124
+ setSearchValue("");
125
+ handleSearchArticles?.("");
126
+ },
112
127
  value: searchValue,
113
128
  onChange: (e) => {
129
+ const value = e.target.value;
114
130
  if (!searchInteracted) setSearchInteracted(true);
115
- setSearchValue(e.target.value);
131
+ setSearchValue(value);
132
+ if (value.trim() === "") handleSearchArticles("");
116
133
  },
117
134
  placeholder: "Find an article",
118
- "aria-label": "Find an article"
135
+ "aria-label": "Find an article",
136
+ type: "search"
119
137
  }
120
138
  ));
121
139
  }
@@ -131,7 +149,8 @@ function ArticleItem({
131
149
  ItemLinkComponent: ItemLinkComponent2,
132
150
  onAddArticle,
133
151
  isAddingArticle,
134
- onMoreActions
152
+ onMoreActions,
153
+ isSearching
135
154
  }) {
136
155
  const treeState = React.useContext(TreeStateContext);
137
156
  const handleAddClick = (e) => {
@@ -159,6 +178,7 @@ function ArticleItem({
159
178
  Folder,
160
179
  {
161
180
  "aria-hidden": "true",
181
+ weight: "fill",
162
182
  className: cn(
163
183
  "absolute size-4 transition-opacity duration-200 ease-out",
164
184
  isExpanded ? "opacity-0" : "opacity-100"
@@ -179,6 +199,7 @@ function ArticleItem({
179
199
  FolderDashed,
180
200
  {
181
201
  "aria-hidden": "true",
202
+ weight: "fill",
182
203
  className: cn(
183
204
  "absolute size-4 transition-opacity duration-200 ease-out",
184
205
  isExpanded ? "opacity-0" : "opacity-100"
@@ -220,7 +241,7 @@ function ArticleItem({
220
241
  )
221
242
  },
222
243
  /* @__PURE__ */ React.createElement(Button$1, { slot: "drag", className: "sr-only" }, "Drag ", item.value.label),
223
- renderStatusIcon(item.value.status, hasChildItems),
244
+ isSearching ? null : renderStatusIcon(item.value.status, hasChildItems),
224
245
  /* @__PURE__ */ React.createElement(
225
246
  ItemLinkComponent2,
226
247
  {
@@ -232,9 +253,13 @@ function ArticleItem({
232
253
  "min-w-0 text-inherit text-sm truncate flex-1 after:absolute after:inset-0 after:z-10 pr-1",
233
254
  isSelected && "text-primary-foreground"
234
255
  ),
235
- onClick: hasChildItems && treeState ? (e) => {
236
- e.preventDefault();
256
+ onClick: hasChildItems && treeState ? () => {
237
257
  treeState.toggleKey(item.key);
258
+ } : void 0,
259
+ onKeyDown: hasChildItems && treeState ? (e) => {
260
+ if (e.key === "Enter" || e.key === " ") {
261
+ treeState?.toggleKey(item.key);
262
+ }
238
263
  } : void 0
239
264
  },
240
265
  item.value.label
@@ -288,16 +313,21 @@ function getParentKeys(items, targetId, parents = []) {
288
313
  }
289
314
  return null;
290
315
  }
291
- function ArticleTree({ articles }) {
316
+ function ArticleTree({ articles, isSearching }) {
292
317
  const {
293
318
  ItemLinkComponent,
294
319
  activeArticleId,
320
+ lastSelectedArticleId,
321
+ setLastSelectedArticleId,
295
322
  onSelectArticle,
323
+ handleSearchArticles,
324
+ setSearchValue,
296
325
  canMoveArticle,
297
326
  onMoveArticle,
298
327
  onAddArticle,
299
328
  onMoreActions
300
329
  } = useSidebar();
330
+ const effectiveActiveId = activeArticleId ?? lastSelectedArticleId ?? void 0;
301
331
  const articlesTree = useTreeData({
302
332
  initialItems: articles,
303
333
  getKey: (articleItem) => articleItem.id,
@@ -308,6 +338,7 @@ function ArticleTree({ articles }) {
308
338
  "text/plain": item.value.label
309
339
  })),
310
340
  onMove: (e) => {
341
+ if (isSearching) return;
311
342
  const movedArticleId = Array.from(e.keys)[0];
312
343
  if (!movedArticleId) return;
313
344
  const targetItem = articlesTree.getItem(e.target.key);
@@ -357,31 +388,40 @@ function ArticleTree({ articles }) {
357
388
  }
358
389
  )
359
390
  });
360
- const [selectedKeys, setSelectedKeys] = React.useState(new Set(activeArticleId ? [activeArticleId] : []));
361
- const [expandedKeys, setExpandedKeys] = React.useState(() => {
362
- if (!activeArticleId || !articlesTree?.items) return /* @__PURE__ */ new Set();
391
+ const [localSelectedKeys, setLocalSelectedKeys] = React.useState(/* @__PURE__ */ new Set());
392
+ const selectedKeys = effectiveActiveId != null ? /* @__PURE__ */ new Set([effectiveActiveId]) : localSelectedKeys;
393
+ const pathToActive = React.useMemo(() => {
394
+ if (!effectiveActiveId || isSearching || !articlesTree?.items?.length) return [];
363
395
  const path = getParentKeys(
364
396
  articlesTree.items.map((node) => node.value),
365
- activeArticleId
397
+ effectiveActiveId
366
398
  );
367
- return path ? new Set(path) : /* @__PURE__ */ new Set();
368
- });
399
+ return path ?? [];
400
+ }, [effectiveActiveId, isSearching, articlesTree.items]);
401
+ const [expandedKeysState, setExpandedKeysState] = React.useState(/* @__PURE__ */ new Set());
402
+ const expandedKeys = React.useMemo(
403
+ () => /* @__PURE__ */ new Set([...pathToActive, ...expandedKeysState]),
404
+ [pathToActive, expandedKeysState]
405
+ );
406
+ React.useEffect(() => {
407
+ if (activeArticleId) setLastSelectedArticleId(null);
408
+ }, [activeArticleId, setLastSelectedArticleId]);
369
409
  const pendingAddIdsRef = React.useRef(/* @__PURE__ */ new Set());
370
410
  const [pendingAddIds, setPendingAddIds] = React.useState(/* @__PURE__ */ new Set());
371
411
  const handleAddArticle = React.useCallback(
372
412
  (parentId) => {
373
- if (!onAddArticle || pendingAddIdsRef.current.has(parentId)) return;
413
+ if (isSearching || !onAddArticle || pendingAddIdsRef.current.has(parentId)) return;
374
414
  pendingAddIdsRef.current.add(parentId);
375
415
  setPendingAddIds(new Set(pendingAddIdsRef.current));
376
416
  const tempId = `__placeholder_${++placeholderCounter}`;
377
417
  const placeholder = { id: tempId, label: "Untitled", href: "", status: "draft" };
378
418
  articlesTree.append(parentId, placeholder);
379
- setExpandedKeys((prev) => /* @__PURE__ */ new Set([...prev, parentId]));
419
+ setExpandedKeysState((prev) => /* @__PURE__ */ new Set([...prev, parentId]));
380
420
  onAddArticle(parentId).then(
381
421
  (created) => {
382
422
  articlesTree.remove(tempId);
383
423
  articlesTree.append(parentId, created);
384
- setSelectedKeys(/* @__PURE__ */ new Set([created.id]));
424
+ setLocalSelectedKeys(/* @__PURE__ */ new Set([created.id]));
385
425
  onSelectArticle?.(created.id);
386
426
  pendingAddIdsRef.current.delete(parentId);
387
427
  setPendingAddIds(new Set(pendingAddIdsRef.current));
@@ -393,26 +433,34 @@ function ArticleTree({ articles }) {
393
433
  }
394
434
  );
395
435
  },
396
- [onAddArticle, articlesTree, onSelectArticle]
436
+ [isSearching, onAddArticle, articlesTree, onSelectArticle]
397
437
  );
398
438
  return /* @__PURE__ */ React.createElement(
399
439
  Tree,
400
440
  {
401
- "aria-label": "Articles tree",
441
+ "aria-label": isSearching ? "Search results" : "Articles tree",
402
442
  items: articlesTree.items,
403
- dragAndDropHooks,
443
+ dragAndDropHooks: isSearching ? void 0 : dragAndDropHooks,
404
444
  className: "flex flex-col gap-0.5",
405
445
  selectionBehavior: "toggle",
406
446
  selectionMode: "single",
407
447
  expandedKeys,
408
- onExpandedChange: setExpandedKeys,
448
+ onExpandedChange: setExpandedKeysState,
409
449
  selectedKeys,
410
450
  disallowEmptySelection: true,
411
451
  onSelectionChange: (selection) => {
412
452
  if (selection !== "all") {
413
- setSelectedKeys(selection);
453
+ if (effectiveActiveId == null) setLocalSelectedKeys(selection);
414
454
  const selected = Array.from(selection)?.[0];
415
- selected && onSelectArticle?.(selected.toString());
455
+ if (selected) {
456
+ const selectedId = selected.toString();
457
+ onSelectArticle?.(selectedId);
458
+ if (isSearching) {
459
+ setLastSelectedArticleId(selectedId);
460
+ setSearchValue("");
461
+ handleSearchArticles?.("");
462
+ }
463
+ }
416
464
  }
417
465
  }
418
466
  },
@@ -422,20 +470,43 @@ function ArticleTree({ articles }) {
422
470
  {
423
471
  ItemLinkComponent,
424
472
  item,
425
- onAddArticle: onAddArticle ? handleAddArticle : void 0,
426
- isAddingArticle: pendingAddIds.has(item.value.id),
473
+ onAddArticle: !isSearching && onAddArticle ? handleAddArticle : void 0,
474
+ isAddingArticle: !isSearching && pendingAddIds.has(item.value.id),
427
475
  onMoreActions: onMoreActions ? (articleId) => onMoreActions(articleId) : void 0,
476
+ isSearching,
428
477
  ...props
429
478
  }
430
- )), item.children && /* @__PURE__ */ React.createElement(Collection, { items: item.children }, renderItem));
479
+ )), !isSearching && item.children && /* @__PURE__ */ React.createElement(Collection, { items: item.children }, renderItem));
431
480
  }
432
481
  );
433
482
  }
434
483
 
484
+ function flattenAndFilterArticles(articles, query) {
485
+ const result = [];
486
+ const queryWords = query.toLowerCase().split(/\s+/).filter(Boolean);
487
+ const traverse = (items) => {
488
+ items.forEach((item) => {
489
+ const label = item.label.toLowerCase();
490
+ const isMatch = queryWords.every((word) => label.includes(word));
491
+ if (isMatch) {
492
+ result.push({ ...item, items: [] });
493
+ }
494
+ if (item.items) {
495
+ traverse(item.items);
496
+ }
497
+ });
498
+ };
499
+ traverse(articles);
500
+ return result;
501
+ }
435
502
  function ArticleNav({ articles, className }) {
436
- const { isSearching, onAddArticle } = useSidebar();
503
+ const { isSearching, searchValue, onAddArticle } = useSidebar();
504
+ const filteredArticles = React.useMemo(() => {
505
+ if (!isSearching || !articles) return [];
506
+ return flattenAndFilterArticles(articles, searchValue);
507
+ }, [articles, isSearching, searchValue]);
437
508
  return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col gap-0.5 px-4", className) }, !isSearching && (!articles || articles.length === 0) ? /* @__PURE__ */ React.createElement(Button, { variant: "ghost", className: "text-subtlest", onClick: () => onAddArticle?.(null).catch(() => {
438
- }) }, /* @__PURE__ */ React.createElement(Article, { "aria-hidden": "true" }), "Create first article or folder") : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ArticleSearch, null), articles?.length ? /* @__PURE__ */ React.createElement("nav", { "aria-label": "Articles navigation" }, /* @__PURE__ */ React.createElement(ArticleTree, { articles })) : isSearching && articles?.length === 0 ? /* @__PURE__ */ React.createElement("span", null, "No articles found") : null));
509
+ }) }, /* @__PURE__ */ React.createElement(Article, { "aria-hidden": "true" }), "Create first article or folder") : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ArticleSearch, null), isSearching ? filteredArticles.length > 0 ? /* @__PURE__ */ React.createElement(ArticleTree, { key: searchValue, articles: filteredArticles, isSearching: true }) : /* @__PURE__ */ React.createElement("span", { className: "text-subtlest text-sm px-2" }, "No articles found") : articles?.length ? /* @__PURE__ */ React.createElement("nav", { "aria-label": "Articles navigation" }, /* @__PURE__ */ React.createElement(ArticleTree, { articles })) : null));
439
510
  }
440
511
 
441
512
  function SectionNav({ className, items, activeId }) {
@@ -504,7 +575,7 @@ const Sidebar = React.forwardRef(function Sidebar2({
504
575
  ref,
505
576
  ...props,
506
577
  className: cn(
507
- "py-4 transition-width duration-200 ease-in-out flex flex-col h-dvh justify-between",
578
+ "py-4 transition-width duration-200 ease-in-out flex flex-col h-dvh",
508
579
  collapsed ? "w-[64px]" : "w-[260px]",
509
580
  className
510
581
  ),
@@ -524,7 +595,7 @@ const Sidebar = React.forwardRef(function Sidebar2({
524
595
  onBack: onAppBack
525
596
  }
526
597
  ),
527
- !collapsed && /* @__PURE__ */ React.createElement(React.Fragment, null, showArticles && /* @__PURE__ */ React.createElement(ScrollArea, { className: "flex-1", onScroll: handleScroll }, /* @__PURE__ */ React.createElement(ArticleNav, { className: "py-4 max-w-[var(--left-nav-width,inherit)]", articles })), sectionNavItems && sectionNavItems.length > 0 && /* @__PURE__ */ React.createElement(
598
+ !collapsed && /* @__PURE__ */ React.createElement(React.Fragment, null, showArticles && /* @__PURE__ */ React.createElement(ScrollArea, { onScroll: handleScroll }, /* @__PURE__ */ React.createElement(ArticleNav, { className: "py-4 max-w-[var(--left-nav-width,inherit)]", articles })), sectionNavItems && sectionNavItems.length > 0 && /* @__PURE__ */ React.createElement(
528
599
  SectionNav,
529
600
  {
530
601
  className: cn("pt-4 flex-shrink-0", !collapsed && !atScrollBottom && "border-t border-subtle"),
@@ -537,4 +608,4 @@ const Sidebar = React.forwardRef(function Sidebar2({
537
608
  });
538
609
 
539
610
  export { Sidebar as S, useSidebar as u };
540
- //# sourceMappingURL=sidebar.DhtJw8iP.js.map
611
+ //# sourceMappingURL=sidebar.kcc3uFga.js.map