@brainfish-ai/components 0.33.1 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/conversation.d.ts +55 -12
  2. package/dist/esm/chunks/{ChatSearch.EPCaUj3O.js → ChatSearch.D5EABw51.js} +2 -2
  3. package/dist/esm/chunks/{ChatSearch.EPCaUj3O.js.map → ChatSearch.D5EABw51.js.map} +1 -1
  4. package/dist/esm/chunks/Conversation.Dq66Znf4.js +33 -0
  5. package/dist/esm/chunks/Conversation.Dq66Znf4.js.map +1 -0
  6. package/dist/esm/chunks/{FormattedMessage.D_knqVl-.js → FormattedMessage.Djy5cn5F.js} +2 -2
  7. package/dist/esm/chunks/{FormattedMessage.D_knqVl-.js.map → FormattedMessage.Djy5cn5F.js.map} +1 -1
  8. package/dist/esm/chunks/ai-badge.Be0978vU.js +5 -0
  9. package/dist/esm/chunks/ai-badge.Be0978vU.js.map +1 -0
  10. package/dist/esm/chunks/{button.D_2SonNs.js → button.Cs1X8upM.js} +2 -2
  11. package/dist/esm/chunks/{button.D_2SonNs.js.map → button.Cs1X8upM.js.map} +1 -1
  12. package/dist/esm/chunks/{combobox.MyoPH18G.js → combobox.CLT9CXUV.js} +2 -2
  13. package/dist/esm/chunks/{combobox.MyoPH18G.js.map → combobox.CLT9CXUV.js.map} +1 -1
  14. package/dist/esm/chunks/{date-picker.C2VT_rZ9.js → date-picker.D9CRxYJf.js} +2 -2
  15. package/dist/esm/chunks/{date-picker.C2VT_rZ9.js.map → date-picker.D9CRxYJf.js.map} +1 -1
  16. package/dist/esm/chunks/{feedback.CLMuSvsg.js → feedback.CGFAP0XS.js} +2 -2
  17. package/dist/esm/chunks/{feedback.CLMuSvsg.js.map → feedback.CGFAP0XS.js.map} +1 -1
  18. package/dist/esm/chunks/{file-upload-status.D8RhMcbO.js → file-upload-status.ClQeoQQB.js} +2 -2
  19. package/dist/esm/chunks/{file-upload-status.D8RhMcbO.js.map → file-upload-status.ClQeoQQB.js.map} +1 -1
  20. package/dist/esm/chunks/{filters.BHp3ukNW.js → filters.BRlRsGlZ.js} +2 -2
  21. package/dist/esm/chunks/{filters.BHp3ukNW.js.map → filters.BRlRsGlZ.js.map} +1 -1
  22. package/dist/esm/chunks/{font-picker.B9GPXyK4.js → font-picker.Dwwe5av-.js} +2 -2
  23. package/dist/esm/chunks/{font-picker.B9GPXyK4.js.map → font-picker.Dwwe5av-.js.map} +1 -1
  24. package/dist/esm/chunks/header-nav.DR1jmsyS.js +11 -0
  25. package/dist/esm/chunks/header-nav.DR1jmsyS.js.map +1 -0
  26. package/dist/esm/chunks/{header-pane.eU7f_pim.js → header-pane.qjpYA99q.js} +2 -2
  27. package/dist/esm/chunks/{header-pane.eU7f_pim.js.map → header-pane.qjpYA99q.js.map} +1 -1
  28. package/dist/esm/chunks/index.Ca2JkOFO.js +2 -0
  29. package/dist/esm/chunks/index.Ca2JkOFO.js.map +1 -0
  30. package/dist/esm/chunks/{input-with-tags.DLv9e0XI.js → input-with-tags.pmOKv67d.js} +2 -2
  31. package/dist/esm/chunks/{input-with-tags.DLv9e0XI.js.map → input-with-tags.pmOKv67d.js.map} +1 -1
  32. package/dist/esm/chunks/{sidebar.CcFsNjrN.js → sidebar.BhcrMAU3.js} +8 -8
  33. package/dist/esm/chunks/{sidebar.CcFsNjrN.js.map → sidebar.BhcrMAU3.js.map} +1 -1
  34. package/dist/esm/chunks/{suggestion-card.D-AsG_yB.js → suggestion-card.TDn-dEc0.js} +2 -2
  35. package/dist/esm/chunks/{suggestion-card.D-AsG_yB.js.map → suggestion-card.TDn-dEc0.js.map} +1 -1
  36. package/dist/esm/chunks/{two-level-combobox.BVZfsNSN.js → two-level-combobox.SDv7qc_m.js} +2 -2
  37. package/dist/esm/chunks/{two-level-combobox.BVZfsNSN.js.map → two-level-combobox.SDv7qc_m.js.map} +1 -1
  38. package/dist/esm/components/article-suggestions-banner.js +1 -1
  39. package/dist/esm/components/articles-coverage.js +3 -3
  40. package/dist/esm/components/articles-updated.js +2 -2
  41. package/dist/esm/components/chat-search.js +1 -1
  42. package/dist/esm/components/combobox.js +1 -1
  43. package/dist/esm/components/conversation.js +1 -1
  44. package/dist/esm/components/convos.js +11 -11
  45. package/dist/esm/components/date-picker.js +1 -1
  46. package/dist/esm/components/feedback.js +1 -1
  47. package/dist/esm/components/file-upload.js +1 -1
  48. package/dist/esm/components/filter.js +1 -1
  49. package/dist/esm/components/font-picker.js +1 -1
  50. package/dist/esm/components/input-with-tags.js +1 -1
  51. package/dist/esm/components/markdown.js +1 -1
  52. package/dist/esm/components/two-level-combobox.js +1 -1
  53. package/dist/esm/components/ui/alert-dialog.js +1 -1
  54. package/dist/esm/components/ui/breadcrumb.js +1 -1
  55. package/dist/esm/components/ui/button-group.js +1 -1
  56. package/dist/esm/components/ui/button.js +1 -1
  57. package/dist/esm/components/ui/combobox.js +1 -1
  58. package/dist/esm/components/ui/div-button.js +1 -1
  59. package/dist/esm/components/ui/item.js +1 -1
  60. package/dist/esm/components/ui/sheet.js +1 -1
  61. package/dist/esm/components/ui/tooltip.js +3 -3
  62. package/dist/esm/components/ui/tooltip.js.map +1 -1
  63. package/dist/esm/global.css +1 -1
  64. package/dist/esm/index.js +1 -1
  65. package/dist/esm/layouts/full-layout.js +1 -1
  66. package/dist/esm/layouts/header-nav.js +1 -1
  67. package/dist/esm/layouts/sidebar.js +1 -1
  68. package/dist/esm/scenes/knowledge-review.js +1 -1
  69. package/dist/esm/tailwind.preset.js +1 -1
  70. package/dist/esm/tailwind.preset.js.map +1 -1
  71. package/dist/index.d.ts +55 -12
  72. package/dist/stats.html +1 -1
  73. package/package.json +7 -7
  74. package/tailwind.preset.ts +1 -1
  75. package/dist/esm/chunks/Conversation.C2TpUr4-.js +0 -29
  76. package/dist/esm/chunks/Conversation.C2TpUr4-.js.map +0 -1
  77. package/dist/esm/chunks/header-nav.DmlIUqml.js +0 -14
  78. package/dist/esm/chunks/header-nav.DmlIUqml.js.map +0 -1
  79. package/dist/esm/chunks/index.uF4ME3WQ.js +0 -4
  80. package/dist/esm/chunks/index.uF4ME3WQ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"header-pane.eU7f_pim.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/blurry-blob.tsx","../../../src/layouts/full-layout/layout.tsx","../../../src/layouts/full-layout/header-pane.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 /** Mirrors `FullLayout` prop; `FullLayout.Main` uses it for viewport height when Radix ScrollArea is off. */\n disableMainScrollArea: boolean;\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 { onBrainfishNativeClick, ...rest } = props;\n const ctx = useFullLayoutContext();\n if (!ctx) return null;\n\n const handleNativeClick = () => {\n ctx.toggleRightSidebar();\n onBrainfishNativeClick?.();\n };\n\n return (\n <HeaderNav\n {...rest}\n showSidebarToggle={!ctx.disableLeftSideNav}\n isSideNavOpen={ctx.isSideNavOpen}\n onSideNavigationToggle={ctx.toggleSidebar}\n onBrainfishNativeClick={handleNativeClick}\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 { useFullLayoutContext } from '../context';\n\nimport { Item } from '@/components/ui/item';\nimport { cn } from '@/lib/utils';\n\nexport function Main({ children, className }: { children?: React.ReactNode; className?: string }) {\n const ctx = useFullLayoutContext();\n const mainIsScrollContainer = ctx?.disableMainScrollArea ?? false;\n\n return (\n <Item\n className={cn(\n 'p-0',\n mainIsScrollContainer &&\n 'h-[calc(100dvh-var(--header-nav-height))] md:h-[calc(100dvh-var(--header-nav-height)-1rem)] min-h-0 overflow-y-auto p-4 md:p-8',\n className,\n )}\n >\n {children}\n </Item>\n );\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 scrollable?: boolean;\n}\n\nconst FullLayoutRightSidebar = React.forwardRef<HTMLElement, FullLayoutRightSidebarProps>(\n ({ open, scrollable = true, 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-dvh md:w-96 md:top-0',\n 'border-dark-300 border-l border-r-0 border-t-0 border-b-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 {scrollable ? (\n <ScrollArea className=\"h-[calc(100dvh-var(--header-nav-height))] md:h-dvh\">{children}</ScrollArea>\n ) : (\n children\n )}\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, scrollable }: { children?: React.ReactNode; scrollable?: boolean }) {\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 scrollable={scrollable}\n className=\"top-[var(--header-nav-height)]\"\n >\n {children}\n </FullLayoutRightSidebar>\n );\n}\nRightSidebar.displayName = 'FullLayout.RightSidebar';\n","import React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst blurryBlob = cva('blurry-blob', {\n variants: {\n variant: {\n topLeft: '',\n bottomRight: '!top-auto !left-auto !-bottom-[10%] !right-0 rotate-180',\n },\n },\n defaultVariants: {\n variant: 'topLeft',\n },\n});\n\ninterface BlurryBlobProps extends VariantProps<typeof blurryBlob> {\n className?: string;\n}\n\nexport const GooFilter = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"fixed top-0 left-0 w-0 h-0\">\n <defs>\n <filter id=\"goo\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"10\" result=\"blur\" />\n <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -8\" result=\"goo\" />\n <feBlend in=\"SourceGraphic\" in2=\"goo\" />\n </filter>\n </defs>\n </svg>\n);\n\nconst BlurryBlob = ({ className, variant }: BlurryBlobProps) => {\n return (\n <div className={cn(blurryBlob({ variant }), className)}>\n <div className=\"gradients-container\">\n <div className=\"g1\" />\n <div className=\"g2\" />\n <div className=\"g3\" />\n <div className=\"g4\" />\n </div>\n </div>\n );\n};\n\nexport default BlurryBlob;\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';\nimport BlurryBlob, { GooFilter } from './blurry-blob';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { FeatureFlagProvider } from '@/lib/feature-flags';\nimport type { FeatureFlags } from '@/lib/feature-flags';\nimport { cn } from '@/lib/utils';\n\nconst MIN_SIDENAV_WIDTH = 260;\nconst CLOSE_SIDENAV_THRESHOLD = MIN_SIDENAV_WIDTH - 32;\nconst MAX_SIDENAV_WIDTH = 600;\nconst RIGHT_SIDEBAR_WIDTH = 384;\n\nexport interface FullLayoutRootProps {\n children?: React.ReactNode;\n disableLeftSideNav?: boolean;\n /** When true, main column uses a plain div (no Radix ScrollArea); viewport height is applied on `FullLayout.Main`. */\n disableMainScrollArea?: boolean;\n className?: string;\n /** When true, the right sidebar is always open and cannot be toggled. */\n forceRightSidebarOpen?: boolean;\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({\n children,\n disableLeftSideNav = false,\n disableMainScrollArea = false,\n className,\n forceRightSidebarOpen = false,\n}: 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(forceRightSidebarOpen);\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 if (forceRightSidebarOpen) return;\n closeOtherSidebar('right');\n setIsRightSidebarOpen((prev) => !prev);\n }, [closeOtherSidebar, forceRightSidebarOpen]);\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 disableMainScrollArea,\n }),\n [\n isSideNavOpen,\n isRightSidebarOpen,\n toggleSidebar,\n openRightSidebar,\n closeRightSidebar,\n toggleRightSidebar,\n showSidenav,\n leftNavWidth,\n isMobile,\n disableLeftSideNav,\n disableMainScrollArea,\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 const mainPanelClasses =\n '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\n // --- Render the layout ---\n return (\n <FullLayoutProvider value={layoutContextValue}>\n <GooFilter />\n <BlurryBlob variant=\"topLeft\" />\n <BlurryBlob variant=\"bottomRight\" />\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 {disableMainScrollArea ? (\n <div className={cn('bg-surface', mainPanelClasses)}>\n <main className=\"min-w-0 relative\">{main}</main>\n </div>\n ) : (\n <>\n <ScrollArea\n className={cn(\n 'bg-surface h-[calc(100dvh-var(--header-nav-height))] md:h-[calc(100dvh-var(--header-nav-height)-1rem)]',\n mainPanelClasses,\n )}\n >\n <div className=\"min-h-full\">\n <main className={cn('min-w-0 overflow-visible relative p-4 md:p-8')}>{main}</main>\n </div>\n </ScrollArea>\n <div\n aria-hidden\n className=\"main-scroll-fade pointer-events-none sticky bottom-4 left-0 right-0 h-16 bg-gradient-to-t from-surface to-transparent md:rounded-b-lg\"\n />\n </>\n )}\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 prev.disableMainScrollArea === next.disableMainScrollArea\n );\n}\n\nconst FullLayoutRootMemo = React.memo(FullLayoutRoot, fullLayoutRootPropsAreEqual);\n\nexport interface FullLayoutProps extends FullLayoutRootProps {\n /** Feature flags for layout/header (e.g. platform.brainfish-native.enabled). Passed through to FeatureFlagProvider. */\n featureFlags?: FeatureFlags;\n}\n\nfunction FullLayoutWithFlags(props: FullLayoutProps) {\n const { featureFlags, ...layoutProps } = props;\n\n return (\n <FeatureFlagProvider flags={featureFlags}>\n <FullLayoutRootMemo {...layoutProps} />\n </FeatureFlagProvider>\n );\n}\n\ntype FullLayoutCompound = typeof FullLayoutWithFlags & {\n MainArea: typeof Compounds.MainArea;\n Body: typeof Compounds.Body;\n Header: typeof Compounds.Header;\n LeftSidebar: typeof Compounds.LeftSidebar;\n Main: typeof Compounds.Main;\n RightSidebar: typeof Compounds.RightSidebar;\n};\n\nconst FullLayout: FullLayoutCompound = Object.assign(FullLayoutWithFlags, {\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","import React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nexport interface FullLayoutHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n onOpenLeft?: () => void;\n onOpenRight?: () => void;\n}\n\nconst FullLayoutHeader = React.forwardRef<HTMLElement, FullLayoutHeaderProps>(\n ({ onOpenLeft, onOpenRight, className, children, ...props }, ref) => {\n return (\n <header\n ref={ref as React.Ref<HTMLHeadingElement>}\n data-slot=\"full-layout-header\"\n className={cn('h-16 bg-white shadow-md flex items-center px-4 shrink-0 sticky top-0 z-20', className)}\n {...props}\n >\n {onOpenLeft != null && (\n <button\n data-slot=\"full-layout-header-trigger-left\"\n type=\"button\"\n onClick={onOpenLeft}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors mr-4 lg:hidden\"\n aria-label=\"Toggle menu\"\n >\n <svg className=\"size-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n </button>\n )}\n <div data-slot=\"full-layout-header-center\" className=\"flex-1 min-w-0\">\n {children}\n </div>\n {onOpenRight != null && (\n <div data-slot=\"full-layout-header-trigger-right\" className=\"ml-auto\">\n <button\n type=\"button\"\n onClick={onOpenRight}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n aria-label=\"Toggle chat\"\n >\n <svg className=\"size-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\"\n />\n </svg>\n </button>\n </div>\n )}\n </header>\n );\n },\n);\n\nFullLayoutHeader.displayName = 'FullLayoutHeader';\n\nexport { FullLayoutHeader };\n"],"names":["FullLayoutNavStateContext","React","createContext","FullLayoutContext","FullLayoutProvider","value","children","createElement","Provider","useFullLayoutContext","useContext","useRightSidebar","ctx","Error","isOpen","isRightSidebarOpen","open","openRightSidebar","close","closeRightSidebar","toggle","toggleRightSidebar","MainArea","Body","Header","props","onBrainfishNativeClick","rest","HeaderNav","showSidebarToggle","disableLeftSideNav","isSideNavOpen","onSideNavigationToggle","toggleSidebar","sidebarToggleRef","displayName","FullLayoutLeftSidebar","forwardRef","widthPx","onResizeStart","onResizeKeyDown","ariaValuenow","ariaValuemin","ariaValuemax","sidebarProps","className","ref","id","tabIndex","cn","style","Sidebar","collapsed","role","onMouseDown","onKeyDown","LeftSidebar","navState","appNavActiveId","sectionNavActiveId","activeArticleId","sideNavRef","leftNavWidth","handleResizeStart","handleResizeKeyDown","Main","mainIsScrollContainer","disableMainScrollArea","Item","FullLayoutRightSidebar","scrollable","ScrollArea","RightSidebar","rightSidebarRef","blurryBlob","cva","variants","variant","topLeft","bottomRight","defaultVariants","GooFilter","xmlns","in","stdDeviation","result","mode","values","in2","BlurryBlob","MAX_SIDENAV_WIDTH","extractSlots","refs","out","arr","Children","toArray","key","Object","keys","match","find","c","isValidElement","type","FullLayoutRootMemo","memo","forceRightSidebarOpen","setIsSideNavOpen","useState","window","innerWidth","setIsRightSidebarOpen","isResizing","setIsResizing","gridWidth","setGridWidth","newMinNavWidth","useMemo","Math","max","min","round","setLeftNavWidth","useRef","gridRef","prevSideNavOpenRef","resizeAcRef","isMobile","useMediaQuery","isWideDesktop","useEffect","document","body","querySelector","overflow","el","current","ro","ResizeObserver","entry","contentRect","width","observe","disconnect","closeOtherSidebar","useCallback","opening","showSidenav","focus","prev","applyLeftNavWidth","newWidth","MIN_SIDENAV_WIDTH","e","preventDefault","AbortController","endResize","cursor","userSelect","handleMouseMove","clientX","handleMouseUp","setInert","removeAttribute","setAttribute","signal","addEventListener","abort","leftCol","rightCol","ariaRange","layoutContextValue","mainArea","rightSidebar","Compounds.MainArea","Compounds.RightSidebar","mainAreaChildren","header","Compounds.Header","Compounds.Body","bodyChildren","leftSidebar","main","Compounds.LeftSidebar","Compounds.Main","hasRightSidebar","mainPanelClasses","gridTemplateColumns","HEADER_NAV_HEIGHT","Fragment","next","FullLayout","assign","featureFlags","layoutProps","FeatureFlagProvider","flags","FullLayoutHeader","onOpenLeft","onOpenRight","onClick","fill","stroke","viewBox","strokeLinecap","strokeLinejoin","strokeWidth","d"],"mappings":"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"}
1
+ {"version":3,"file":"header-pane.qjpYA99q.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/blurry-blob.tsx","../../../src/layouts/full-layout/layout.tsx","../../../src/layouts/full-layout/header-pane.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 /** Mirrors `FullLayout` prop; `FullLayout.Main` uses it for viewport height when Radix ScrollArea is off. */\n disableMainScrollArea: boolean;\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 { onBrainfishNativeClick, ...rest } = props;\n const ctx = useFullLayoutContext();\n if (!ctx) return null;\n\n const handleNativeClick = () => {\n ctx.toggleRightSidebar();\n onBrainfishNativeClick?.();\n };\n\n return (\n <HeaderNav\n {...rest}\n showSidebarToggle={!ctx.disableLeftSideNav}\n isSideNavOpen={ctx.isSideNavOpen}\n onSideNavigationToggle={ctx.toggleSidebar}\n onBrainfishNativeClick={handleNativeClick}\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 { useFullLayoutContext } from '../context';\n\nimport { Item } from '@/components/ui/item';\nimport { cn } from '@/lib/utils';\n\nexport function Main({ children, className }: { children?: React.ReactNode; className?: string }) {\n const ctx = useFullLayoutContext();\n const mainIsScrollContainer = ctx?.disableMainScrollArea ?? false;\n\n return (\n <Item\n className={cn(\n 'p-0',\n mainIsScrollContainer &&\n 'h-[calc(100dvh-var(--header-nav-height))] md:h-[calc(100dvh-var(--header-nav-height)-1rem)] min-h-0 overflow-y-auto p-4 md:p-8',\n className,\n )}\n >\n {children}\n </Item>\n );\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 scrollable?: boolean;\n}\n\nconst FullLayoutRightSidebar = React.forwardRef<HTMLElement, FullLayoutRightSidebarProps>(\n ({ open, scrollable = true, 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-dvh md:w-96 md:top-0',\n 'border-dark-300 border-l border-r-0 border-t-0 border-b-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 {scrollable ? (\n <ScrollArea className=\"h-[calc(100dvh-var(--header-nav-height))] md:h-dvh\">{children}</ScrollArea>\n ) : (\n children\n )}\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, scrollable }: { children?: React.ReactNode; scrollable?: boolean }) {\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 scrollable={scrollable}\n className=\"top-[var(--header-nav-height)]\"\n >\n {children}\n </FullLayoutRightSidebar>\n );\n}\nRightSidebar.displayName = 'FullLayout.RightSidebar';\n","import React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst blurryBlob = cva('blurry-blob', {\n variants: {\n variant: {\n topLeft: '',\n bottomRight: '!top-auto !left-auto !-bottom-[10%] !right-0 rotate-180',\n },\n },\n defaultVariants: {\n variant: 'topLeft',\n },\n});\n\ninterface BlurryBlobProps extends VariantProps<typeof blurryBlob> {\n className?: string;\n}\n\nexport const GooFilter = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"fixed top-0 left-0 w-0 h-0\">\n <defs>\n <filter id=\"goo\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"10\" result=\"blur\" />\n <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -8\" result=\"goo\" />\n <feBlend in=\"SourceGraphic\" in2=\"goo\" />\n </filter>\n </defs>\n </svg>\n);\n\nconst BlurryBlob = ({ className, variant }: BlurryBlobProps) => {\n return (\n <div className={cn(blurryBlob({ variant }), className)}>\n <div className=\"gradients-container\">\n <div className=\"g1\" />\n <div className=\"g2\" />\n <div className=\"g3\" />\n <div className=\"g4\" />\n </div>\n </div>\n );\n};\n\nexport default BlurryBlob;\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';\nimport BlurryBlob, { GooFilter } from './blurry-blob';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { FeatureFlagProvider } from '@/lib/feature-flags';\nimport type { FeatureFlags } from '@/lib/feature-flags';\nimport { cn } from '@/lib/utils';\n\nconst MIN_SIDENAV_WIDTH = 260;\nconst CLOSE_SIDENAV_THRESHOLD = MIN_SIDENAV_WIDTH - 32;\nconst MAX_SIDENAV_WIDTH = 600;\nconst RIGHT_SIDEBAR_WIDTH = 384;\n\nexport interface FullLayoutRootProps {\n children?: React.ReactNode;\n disableLeftSideNav?: boolean;\n /** When true, main column uses a plain div (no Radix ScrollArea); viewport height is applied on `FullLayout.Main`. */\n disableMainScrollArea?: boolean;\n className?: string;\n /** When true, the right sidebar is always open and cannot be toggled. */\n forceRightSidebarOpen?: boolean;\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({\n children,\n disableLeftSideNav = false,\n disableMainScrollArea = false,\n className,\n forceRightSidebarOpen = false,\n}: 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(forceRightSidebarOpen);\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 if (forceRightSidebarOpen) return;\n closeOtherSidebar('right');\n setIsRightSidebarOpen((prev) => !prev);\n }, [closeOtherSidebar, forceRightSidebarOpen]);\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 disableMainScrollArea,\n }),\n [\n isSideNavOpen,\n isRightSidebarOpen,\n toggleSidebar,\n openRightSidebar,\n closeRightSidebar,\n toggleRightSidebar,\n showSidenav,\n leftNavWidth,\n isMobile,\n disableLeftSideNav,\n disableMainScrollArea,\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 const mainPanelClasses =\n '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\n // --- Render the layout ---\n return (\n <FullLayoutProvider value={layoutContextValue}>\n <GooFilter />\n <BlurryBlob variant=\"topLeft\" />\n <BlurryBlob variant=\"bottomRight\" />\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 {disableMainScrollArea ? (\n <div className={cn('bg-surface', mainPanelClasses)}>\n <main className=\"min-w-0 relative\">{main}</main>\n </div>\n ) : (\n <>\n <ScrollArea\n className={cn(\n 'bg-surface h-[calc(100dvh-var(--header-nav-height))] md:h-[calc(100dvh-var(--header-nav-height)-1rem)]',\n mainPanelClasses,\n )}\n >\n <div className=\"min-h-full\">\n <main className={cn('min-w-0 overflow-visible relative p-4 md:p-8')}>{main}</main>\n </div>\n </ScrollArea>\n <div\n aria-hidden\n className=\"main-scroll-fade pointer-events-none sticky bottom-4 left-0 right-0 h-16 bg-gradient-to-t from-surface to-transparent md:rounded-b-lg\"\n />\n </>\n )}\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 prev.disableMainScrollArea === next.disableMainScrollArea\n );\n}\n\nconst FullLayoutRootMemo = React.memo(FullLayoutRoot, fullLayoutRootPropsAreEqual);\n\nexport interface FullLayoutProps extends FullLayoutRootProps {\n /** Feature flags for layout/header (e.g. platform.brainfish-native.enabled). Passed through to FeatureFlagProvider. */\n featureFlags?: FeatureFlags;\n}\n\nfunction FullLayoutWithFlags(props: FullLayoutProps) {\n const { featureFlags, ...layoutProps } = props;\n\n return (\n <FeatureFlagProvider flags={featureFlags}>\n <FullLayoutRootMemo {...layoutProps} />\n </FeatureFlagProvider>\n );\n}\n\ntype FullLayoutCompound = typeof FullLayoutWithFlags & {\n MainArea: typeof Compounds.MainArea;\n Body: typeof Compounds.Body;\n Header: typeof Compounds.Header;\n LeftSidebar: typeof Compounds.LeftSidebar;\n Main: typeof Compounds.Main;\n RightSidebar: typeof Compounds.RightSidebar;\n};\n\nconst FullLayout: FullLayoutCompound = Object.assign(FullLayoutWithFlags, {\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","import React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nexport interface FullLayoutHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n onOpenLeft?: () => void;\n onOpenRight?: () => void;\n}\n\nconst FullLayoutHeader = React.forwardRef<HTMLElement, FullLayoutHeaderProps>(\n ({ onOpenLeft, onOpenRight, className, children, ...props }, ref) => {\n return (\n <header\n ref={ref as React.Ref<HTMLHeadingElement>}\n data-slot=\"full-layout-header\"\n className={cn('h-16 bg-white shadow-md flex items-center px-4 shrink-0 sticky top-0 z-20', className)}\n {...props}\n >\n {onOpenLeft != null && (\n <button\n data-slot=\"full-layout-header-trigger-left\"\n type=\"button\"\n onClick={onOpenLeft}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors mr-4 lg:hidden\"\n aria-label=\"Toggle menu\"\n >\n <svg className=\"size-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n </button>\n )}\n <div data-slot=\"full-layout-header-center\" className=\"flex-1 min-w-0\">\n {children}\n </div>\n {onOpenRight != null && (\n <div data-slot=\"full-layout-header-trigger-right\" className=\"ml-auto\">\n <button\n type=\"button\"\n onClick={onOpenRight}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n aria-label=\"Toggle chat\"\n >\n <svg className=\"size-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z\"\n />\n </svg>\n </button>\n </div>\n )}\n </header>\n );\n },\n);\n\nFullLayoutHeader.displayName = 'FullLayoutHeader';\n\nexport { FullLayoutHeader };\n"],"names":["FullLayoutNavStateContext","React","createContext","FullLayoutContext","FullLayoutProvider","value","children","createElement","Provider","useFullLayoutContext","useContext","useRightSidebar","ctx","Error","isOpen","isRightSidebarOpen","open","openRightSidebar","close","closeRightSidebar","toggle","toggleRightSidebar","MainArea","Body","Header","props","onBrainfishNativeClick","rest","HeaderNav","showSidebarToggle","disableLeftSideNav","isSideNavOpen","onSideNavigationToggle","toggleSidebar","sidebarToggleRef","displayName","FullLayoutLeftSidebar","forwardRef","widthPx","onResizeStart","onResizeKeyDown","ariaValuenow","ariaValuemin","ariaValuemax","sidebarProps","className","ref","id","tabIndex","cn","style","Sidebar","collapsed","role","onMouseDown","onKeyDown","LeftSidebar","navState","appNavActiveId","sectionNavActiveId","activeArticleId","sideNavRef","leftNavWidth","handleResizeStart","handleResizeKeyDown","Main","mainIsScrollContainer","disableMainScrollArea","Item","FullLayoutRightSidebar","scrollable","ScrollArea","RightSidebar","rightSidebarRef","blurryBlob","cva","variants","variant","topLeft","bottomRight","defaultVariants","GooFilter","xmlns","in","stdDeviation","result","mode","values","in2","BlurryBlob","MAX_SIDENAV_WIDTH","extractSlots","refs","out","arr","Children","toArray","key","Object","keys","match","find","c","isValidElement","type","FullLayoutRootMemo","memo","forceRightSidebarOpen","setIsSideNavOpen","useState","window","innerWidth","setIsRightSidebarOpen","isResizing","setIsResizing","gridWidth","setGridWidth","newMinNavWidth","useMemo","Math","max","min","round","setLeftNavWidth","useRef","gridRef","prevSideNavOpenRef","resizeAcRef","isMobile","useMediaQuery","isWideDesktop","useEffect","document","body","querySelector","overflow","el","current","ro","ResizeObserver","entry","contentRect","width","observe","disconnect","closeOtherSidebar","useCallback","opening","showSidenav","focus","prev","applyLeftNavWidth","newWidth","MIN_SIDENAV_WIDTH","e","preventDefault","AbortController","endResize","cursor","userSelect","handleMouseMove","clientX","handleMouseUp","setInert","removeAttribute","setAttribute","signal","addEventListener","abort","leftCol","rightCol","ariaRange","layoutContextValue","mainArea","rightSidebar","Compounds.MainArea","Compounds.RightSidebar","mainAreaChildren","header","Compounds.Header","Compounds.Body","bodyChildren","leftSidebar","main","Compounds.LeftSidebar","Compounds.Main","hasRightSidebar","mainPanelClasses","gridTemplateColumns","HEADER_NAV_HEIGHT","Fragment","next","FullLayout","assign","featureFlags","layoutProps","FeatureFlagProvider","flags","FullLayoutHeader","onOpenLeft","onOpenRight","onClick","fill","stroke","viewBox","strokeLinecap","strokeLinejoin","strokeWidth","d"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import*as e from"react";var t=Object.defineProperty,n=(e,n)=>t(e,"name",{value:n,configurable:!0});function r(e,t){if("function"==typeof e)return e(t);null!=e&&(e.current=t)}function o(...e){return t=>{let n=!1;const o=e.map(e=>{const o=r(e,t);return n||"function"!=typeof o||(n=!0),o});if(n)return()=>{for(let t=0;t<o.length;t++){const n=o[t];"function"==typeof n?n():r(e[t],null)}}}}function l(...t){return e.useCallback(o(...t),t)}n(r,"setRef"),n(o,"composeRefs"),n(l,"useComposedRefs");var i=Object.defineProperty,c=(e,t)=>i(e,"name",{value:t,configurable:!0});function a(t){const n=e.forwardRef((n,r)=>{let{children:o,...i}=n,c=null,a=!1;const s=[];h(o)&&"function"==typeof E&&(o=E(o._payload)),e.Children.forEach(o,e=>{if(m(e)){a=!0;const t=e;let n="child"in t.props?t.props.child:t.props.children;h(n)&&"function"==typeof E&&(n=E(n._payload)),c=f(t,n),s.push(c?.props?.children)}else s.push(e)}),c?c=e.cloneElement(c,void 0,s):!a&&1===e.Children.count(o)&&e.isValidElement(o)&&(c=o);const p=c?d(c):void 0,y=l(r,p);if(!c){if(o||0===o)throw new Error(a?S(t):g(t));return o}const b=u(i,c.props??{});return c.type!==e.Fragment&&(b.ref=r?y:p),e.cloneElement(c,b)});return n.displayName=`${t}.Slot`,n}c(a,"createSlot");var s=/* @__PURE__ */a("Slot"),p=Symbol.for("radix.slottable");c(function(e){const t=/* @__PURE__ */c(e=>"child"in e?e.children(e.child):e.children,"Slottable");return t.displayName=`${e}.Slottable`,t.__radixId=p,t},"createSlottable");var f=/* @__PURE__ */c((t,n)=>{if("child"in t.props){const n=t.props.child;return e.isValidElement(n)?e.cloneElement(n,void 0,t.props.children(n.props.children)):null}return e.isValidElement(n)?n:null},"getSlottableElementFromSlottable");function u(e,t){const n={...t};for(const r in t){const o=e[r],l=t[r];/^on[A-Z]/.test(r)?o&&l?n[r]=(...e)=>{const t=l(...e);return o(...e),t}:o&&(n[r]=o):"style"===r?n[r]={...o,...l}:"className"===r&&(n[r]=[o,l].filter(Boolean).join(" "))}return{...e,...n}}function d(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}function m(t){return e.isValidElement(t)&&"function"==typeof t.type&&"__radixId"in t.type&&t.type.__radixId===p}c(u,"mergeProps"),c(d,"getElementRef"),c(m,"isSlottable");var y=Symbol.for("react.lazy");function h(e){return null!=e&&"object"==typeof e&&"$$typeof"in e&&e.$$typeof===y&&"_payload"in e&&b(e._payload)}function b(e){return"object"==typeof e&&null!==e&&"then"in e}c(h,"isLazyComponent"),c(b,"isPromiseLike");var g=/* @__PURE__ */c(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),S=/* @__PURE__ */c(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),E=e[" use ".trim().toString()];export{s as S};
2
+ //# sourceMappingURL=index.Ca2JkOFO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.Ca2JkOFO.js","sources":["../../../../../node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.mjs","../../../../../node_modules/@radix-ui/react-slot/dist/index.mjs"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/compose-refs.tsx\nimport * as React from \"react\";\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\n__name(setRef, \"setRef\");\nfunction composeRefs(...refs) {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n__name(composeRefs, \"composeRefs\");\nfunction useComposedRefs(...refs) {\n return React.useCallback(composeRefs(...refs), refs);\n}\n__name(useComposedRefs, \"useComposedRefs\");\nexport {\n composeRefs,\n useComposedRefs\n};\n//# sourceMappingURL=index.mjs.map\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/slot.tsx\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n let { children, ...slotProps } = props;\n let slottableElement = null;\n let hasSlottable = false;\n const newChildren = [];\n if (isLazyComponent(children) && typeof use === \"function\") {\n children = use(children._payload);\n }\n React.Children.forEach(children, (maybeSlottable) => {\n if (isSlottable(maybeSlottable)) {\n hasSlottable = true;\n const slottable = maybeSlottable;\n let child = \"child\" in slottable.props ? slottable.props.child : slottable.props.children;\n if (isLazyComponent(child) && typeof use === \"function\") {\n child = use(child._payload);\n }\n slottableElement = getSlottableElementFromSlottable(slottable, child);\n newChildren.push(slottableElement?.props?.children);\n } else {\n newChildren.push(maybeSlottable);\n }\n });\n if (slottableElement) {\n slottableElement = React.cloneElement(slottableElement, void 0, newChildren);\n } else if (\n // A `Slottable` was found but it didn't resolve to a single element (e.g.\n // it wrapped multiple elements, text, or a render-prop `child` that\n // wasn't an element). Don't fall back to treating the `Slottable` wrapper\n // itself as the slot target — throw a descriptive error below instead.\n !hasSlottable && React.Children.count(children) === 1 && React.isValidElement(children)\n ) {\n slottableElement = children;\n }\n const slottableElementRef = slottableElement ? getElementRef(slottableElement) : void 0;\n const composedRef = useComposedRefs(forwardedRef, slottableElementRef);\n if (!slottableElement) {\n if (children || children === 0) {\n throw new Error(\n hasSlottable ? createSlottableError(ownerName) : createSlotError(ownerName)\n );\n }\n return children;\n }\n const mergedProps = mergeProps(slotProps, slottableElement.props ?? {});\n if (slottableElement.type !== React.Fragment) {\n mergedProps.ref = forwardedRef ? composedRef : slottableElementRef;\n }\n return React.cloneElement(slottableElement, mergedProps);\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\n__name(createSlot, \"createSlot\");\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\nvar SLOTTABLE_IDENTIFIER = Symbol.for(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = /* @__PURE__ */ __name((props) => \"child\" in props ? props.children(props.child) : props.children, \"Slottable\");\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\n__name(createSlottable, \"createSlottable\");\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nvar getSlottableElementFromSlottable = /* @__PURE__ */ __name((slottable, child) => {\n if (\"child\" in slottable.props) {\n const child2 = slottable.props.child;\n if (!React.isValidElement(child2)) return null;\n return React.cloneElement(child2, void 0, slottable.props.children(child2.props.children));\n }\n return React.isValidElement(child) ? child : null;\n}, \"getSlottableElementFromSlottable\");\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\n__name(mergeProps, \"mergeProps\");\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\n__name(getElementRef, \"getElementRef\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\n__name(isSlottable, \"isSlottable\");\nvar REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nfunction isLazyComponent(element) {\n return element != null && typeof element === \"object\" && \"$$typeof\" in element && element.$$typeof === REACT_LAZY_TYPE && \"_payload\" in element && isPromiseLike(element._payload);\n}\n__name(isLazyComponent, \"isLazyComponent\");\nfunction isPromiseLike(value) {\n return typeof value === \"object\" && value !== null && \"then\" in value;\n}\n__name(isPromiseLike, \"isPromiseLike\");\nvar createSlotError = /* @__PURE__ */ __name((ownerName) => {\n return `${ownerName} failed to slot onto its children. Expected a single React element child or \\`Slottable\\`.`;\n}, \"createSlotError\");\nvar createSlottableError = /* @__PURE__ */ __name((ownerName) => {\n return `${ownerName} failed to slot onto its \\`Slottable\\`. Expected \\`Slottable\\` to receive a single React element child.`;\n}, \"createSlottableError\");\nvar use = React[\" use \".trim().toString()];\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n"],"names":["__defProp","Object","defineProperty","__name","target","value","configurable","setRef","ref","current","composeRefs","refs","node","hasCleanup","cleanups","map","cleanup","i","length","useComposedRefs","React","useCallback","createSlot","ownerName","Slot2","forwardRef","props","forwardedRef","children","slotProps","slottableElement","hasSlottable","newChildren","isLazyComponent","use","_payload","Children","forEach","maybeSlottable","isSlottable","slottable","child","getSlottableElementFromSlottable","push","cloneElement","count","isValidElement","slottableElementRef","getElementRef","composedRef","Error","createSlottableError","createSlotError","mergedProps","mergeProps","type","Fragment","displayName","Slot","SLOTTABLE_IDENTIFIER","Symbol","for","Slottable2","__radixId","child2","childProps","overrideProps","propName","slotPropValue","childPropValue","test","args","result","filter","Boolean","join","element","getter","getOwnPropertyDescriptor","get","mayWarn","isReactWarning","REACT_LAZY_TYPE","$$typeof","isPromiseLike","trim","toString"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,5 +1,5 @@
1
- import*as e from"react";import{Plus as a}from"@phosphor-icons/react";import{c as t}from"./utils.C6Qu-kwd.js";import{Textarea as l}from"../components/ui/textarea.js";import{B as s}from"./button.D_2SonNs.js";function n({title:n,placeholder:r,tags:o,value:i,defaultValue:m,onChange:u,onTagClick:c,singleValue:d=!1,className:f,inputClassName:v,tagsClassName:p,disabled:g,name:h,id:x,required:N,maxLength:b,minLength:E,rows:w}){const C=e.useCallback(e=>{if(!e)/* @__PURE__ */return new Set;const a=e.trim(),t=/* @__PURE__ */new Set;for(const l of o){const e=l.value.trim();d?a===e&&t.add(l.value):(a===e||a.startsWith(e+" ")||a.includes(" "+e+" ")||a.endsWith(" "+e))&&t.add(l.value)}return t},[o,d]),S=void 0!==i?i:m||"",[k,L]=e.useState(m||""),[$,j]=e.useState(()=>C(S)),q=void 0!==i?i:k;e.useEffect(()=>{j(C(void 0!==i?i:k))},[i,k,o,d,C]);const y=o.filter(e=>!$.has(e.value));/* @__PURE__ */
1
+ import*as e from"react";import{Plus as a}from"@phosphor-icons/react";import{c as t}from"./utils.C6Qu-kwd.js";import{Textarea as l}from"../components/ui/textarea.js";import{B as s}from"./button.Cs1X8upM.js";function n({title:n,placeholder:r,tags:o,value:i,defaultValue:m,onChange:u,onTagClick:c,singleValue:d=!1,className:f,inputClassName:v,tagsClassName:p,disabled:g,name:h,id:x,required:N,maxLength:b,minLength:E,rows:w}){const C=e.useCallback(e=>{if(!e)/* @__PURE__ */return new Set;const a=e.trim(),t=/* @__PURE__ */new Set;for(const l of o){const e=l.value.trim();d?a===e&&t.add(l.value):(a===e||a.startsWith(e+" ")||a.includes(" "+e+" ")||a.endsWith(" "+e))&&t.add(l.value)}return t},[o,d]),S=void 0!==i?i:m||"",[k,L]=e.useState(m||""),[$,j]=e.useState(()=>C(S)),q=void 0!==i?i:k;e.useEffect(()=>{j(C(void 0!==i?i:k))},[i,k,o,d,C]);const y=o.filter(e=>!$.has(e.value));/* @__PURE__ */
2
2
  return e.createElement("div",{className:t("w-full flex flex-col gap-3",f)},n&&/* @__PURE__ */e.createElement("label",{htmlFor:x,className:"text-sm font-semibold"},n),/* @__PURE__ */e.createElement("div",{className:"relative w-full"},/* @__PURE__ */e.createElement(l,{id:x,name:h,placeholder:r,value:q,onChange:e=>{const a=e.target.value;void 0===i&&(L(a),j(C(a))),u?.(a)},disabled:g,required:N,maxLength:b,minLength:E,rows:w,className:v})),y.length>0&&/* @__PURE__ */e.createElement("div",{className:t("flex flex-wrap gap-2",p)},y.map((t,l)=>/* @__PURE__ */e.createElement(s,{key:`${t.value}-${l}`,type:"button",variant:"outline",size:"sm",onClick:()=>(e=>{const a=d?e.value:q?`${q} ${e.value}`:e.value;void 0===i&&(L(a),j(d?/* @__PURE__ */new Set([e.value]):C(a))),u?.(a),c?.(e)})(t),disabled:g,className:"rounded-full"},
3
3
  /* @__PURE__ */e.createElement(a,{size:16,className:"text-muted-foreground"}),
4
4
  /* @__PURE__ */e.createElement("span",null,t.label)))))}export{n as I};
5
- //# sourceMappingURL=input-with-tags.DLv9e0XI.js.map
5
+ //# sourceMappingURL=input-with-tags.pmOKv67d.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-with-tags.DLv9e0XI.js","sources":["../../../src/components/input-with-tags/input-with-tags.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Plus } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Button } from '@/components/ui/button';\n\nexport interface Tag {\n label: string;\n value: string;\n}\n\nexport interface InputWithTagsProps {\n title: string;\n placeholder?: string;\n tags: Tag[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onTagClick?: (tag: Tag) => void;\n singleValue?: boolean; // If true, clicking a tag replaces the value instead of appending\n className?: string;\n inputClassName?: string;\n tagsClassName?: string;\n disabled?: boolean;\n // Standard textarea props\n name?: string;\n id?: string;\n required?: boolean;\n maxLength?: number;\n minLength?: number;\n rows?: number;\n}\n\nexport function InputWithTags({\n title,\n placeholder,\n tags,\n value: controlledValue,\n defaultValue,\n onChange,\n onTagClick,\n singleValue = false,\n className,\n inputClassName,\n tagsClassName,\n disabled,\n name,\n id,\n required,\n maxLength,\n minLength,\n rows,\n}: InputWithTagsProps) {\n // Helper to find tags present in value (tags are appended as: `${value} ${tag.value}`)\n const findTagsInValue = React.useCallback(\n (val: string): Set<string> => {\n if (!val) return new Set();\n const trimmedVal = val.trim();\n const foundTags = new Set<string>();\n\n for (const tag of tags) {\n const tagValue = tag.value.trim();\n if (singleValue) {\n if (trimmedVal === tagValue) {\n foundTags.add(tag.value);\n }\n } else {\n // Check if tag appears as complete segment (tags are appended as: `${value} ${tag.value}`)\n // Need to check: exact match, at start, in middle, or at end\n if (\n trimmedVal === tagValue ||\n trimmedVal.startsWith(tagValue + ' ') ||\n trimmedVal.includes(' ' + tagValue + ' ') ||\n trimmedVal.endsWith(' ' + tagValue)\n ) {\n foundTags.add(tag.value);\n }\n }\n }\n\n return foundTags;\n },\n [tags, singleValue],\n );\n\n // Initialize clickedTags based on initial value\n const initialValue = controlledValue !== undefined ? controlledValue : defaultValue || '';\n const [internalValue, setInternalValue] = React.useState(defaultValue || '');\n const [clickedTags, setClickedTags] = React.useState<Set<string>>(() => findTagsInValue(initialValue));\n\n // Use controlled value if provided, otherwise use internal state\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n\n // Update clickedTags when value or tags change\n React.useEffect(() => {\n const currentValue = controlledValue !== undefined ? controlledValue : internalValue;\n setClickedTags(findTagsInValue(currentValue));\n }, [controlledValue, internalValue, tags, singleValue, findTagsInValue]);\n\n // Filter out clicked tags\n const availableTags = tags.filter((tag) => !clickedTags.has(tag.value));\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n // Sync clickedTags with the new value in uncontrolled mode\n setClickedTags(findTagsInValue(newValue));\n }\n onChange?.(newValue);\n };\n\n const handleTagClick = (tag: Tag) => {\n const newValue = singleValue ? tag.value : value ? `${value} ${tag.value}` : tag.value;\n if (controlledValue === undefined) {\n // In uncontrolled mode, update state and sync clickedTags immediately\n setInternalValue(newValue);\n // Sync clickedTags with the new value\n if (singleValue) {\n setClickedTags(new Set([tag.value]));\n } else {\n setClickedTags(findTagsInValue(newValue));\n }\n }\n // In controlled mode, only call onChange - let useEffect sync clickedTags when controlledValue updates\n onChange?.(newValue);\n onTagClick?.(tag);\n };\n\n return (\n <div className={cn('w-full flex flex-col gap-3', className)}>\n {title && (\n <label htmlFor={id} className=\"text-sm font-semibold\">\n {title}\n </label>\n )}\n <div className=\"relative w-full\">\n <Textarea\n id={id}\n name={name}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n maxLength={maxLength}\n minLength={minLength}\n rows={rows}\n className={inputClassName}\n />\n </div>\n {availableTags.length > 0 && (\n <div className={cn('flex flex-wrap gap-2', tagsClassName)}>\n {availableTags.map((tag, index) => (\n <Button\n key={`${tag.value}-${index}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleTagClick(tag)}\n disabled={disabled}\n className=\"rounded-full\"\n >\n <Plus size={16} className=\"text-muted-foreground\" />\n <span>{tag.label}</span>\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":["InputWithTags","title","placeholder","tags","value","controlledValue","defaultValue","onChange","onTagClick","singleValue","className","inputClassName","tagsClassName","disabled","name","id","required","maxLength","minLength","rows","findTagsInValue","React","useCallback","val","Set","trimmedVal","trim","foundTags","tag","tagValue","add","startsWith","includes","endsWith","initialValue","internalValue","setInternalValue","useState","clickedTags","setClickedTags","useEffect","availableTags","filter","has","cn","createElement","htmlFor","Textarea","e","newValue","target","length","map","index","Button","key","type","variant","size","onClick","handleTagClick","Plus","label"],"mappings":"8MAkCO,SAASA,GAAcC,MAC5BA,EAAAC,YACAA,EAAAC,KACAA,EACAC,MAAOC,EAAAC,aACPA,EAAAC,SACAA,EAAAC,WACAA,EAAAC,YACAA,GAAc,EAAAC,UACdA,EAAAC,eACAA,EAAAC,cACAA,EAAAC,SACAA,EAAAC,KACAA,EAAAC,GACAA,EAAAC,SACAA,EAAAC,UACAA,EAAAC,UACAA,EAAAC,KACAA,IAGA,MAAMC,EAAkBC,EAAMC,YAC3BC,IACC,IAAKA,iBAAK,OAAO,IAAIC,IACrB,MAAMC,EAAaF,EAAIG,OACjBC,qBAAgBH,IAEtB,IAAA,MAAWI,KAAOzB,EAAM,CACtB,MAAM0B,EAAWD,EAAIxB,MAAMsB,OACvBjB,EACEgB,IAAeI,GACjBF,EAAUG,IAAIF,EAAIxB,QAMlBqB,IAAeI,GACfJ,EAAWM,WAAWF,EAAW,MACjCJ,EAAWO,SAAS,IAAMH,EAAW,MACrCJ,EAAWQ,SAAS,IAAMJ,KAE1BF,EAAUG,IAAIF,EAAIxB,MAGxB,CAEA,OAAOuB,GAET,CAACxB,EAAMM,IAIHyB,OAAmC,IAApB7B,EAAgCA,EAAkBC,GAAgB,IAChF6B,EAAeC,GAAoBf,EAAMgB,SAAS/B,GAAgB,KAClEgC,EAAaC,GAAkBlB,EAAMgB,SAAsB,IAAMjB,EAAgBc,IAGlF9B,OAA4B,IAApBC,EAAgCA,EAAkB8B,EAGhEd,EAAMmB,UAAU,KAEdD,EAAenB,OAD0B,IAApBf,EAAgCA,EAAkB8B,KAEtE,CAAC9B,EAAiB8B,EAAehC,EAAMM,EAAaW,IAGvD,MAAMqB,EAAgBtC,EAAKuC,OAAQd,IAASU,EAAYK,IAAIf,EAAIxB;AA6BhE,uBACG,MAAA,CAAIM,UAAWkC,EAAG,6BAA8BlC,IAC9CT,kBACCoB,EAAAwB,cAAC,SAAMC,QAAS/B,EAAIL,UAAU,yBAC3BT,kBAGLoB,EAAAwB,cAAC,MAAA,CAAInC,UAAU,kCACbW,EAAAwB,cAACE,EAAA,CACChC,KACAD,OACAZ,cACAE,QACAG,SAxCmByC,IACzB,MAAMC,EAAWD,EAAEE,OAAO9C,WACF,IAApBC,IACF+B,EAAiBa,GAEjBV,EAAenB,EAAgB6B,KAEjC1C,IAAW0C,IAkCLpC,WACAG,WACAC,YACAC,YACAC,OACAT,UAAWC,KAGd8B,EAAcU,OAAS,kCACrB,MAAA,CAAIzC,UAAWkC,EAAG,uBAAwBhC,IACxC6B,EAAcW,IAAI,CAACxB,EAAKyB,mBACvBhC,EAAAwB,cAACS,EAAA,CACCC,IAAK,GAAG3B,EAAIxB,SAASiD,IACrBG,KAAK,SACLC,QAAQ,UACRC,KAAK,KACLC,QAAS,IA/CE,CAAC/B,IACtB,MAAMqB,EAAWxC,EAAcmB,EAAIxB,MAAQA,EAAQ,GAAGA,KAASwB,EAAIxB,QAAUwB,EAAIxB,WACzD,IAApBC,IAEF+B,EAAiBa,GAGfV,EADE9B,qBACiBe,IAAI,CAACI,EAAIxB,QAEbgB,EAAgB6B,KAInC1C,IAAW0C,GACXzC,IAAaoB,IAiCYgC,CAAehC,GAC9Bf,WACAH,UAAU;eAEVW,EAAAwB,cAACgB,EAAA,CAAKH,KAAM,GAAIhD,UAAU;eAC1BW,EAAAwB,cAAC,OAAA,KAAMjB,EAAIkC,UAOzB"}
1
+ {"version":3,"file":"input-with-tags.pmOKv67d.js","sources":["../../../src/components/input-with-tags/input-with-tags.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Plus } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Button } from '@/components/ui/button';\n\nexport interface Tag {\n label: string;\n value: string;\n}\n\nexport interface InputWithTagsProps {\n title: string;\n placeholder?: string;\n tags: Tag[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onTagClick?: (tag: Tag) => void;\n singleValue?: boolean; // If true, clicking a tag replaces the value instead of appending\n className?: string;\n inputClassName?: string;\n tagsClassName?: string;\n disabled?: boolean;\n // Standard textarea props\n name?: string;\n id?: string;\n required?: boolean;\n maxLength?: number;\n minLength?: number;\n rows?: number;\n}\n\nexport function InputWithTags({\n title,\n placeholder,\n tags,\n value: controlledValue,\n defaultValue,\n onChange,\n onTagClick,\n singleValue = false,\n className,\n inputClassName,\n tagsClassName,\n disabled,\n name,\n id,\n required,\n maxLength,\n minLength,\n rows,\n}: InputWithTagsProps) {\n // Helper to find tags present in value (tags are appended as: `${value} ${tag.value}`)\n const findTagsInValue = React.useCallback(\n (val: string): Set<string> => {\n if (!val) return new Set();\n const trimmedVal = val.trim();\n const foundTags = new Set<string>();\n\n for (const tag of tags) {\n const tagValue = tag.value.trim();\n if (singleValue) {\n if (trimmedVal === tagValue) {\n foundTags.add(tag.value);\n }\n } else {\n // Check if tag appears as complete segment (tags are appended as: `${value} ${tag.value}`)\n // Need to check: exact match, at start, in middle, or at end\n if (\n trimmedVal === tagValue ||\n trimmedVal.startsWith(tagValue + ' ') ||\n trimmedVal.includes(' ' + tagValue + ' ') ||\n trimmedVal.endsWith(' ' + tagValue)\n ) {\n foundTags.add(tag.value);\n }\n }\n }\n\n return foundTags;\n },\n [tags, singleValue],\n );\n\n // Initialize clickedTags based on initial value\n const initialValue = controlledValue !== undefined ? controlledValue : defaultValue || '';\n const [internalValue, setInternalValue] = React.useState(defaultValue || '');\n const [clickedTags, setClickedTags] = React.useState<Set<string>>(() => findTagsInValue(initialValue));\n\n // Use controlled value if provided, otherwise use internal state\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n\n // Update clickedTags when value or tags change\n React.useEffect(() => {\n const currentValue = controlledValue !== undefined ? controlledValue : internalValue;\n setClickedTags(findTagsInValue(currentValue));\n }, [controlledValue, internalValue, tags, singleValue, findTagsInValue]);\n\n // Filter out clicked tags\n const availableTags = tags.filter((tag) => !clickedTags.has(tag.value));\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n // Sync clickedTags with the new value in uncontrolled mode\n setClickedTags(findTagsInValue(newValue));\n }\n onChange?.(newValue);\n };\n\n const handleTagClick = (tag: Tag) => {\n const newValue = singleValue ? tag.value : value ? `${value} ${tag.value}` : tag.value;\n if (controlledValue === undefined) {\n // In uncontrolled mode, update state and sync clickedTags immediately\n setInternalValue(newValue);\n // Sync clickedTags with the new value\n if (singleValue) {\n setClickedTags(new Set([tag.value]));\n } else {\n setClickedTags(findTagsInValue(newValue));\n }\n }\n // In controlled mode, only call onChange - let useEffect sync clickedTags when controlledValue updates\n onChange?.(newValue);\n onTagClick?.(tag);\n };\n\n return (\n <div className={cn('w-full flex flex-col gap-3', className)}>\n {title && (\n <label htmlFor={id} className=\"text-sm font-semibold\">\n {title}\n </label>\n )}\n <div className=\"relative w-full\">\n <Textarea\n id={id}\n name={name}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n maxLength={maxLength}\n minLength={minLength}\n rows={rows}\n className={inputClassName}\n />\n </div>\n {availableTags.length > 0 && (\n <div className={cn('flex flex-wrap gap-2', tagsClassName)}>\n {availableTags.map((tag, index) => (\n <Button\n key={`${tag.value}-${index}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleTagClick(tag)}\n disabled={disabled}\n className=\"rounded-full\"\n >\n <Plus size={16} className=\"text-muted-foreground\" />\n <span>{tag.label}</span>\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":["InputWithTags","title","placeholder","tags","value","controlledValue","defaultValue","onChange","onTagClick","singleValue","className","inputClassName","tagsClassName","disabled","name","id","required","maxLength","minLength","rows","findTagsInValue","React","useCallback","val","Set","trimmedVal","trim","foundTags","tag","tagValue","add","startsWith","includes","endsWith","initialValue","internalValue","setInternalValue","useState","clickedTags","setClickedTags","useEffect","availableTags","filter","has","cn","createElement","htmlFor","Textarea","e","newValue","target","length","map","index","Button","key","type","variant","size","onClick","handleTagClick","Plus","label"],"mappings":"8MAkCO,SAASA,GAAcC,MAC5BA,EAAAC,YACAA,EAAAC,KACAA,EACAC,MAAOC,EAAAC,aACPA,EAAAC,SACAA,EAAAC,WACAA,EAAAC,YACAA,GAAc,EAAAC,UACdA,EAAAC,eACAA,EAAAC,cACAA,EAAAC,SACAA,EAAAC,KACAA,EAAAC,GACAA,EAAAC,SACAA,EAAAC,UACAA,EAAAC,UACAA,EAAAC,KACAA,IAGA,MAAMC,EAAkBC,EAAMC,YAC3BC,IACC,IAAKA,iBAAK,OAAO,IAAIC,IACrB,MAAMC,EAAaF,EAAIG,OACjBC,qBAAgBH,IAEtB,IAAA,MAAWI,KAAOzB,EAAM,CACtB,MAAM0B,EAAWD,EAAIxB,MAAMsB,OACvBjB,EACEgB,IAAeI,GACjBF,EAAUG,IAAIF,EAAIxB,QAMlBqB,IAAeI,GACfJ,EAAWM,WAAWF,EAAW,MACjCJ,EAAWO,SAAS,IAAMH,EAAW,MACrCJ,EAAWQ,SAAS,IAAMJ,KAE1BF,EAAUG,IAAIF,EAAIxB,MAGxB,CAEA,OAAOuB,GAET,CAACxB,EAAMM,IAIHyB,OAAmC,IAApB7B,EAAgCA,EAAkBC,GAAgB,IAChF6B,EAAeC,GAAoBf,EAAMgB,SAAS/B,GAAgB,KAClEgC,EAAaC,GAAkBlB,EAAMgB,SAAsB,IAAMjB,EAAgBc,IAGlF9B,OAA4B,IAApBC,EAAgCA,EAAkB8B,EAGhEd,EAAMmB,UAAU,KAEdD,EAAenB,OAD0B,IAApBf,EAAgCA,EAAkB8B,KAEtE,CAAC9B,EAAiB8B,EAAehC,EAAMM,EAAaW,IAGvD,MAAMqB,EAAgBtC,EAAKuC,OAAQd,IAASU,EAAYK,IAAIf,EAAIxB;AA6BhE,uBACG,MAAA,CAAIM,UAAWkC,EAAG,6BAA8BlC,IAC9CT,kBACCoB,EAAAwB,cAAC,SAAMC,QAAS/B,EAAIL,UAAU,yBAC3BT,kBAGLoB,EAAAwB,cAAC,MAAA,CAAInC,UAAU,kCACbW,EAAAwB,cAACE,EAAA,CACChC,KACAD,OACAZ,cACAE,QACAG,SAxCmByC,IACzB,MAAMC,EAAWD,EAAEE,OAAO9C,WACF,IAApBC,IACF+B,EAAiBa,GAEjBV,EAAenB,EAAgB6B,KAEjC1C,IAAW0C,IAkCLpC,WACAG,WACAC,YACAC,YACAC,OACAT,UAAWC,KAGd8B,EAAcU,OAAS,kCACrB,MAAA,CAAIzC,UAAWkC,EAAG,uBAAwBhC,IACxC6B,EAAcW,IAAI,CAACxB,EAAKyB,mBACvBhC,EAAAwB,cAACS,EAAA,CACCC,IAAK,GAAG3B,EAAIxB,SAASiD,IACrBG,KAAK,SACLC,QAAQ,UACRC,KAAK,KACLC,QAAS,IA/CE,CAAC/B,IACtB,MAAMqB,EAAWxC,EAAcmB,EAAIxB,MAAQA,EAAQ,GAAGA,KAASwB,EAAIxB,QAAUwB,EAAIxB,WACzD,IAApBC,IAEF+B,EAAiBa,GAGfV,EADE9B,qBACiBe,IAAI,CAACI,EAAIxB,QAEbgB,EAAgB6B,KAInC1C,IAAW0C,GACXzC,IAAaoB,IAiCYgC,CAAehC,GAC9Bf,WACAH,UAAU;eAEVW,EAAAwB,cAACgB,EAAA,CAAKH,KAAM,GAAIhD,UAAU;eAC1BW,EAAAwB,cAAC,OAAA,KAAMjB,EAAIkC,UAOzB"}
@@ -1,25 +1,25 @@
1
- import*as e from"react";import{ScrollArea as t}from"../components/ui/scroll-area.js";import{c as a}from"./utils.C6Qu-kwd.js";import{ArrowBendUpLeft as r,X as n,MagnifyingGlass as i,Folder as l,FolderOpen as s,FolderDashed as o,DotsThree as c,Plus as d,FileDashed as m,File as u,Lightning as f,Article as p}from"@phosphor-icons/react";import{B as h}from"./button.D_2SonNs.js";import{useToggle as g,useDebounceValue as v}from"usehooks-ts";import{Input as b}from"../components/ui/input.js";import{TreeStateContext as x,Button as E,useTreeData as y,useDragAndDrop as A,DropIndicator as k,Tree as S,TreeItem as N,TreeItemContent as I,Collection as w}from"react-aria-components";import{ButtonGroup as C}from"../components/ui/button-group.js";import{Spinner as M}from"../components/ui/spinner.js";import{u as z}from"./hooks.BQTKhHSv.js";const L=e.createContext(null);function j({collapsed:t,ItemLinkComponent:a,activeArticleId:r,onSelectArticle:n,onExpandArticle:i,onSearchArticles:l,onAddArticle:s,onMoreActions:o,canMoveArticle:c,onMoveArticle:d,children:m}){const[u,f]=e.useState(!1),[p,h]=e.useState(""),[g,v]=e.useState(null),b=e.useCallback(e=>{const t=e.trim();f(""!==t),l?.(e)},[l]),x=e.useMemo(()=>({collapsed:t,ItemLinkComponent:a,activeArticleId:r,onSearchArticles:l,onSelectArticle:n,onExpandArticle:i,onAddArticle:s,onMoreActions:o,canMoveArticle:c,onMoveArticle:d,isSearching:u,searchValue:p,setSearchValue:h,lastSelectedArticleId:g,setLastSelectedArticleId:v,handleSearchArticles:b}),[u,p,g,t,a,r,n,i,l,s,o,c,d,b]);/* @__PURE__ */
1
+ import*as e from"react";import{ScrollArea as t}from"../components/ui/scroll-area.js";import{c as a}from"./utils.C6Qu-kwd.js";import{ArrowBendUpLeft as r,X as n,MagnifyingGlass as i,Folder as l,FolderOpen as s,FolderDashed as o,DotsThree as c,Plus as d,FileDashed as m,File as u,Lightning as f,Article as p}from"@phosphor-icons/react";import{B as h}from"./button.Cs1X8upM.js";import{useToggle as g,useDebounceValue as v}from"usehooks-ts";import{Input as b}from"../components/ui/input.js";import{TreeStateContext as x,Button as E,useTreeData as y,useDragAndDrop as A,DropIndicator as k,Tree as S,TreeItem as N,TreeItemContent as I,Collection as w}from"react-aria-components";import{ButtonGroup as C}from"../components/ui/button-group.js";import{Spinner as M}from"../components/ui/spinner.js";import{u as z}from"./hooks.BQTKhHSv.js";const L=e.createContext(null);function j({collapsed:t,ItemLinkComponent:a,activeArticleId:r,onSelectArticle:n,onExpandArticle:i,onSearchArticles:l,onAddArticle:s,onMoreActions:o,canMoveArticle:c,onMoveArticle:d,children:m}){const[u,f]=e.useState(!1),[p,h]=e.useState(""),[g,v]=e.useState(null),b=e.useCallback(e=>{const t=e.trim();f(""!==t),l?.(e)},[l]),x=e.useMemo(()=>({collapsed:t,ItemLinkComponent:a,activeArticleId:r,onSearchArticles:l,onSelectArticle:n,onExpandArticle:i,onAddArticle:s,onMoreActions:o,canMoveArticle:c,onMoveArticle:d,isSearching:u,searchValue:p,setSearchValue:h,lastSelectedArticleId:g,setLastSelectedArticleId:v,handleSearchArticles:b}),[u,p,g,t,a,r,n,i,l,s,o,c,d,b]);/* @__PURE__ */
2
2
  return e.createElement(L.Provider,{value:x},m)}function B(){const t=e.useContext(L);if(!t)throw new Error("useSidebar must be used within SidebarProvider");return t}function P({className:t,items:r,activeId:n}){const{ItemLinkComponent:i}=B();/* @__PURE__ */
3
3
  return e.createElement("nav",{className:a("flex flex-col",t),"aria-label":"App section navigation"},r.map(t=>/* @__PURE__ */e.createElement(i,{key:t.id,href:t.href,"data-sidebar-item-id":t.id,"data-sidebar-item-type":"section","data-sidebar-section-nav-item-selected":t.id===n,className:a("flex p-2 mx-4 text-sm text-default relative rounded-lg","after:transition-opacity after:absolute after:top-0 after:bottom-0 after:-right-4 after:w-2 after:bg-primary after:rounded-l-md after:opacity-0","hover:bg-dark-200 focus:bg-dark-200 hover:text-accent-foreground focus:text-accent-foreground",t.id===n&&"font-bold after:opacity-100")},t.label)))}function $({className:n,items:i,activeId:l,showBack:s,onBack:o,sectionNavItems:c,sectionNavActiveId:d}){const{collapsed:m,ItemLinkComponent:u}=B(),f=!!s&&!!o;/* @__PURE__ */
4
4
  return e.createElement("nav",{className:a("flex flex-col gap-2",n),"aria-label":"App navigation"},f&&/* @__PURE__ */e.createElement(h,{variant:"link",className:a("py-2 text-base text-default w-full mx-4",m?"justify-center":"justify-start"),size:"icon",onClick:o},
5
5
  /* @__PURE__ */e.createElement(r,{"aria-hidden":"true"}),
6
6
  /* @__PURE__ */e.createElement("span",{className:a(m&&"sr-only")},"back to Brainfish")),/* @__PURE__ */e.createElement(t,{className:"min-h-0 max-h-[calc(100dvh-var(--header-nav-height)-5rem)]"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-2 mx-4"},i?.map(t=>/* @__PURE__ */e.createElement(e.Fragment,{key:t.id},/* @__PURE__ */e.createElement(u,{className:a("flex p-2 rounded-lg gap-1 text-base text-default items-center",t.id===l?"bg-primary text-primary-foreground font-bold hover:text-primary-foreground focus:text-primary-foreground":"hover:bg-dark-200 focus:bg-dark-200 hover:text-accent-foreground focus:text-accent-foreground"),href:t.href,"data-sidebar-item-id":t.id,"data-sidebar-item-type":"app","data-sidebar-app-nav-item-selected":t.id===l},t.Icon?/* @__PURE__ */e.createElement(t.Icon,{weight:t.id===l?"fill":"regular",size:16}):null,
7
- /* @__PURE__ */e.createElement("span",{className:a("transition-opacity duration-200",m&&"opacity-0 sr-only")},t.label)),t.id===l&&c&&c.length>0&&!m&&/* @__PURE__ */e.createElement(P,{className:a("flex-shrink-0"),items:c,activeId:d}))))))}function D(){const{handleSearchArticles:t,searchValue:a,setSearchValue:r}=B(),[l,,s]=g(!1),o=e.useRef(null);return e.useEffect(()=>{l&&t?.(a)},[a,t,l]),/* @__PURE__ */e.createElement("div",{className:"mb-2"},/* @__PURE__ */e.createElement(b,{ref:o,className:"h-auto text-subtlest border-border-subtle",startIcon:i,endIcon:a?n:void 0,onEndIconClick:()=>{r(""),t?.("")},value:a,onChange:e=>{const a=e.target.value;l||s(!0),r(a),""===a.trim()&&(t(""),s(!1))},placeholder:"Find an article","aria-label":"Find an article",type:"search"}))}function K({children:t}){/* @__PURE__ */
8
- return e.createElement(E,{slot:"chevron",className:"relative z-30 flex p-0"},/* @__PURE__ */e.createElement("span",{className:"relative inline-flex size-3 items-center justify-center"},t))}function V({item:t,hasChildItems:r,isSelected:n,isExpanded:i,ItemLinkComponent:p,onAddArticle:g,isAddingArticle:v,isLoadingChildren:b,onMoreActions:y,level:A}){const{isSearching:k}=B(),S=e.useContext(x),N=Boolean(n),I=!!(g&&!v||y),w="draft"===t.value.status;let z;switch(t.value.status){case"draft":z="(draft)";break;case"unpublished":z="(unpublished changes)";break;default:z=""}const L=/* @__PURE__ */e.createElement(K,null,/* @__PURE__ */e.createElement(l,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-0":"opacity-100")}),/* @__PURE__ */e.createElement(s,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-100":"opacity-0")})),j=/* @__PURE__ */e.createElement(K,null,/* @__PURE__ */e.createElement(o,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-0":"opacity-100")}),/* @__PURE__ */e.createElement(s,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-100":"opacity-0")})),P=/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("span",{className:"sr-only"},"Knowledge Discovery"),/* @__PURE__ */e.createElement(f,{"aria-hidden":"true",weight:"fill",className:"size-3 shrink-0 text-blue-600"})),$=r?/* @__PURE__ */e.createElement(K,null,/* @__PURE__ */e.createElement("span",{className:"text-blue-600"},P)):/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center text-blue-600"},P),D=/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center"},/* @__PURE__ */e.createElement(u,{"aria-hidden":"true",className:"size-3"})),V=/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center"},/* @__PURE__ */e.createElement("span",{className:"sr-only"},"Unpublished Changes"),/* @__PURE__ */e.createElement(m,{"aria-hidden":"true",className:"size-3"})),F=/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center",role:"status","aria-label":`Loading nested articles for ${t.value.label}`},
7
+ /* @__PURE__ */e.createElement("span",{className:a("transition-opacity duration-200",m&&"opacity-0 sr-only")},t.label)),t.id===l&&c&&c.length>0&&!m&&/* @__PURE__ */e.createElement(P,{className:a("flex-shrink-0"),items:c,activeId:d}))))))}function K(){const{handleSearchArticles:t,searchValue:a,setSearchValue:r}=B(),[l,,s]=g(!1),o=e.useRef(null);return e.useEffect(()=>{l&&t?.(a)},[a,t,l]),/* @__PURE__ */e.createElement("div",{className:"mb-2"},/* @__PURE__ */e.createElement(b,{ref:o,className:"h-auto text-subtlest border-border-subtle",startIcon:i,endIcon:a?n:void 0,onEndIconClick:()=>{r(""),t?.("")},value:a,onChange:e=>{const a=e.target.value;l||s(!0),r(a),""===a.trim()&&(t(""),s(!1))},placeholder:"Find an article","aria-label":"Find an article",type:"search"}))}function V({children:t}){/* @__PURE__ */
8
+ return e.createElement(E,{slot:"chevron",className:"relative z-30 flex p-0"},/* @__PURE__ */e.createElement("span",{className:"relative inline-flex size-3 items-center justify-center"},t))}function D({item:t,hasChildItems:r,isSelected:n,isExpanded:i,ItemLinkComponent:p,onAddArticle:g,isAddingArticle:v,isLoadingChildren:b,onMoreActions:y,level:A}){const{isSearching:k}=B(),S=e.useContext(x),N=Boolean(n),I=!!(g&&!v||y),w="draft"===t.value.status;let z;switch(t.value.status){case"draft":z="(draft)";break;case"unpublished":z="(unpublished changes)";break;default:z=""}const L=/* @__PURE__ */e.createElement(V,null,/* @__PURE__ */e.createElement(l,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-0":"opacity-100")}),/* @__PURE__ */e.createElement(s,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-100":"opacity-0")})),j=/* @__PURE__ */e.createElement(V,null,/* @__PURE__ */e.createElement(o,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-0":"opacity-100")}),/* @__PURE__ */e.createElement(s,{"aria-hidden":"true",weight:"fill",className:a("absolute size-3 transition-opacity duration-200 ease-out",i?"opacity-100":"opacity-0")})),P=/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement("span",{className:"sr-only"},"Knowledge Discovery"),/* @__PURE__ */e.createElement(f,{"aria-hidden":"true",weight:"fill",className:"size-3 shrink-0 text-blue-600"})),$=r?/* @__PURE__ */e.createElement(V,null,/* @__PURE__ */e.createElement("span",{className:"text-blue-600"},P)):/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center text-blue-600"},P),K=/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center"},/* @__PURE__ */e.createElement(u,{"aria-hidden":"true",className:"size-3"})),D=/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center"},/* @__PURE__ */e.createElement("span",{className:"sr-only"},"Unpublished Changes"),/* @__PURE__ */e.createElement(m,{"aria-hidden":"true",className:"size-3"})),F=/* @__PURE__ */e.createElement("span",{className:"flex size-3 shrink-0 items-center justify-center",role:"status","aria-label":`Loading nested articles for ${t.value.label}`},
9
9
  /* @__PURE__ */e.createElement(M,{"aria-hidden":"true",className:"size-3 text-current"}),
10
10
  /* @__PURE__ */e.createElement("span",{className:"sr-only"},"Loading nested articles for ",t.value.label));/* @__PURE__ */
11
11
  return e.createElement("div",{style:{"--line-offset":"0.875rem"},"aria-busy":b||void 0,className:a("group relative flex items-center gap-1 rounded-md py-1 pl-1 ml-[calc((var(--tree-item-level)-1)*var(--line-offset))] pr-4 h-9",w&&"text-subtlest italic",n?"bg-lime-100 text-default font-bold after:absolute after:-right-0.5 after:top-1/2 after:h-1/2 after:w-1 after:-translate-y-1/2 after:bg-lime-400":"hover:bg-dark-200 hover:text-accent-foreground")},Array.from({length:A-1},(a,r)=>/* @__PURE__ */e.createElement("span",{key:`${t.value.label}-${r+1}`,style:{"--item-line-level":r+1},className:"absolute w-[1px] bg-dark-400 -top-2 h-9 left-[calc(-4px-var(--line-offset)*(var(--item-line-level)-1))]","aria-hidden":!0})),
12
- /* @__PURE__ */e.createElement(E,{slot:"drag",className:"sr-only"},"Drag ",t.value.label),k?null:b?F:((e,t)=>{if("discovery"===e)return $;const a="unpublished"===e||"draft"===e;return t?a?j:L:a?V:D})(t.value.status,r),
12
+ /* @__PURE__ */e.createElement(E,{slot:"drag",className:"sr-only"},"Drag ",t.value.label),k?null:b?F:((e,t)=>{if("discovery"===e)return $;const a="unpublished"===e||"draft"===e;return t?a?j:L:a?D:K})(t.value.status,r),
13
13
  /* @__PURE__ */e.createElement(p,{href:t.value.href,title:`${t.value.label} ${z}`,"data-sidebar-item-id":t.value.id,"data-sidebar-item-type":"article",className:a("min-w-0 text-inherit text-sm truncate flex-1 after:absolute after:inset-0 after:z-10 pr-1",n&&"text-default"),onClick:e=>{N&&(e.preventDefault(),e.stopPropagation()),r&&S&&S.toggleKey(t.key)}},t.value.label),I&&/* @__PURE__ */e.createElement(C,{orientation:"horizontal",className:a("absolute h-4 my-auto right-0.5 top-0 bottom-0 z-20 hidden items-center rounded-xl","group-hover:flex group-focus-within:flex",n?"bg-lime-100 text-default":"bg-dark-200")},y&&/* @__PURE__ */e.createElement(h,{variant:"ghost",size:"icon","aria-label":`More actions for ${t.value.label}`,className:"size-4 [&_svg]:size-3.5",onClick:e=>{e.stopPropagation(),y?.(t.value.id)}},
14
14
  /* @__PURE__ */e.createElement(c,{"aria-hidden":"true",weight:"bold"})),g&&!v&&/* @__PURE__ */e.createElement(h,{variant:"ghost",size:"icon","aria-label":`Add article to ${t.value.label}`,className:"size-4 [&_svg]:size-3.5",onClick:e=>{e.stopPropagation(),g?.(t.value.id)}},
15
15
  /* @__PURE__ */e.createElement(d,{"aria-hidden":"true"}))))}function F({articles:t}){const{ItemLinkComponent:r,activeArticleId:n,handleSearchArticles:i,setSearchValue:l,setLastSelectedArticleId:s,onSelectArticle:o}=B(),c=e.useCallback(e=>{s(e),l(""),i?.(""),o?.(e)},[i,o,s,l]);return 0===t.length?null:/* @__PURE__ */e.createElement("ul",{"aria-label":"Search results",className:"flex flex-col list-none"},t.map(t=>{const i=t.id===n;/* @__PURE__ */
16
- return e.createElement("li",{key:t.id},/* @__PURE__ */e.createElement(r,{href:t.href,title:t.label,"data-sidebar-item-id":t.id,"data-sidebar-item-type":"article",onClick:()=>c(t.id),className:a("relative flex h-9 items-center rounded-md px-1 text-sm truncate",i?"bg-lime-100 font-bold text-primary-foreground after:absolute after:-right-0.5 after:top-1/2 after:h-1/2 after:w-1 after:-translate-y-1/2 after:bg-lime-400":"text-inherit hover:bg-dark-200 hover:text-accent-foreground")},t.label))}))}function _(e,t=null,a=0,r=[]){return e.forEach((e,n)=>{r.push({item:e,parentId:t,index:n,depth:a}),e.items?.length&&_(e.items,e.id,a+1,r)}),r}let R=0;function H(e,t,a=[]){for(const r of e){if(r.id===t)return a;if(r.items&&r.items.length>0){const e=H(r.items,t,[...a,r.id]);if(e)return e}}return null}function U(e){return e.map(e=>({...e.value,items:e.children?.length?U(e.children):e.value.items}))}function q({articles:t,isSearching:a,renderEmptyState:r}){const{ItemLinkComponent:n,activeArticleId:i,lastSelectedArticleId:l,setLastSelectedArticleId:s,onSelectArticle:o,onExpandArticle:c,canMoveArticle:d,onMoveArticle:m,onAddArticle:u,onMoreActions:f}=B(),p=i??l??void 0,h=y({initialItems:t,getKey:e=>e.id,getChildren:e=>e.items??[]}),g=e.useRef(t);e.useEffect(()=>{if(g.current===t)return;g.current=t;const e=function(e,t){const a=_(e),r=_(t),n=new Map(a.map(e=>[e.item.id,e])),i=new Map(r.map(e=>[e.item.id,e])),l=[];return a.filter(e=>!i.has(e.item.id)).sort((e,t)=>t.depth-e.depth).forEach(e=>{l.push({type:"remove",id:e.item.id})}),r.forEach(e=>{const t=n.get(e.item.id);var a,r;t?(t.parentId===e.parentId&&t.index===e.index||l.push({type:"move",id:e.item.id,parentId:e.parentId,index:e.index}),a=t.item,r=e.item,(a.label!==r.label||a.href!==r.href||a.status!==r.status||a.hasChildren!==r.hasChildren||a.isLoadingChildren!==r.isLoadingChildren)&&l.push({type:"update",id:e.item.id,item:e.item})):l.push({type:"insert",parentId:e.parentId,index:e.index,item:e.item})}),l}(U(h.items),t);0!==e.length&&e.forEach(e=>{switch(e.type){case"remove":h.remove(e.id);break;case"insert":h.insert(e.parentId,e.index,e.item);break;case"move":h.move(e.id,e.parentId,e.index);break;case"update":h.update(e.id,e.item)}})},[t,h]);const{dragAndDropHooks:v}=A({getItems:(e,t)=>t.map(e=>({"text/plain":e.value.label})),onMove:e=>{if(a)return;const t=Array.from(e.keys)[0];if(!t)return;const r=h.getItem(e.target.key);if(!r)return;let n,i;if("on"===e.target.dropPosition)n=e.target.key.toString(),i=r.children?.length??0;else{n=r.parentKey?.toString()??null;const t=(n?h.getItem(n)?.children??[]:h.items).findIndex(t=>t.key===e.target.key);i="before"===e.target.dropPosition?t:t+1}const l={id:t.toString(),parentId:n,index:i};if(d&&!d(l))return;const s=h.getItem(t),o=s?.parentKey?.toString()??null,c=(o?h.getItem(o)?.children??[]:h.items).findIndex(e=>e.key===t);"on"===e.target.dropPosition?h.move(t,n,i):"before"===e.target.dropPosition?h.moveBefore(e.target.key,e.keys):h.moveAfter(e.target.key,e.keys);const u=m?.(l);u&&"function"==typeof u.then&&u.catch(()=>{h.move(t,o,c)})},renderDropIndicator:t=>/* @__PURE__ */e.createElement(k,{target:t,className:"outline outline-1 outline-lime-200 ml-[calc(var(--tree-item-level)*0.5rem)]"})}),[b,x]=e.useState(/* @__PURE__ */new Set),E=e.useMemo(()=>null!=p?/* @__PURE__ */new Set([p]):b,[p,b]),C=e.useMemo(()=>{if(!p||a||!t.length)return[];return H(t,p)??[]},[t,p,a]),[M,z]=e.useState(/* @__PURE__ */new Set),L=e.useMemo(()=>/* @__PURE__ */new Set([...C,...M]),[C,M]);e.useEffect(()=>{i&&s(null)},[i,l,s]);const j=e.useRef(/* @__PURE__ */new Set),[P,$]=e.useState(/* @__PURE__ */new Set),D=e.useCallback(e=>{if(a||!u||j.current.has(e))return;j.current.add(e),$(new Set(j.current));const t="__placeholder_"+ ++R,r={id:t,label:"Untitled",href:"",status:"draft"};h.append(e,r),z(t=>/* @__PURE__ */new Set([...t,e])),u(e).then(a=>{h.remove(t),h.append(e,a),x(/* @__PURE__ */new Set([a.id])),o?.(a.id),j.current.delete(e),$(new Set(j.current))},()=>{h.remove(t),j.current.delete(e),$(new Set(j.current))})},[a,u,h,o]),K=e.useCallback(e=>{o?.(e),null==i&&x(/* @__PURE__ */new Set([e]))},[i,o]);return a?/* @__PURE__ */e.createElement(F,{articles:t}):/* @__PURE__ */e.createElement(S,{"aria-label":a?"Search results":"Articles tree",items:h.items,renderEmptyState:r,dragAndDropHooks:a?void 0:v,className:"flex flex-col",selectionBehavior:"toggle",selectionMode:"single",expandedKeys:L,onExpandedChange:e=>{(function(e,t){const a=new Set(Array.from(e,e=>e.toString()));return Array.from(t,e=>e.toString()).filter(e=>!a.has(e))})(L,e).forEach(e=>{c?.(e)}),z(e)},selectedKeys:E,disallowEmptySelection:!0,onSelectionChange:e=>{if("all"!==e){null==p&&x(e);const t=Array.from(e)?.[0];t&&K(t.toString())}}},function t(r){/* @__PURE__ */
16
+ return e.createElement("li",{key:t.id},/* @__PURE__ */e.createElement(r,{href:t.href,title:t.label,"data-sidebar-item-id":t.id,"data-sidebar-item-type":"article",onClick:()=>c(t.id),className:a("relative flex h-9 items-center rounded-md px-1 text-sm truncate",i?"bg-lime-100 font-bold text-primary-foreground after:absolute after:-right-0.5 after:top-1/2 after:h-1/2 after:w-1 after:-translate-y-1/2 after:bg-lime-400":"text-inherit hover:bg-dark-200 hover:text-accent-foreground")},t.label))}))}function _(e,t=null,a=0,r=[]){return e.forEach((e,n)=>{r.push({item:e,parentId:t,index:n,depth:a}),e.items?.length&&_(e.items,e.id,a+1,r)}),r}let R=0;function H(e,t,a=[]){for(const r of e){if(r.id===t)return a;if(r.items&&r.items.length>0){const e=H(r.items,t,[...a,r.id]);if(e)return e}}return null}function U(e){return e.map(e=>({...e.value,items:e.children?.length?U(e.children):e.value.items}))}function q({articles:t,isSearching:a,renderEmptyState:r}){const{ItemLinkComponent:n,activeArticleId:i,lastSelectedArticleId:l,setLastSelectedArticleId:s,onSelectArticle:o,onExpandArticle:c,canMoveArticle:d,onMoveArticle:m,onAddArticle:u,onMoreActions:f}=B(),p=i??l??void 0,h=y({initialItems:t,getKey:e=>e.id,getChildren:e=>e.items??[]}),g=e.useRef(t);e.useEffect(()=>{if(g.current===t)return;g.current=t;const e=function(e,t){const a=_(e),r=_(t),n=new Map(a.map(e=>[e.item.id,e])),i=new Map(r.map(e=>[e.item.id,e])),l=[];return a.filter(e=>!i.has(e.item.id)).sort((e,t)=>t.depth-e.depth).forEach(e=>{l.push({type:"remove",id:e.item.id})}),r.forEach(e=>{const t=n.get(e.item.id);var a,r;t?(t.parentId===e.parentId&&t.index===e.index||l.push({type:"move",id:e.item.id,parentId:e.parentId,index:e.index}),a=t.item,r=e.item,(a.label!==r.label||a.href!==r.href||a.status!==r.status||a.hasChildren!==r.hasChildren||a.isLoadingChildren!==r.isLoadingChildren)&&l.push({type:"update",id:e.item.id,item:e.item})):l.push({type:"insert",parentId:e.parentId,index:e.index,item:e.item})}),l}(U(h.items),t);0!==e.length&&e.forEach(e=>{switch(e.type){case"remove":h.remove(e.id);break;case"insert":h.insert(e.parentId,e.index,e.item);break;case"move":h.move(e.id,e.parentId,e.index);break;case"update":h.update(e.id,e.item)}})},[t,h]);const{dragAndDropHooks:v}=A({getItems:(e,t)=>t.map(e=>({"text/plain":e.value.label})),onMove:e=>{if(a)return;const t=Array.from(e.keys)[0];if(!t)return;const r=h.getItem(e.target.key);if(!r)return;let n,i;if("on"===e.target.dropPosition)n=e.target.key.toString(),i=r.children?.length??0;else{n=r.parentKey?.toString()??null;const t=(n?h.getItem(n)?.children??[]:h.items).findIndex(t=>t.key===e.target.key);i="before"===e.target.dropPosition?t:t+1}const l={id:t.toString(),parentId:n,index:i};if(d&&!d(l))return;const s=h.getItem(t),o=s?.parentKey?.toString()??null,c=(o?h.getItem(o)?.children??[]:h.items).findIndex(e=>e.key===t);"on"===e.target.dropPosition?h.move(t,n,i):"before"===e.target.dropPosition?h.moveBefore(e.target.key,e.keys):h.moveAfter(e.target.key,e.keys);const u=m?.(l);u&&"function"==typeof u.then&&u.catch(()=>{h.move(t,o,c)})},renderDropIndicator:t=>/* @__PURE__ */e.createElement(k,{target:t,className:"outline outline-1 outline-lime-200 ml-[calc(var(--tree-item-level)*0.5rem)]"})}),[b,x]=e.useState(/* @__PURE__ */new Set),E=e.useMemo(()=>null!=p?/* @__PURE__ */new Set([p]):b,[p,b]),C=e.useMemo(()=>{if(!p||a||!t.length)return[];return H(t,p)??[]},[t,p,a]),[M,z]=e.useState(/* @__PURE__ */new Set),L=e.useMemo(()=>/* @__PURE__ */new Set([...C,...M]),[C,M]);e.useEffect(()=>{i&&s(null)},[i,l,s]);const j=e.useRef(/* @__PURE__ */new Set),[P,$]=e.useState(/* @__PURE__ */new Set),K=e.useCallback(e=>{if(a||!u||j.current.has(e))return;j.current.add(e),$(new Set(j.current));const t="__placeholder_"+ ++R,r={id:t,label:"Untitled",href:"",status:"draft"};h.append(e,r),z(t=>/* @__PURE__ */new Set([...t,e])),u(e).then(a=>{h.remove(t),h.append(e,a),x(/* @__PURE__ */new Set([a.id])),o?.(a.id),j.current.delete(e),$(new Set(j.current))},()=>{h.remove(t),j.current.delete(e),$(new Set(j.current))})},[a,u,h,o]),V=e.useCallback(e=>{o?.(e),null==i&&x(/* @__PURE__ */new Set([e]))},[i,o]);return a?/* @__PURE__ */e.createElement(F,{articles:t}):/* @__PURE__ */e.createElement(S,{"aria-label":a?"Search results":"Articles tree",items:h.items,renderEmptyState:r,dragAndDropHooks:a?void 0:v,className:"flex flex-col",selectionBehavior:"toggle",selectionMode:"single",expandedKeys:L,onExpandedChange:e=>{(function(e,t){const a=new Set(Array.from(e,e=>e.toString()));return Array.from(t,e=>e.toString()).filter(e=>!a.has(e))})(L,e).forEach(e=>{c?.(e)}),z(e)},selectedKeys:E,disallowEmptySelection:!0,onSelectionChange:e=>{if("all"!==e){null==p&&x(e);const t=Array.from(e)?.[0];t&&V(t.toString())}}},function t(r){/* @__PURE__ */
17
17
  return e.createElement(N,{className:"list-none",textValue:r.value.label,id:r.value.id,hasChildItems:r.value.hasChildren},
18
- /* @__PURE__ */e.createElement(I,null,t=>/* @__PURE__ */e.createElement(V,{ItemLinkComponent:n,item:r,onAddArticle:!a&&u?D:void 0,isAddingArticle:!a&&P.has(r.value.id),isLoadingChildren:!a&&r.value.isLoadingChildren,onMoreActions:f?e=>f(e):void 0,...t})),!a&&r.children&&/* @__PURE__ */e.createElement(w,{items:r.children},t))})}const G={leading:!0,trailing:!0};function J({articles:t,className:r,isLoadingArticles:n}){const{isSearching:i,searchValue:l,onAddArticle:s}=B(),{contains:o}=z(),c=l.trim(),[d]=v(i?c:"",i?400:0,i?G:void 0),m=!i&&(n??void 0===t),u=e.useCallback(()=>/* @__PURE__ */e.createElement("div",{className:"flex min-h-20 items-center justify-center text-muted-foreground",role:"status","aria-live":"polite","aria-label":"Loading articles list"},
18
+ /* @__PURE__ */e.createElement(I,null,t=>/* @__PURE__ */e.createElement(D,{ItemLinkComponent:n,item:r,onAddArticle:!a&&u?K:void 0,isAddingArticle:!a&&P.has(r.value.id),isLoadingChildren:!a&&r.value.isLoadingChildren,onMoreActions:f?e=>f(e):void 0,...t})),!a&&r.children&&/* @__PURE__ */e.createElement(w,{items:r.children},t))})}const G={leading:!0,trailing:!0};function J({articles:t,className:r,isLoadingArticles:n}){const{isSearching:i,searchValue:l,onAddArticle:s}=B(),{contains:o}=z(),c=l.trim(),[d]=v(i?c:"",i?400:0,i?G:void 0),m=!i&&(n??void 0===t),u=e.useCallback(()=>/* @__PURE__ */e.createElement("div",{className:"flex min-h-20 items-center justify-center text-muted-foreground",role:"status","aria-live":"polite","aria-label":"Loading articles list"},
19
19
  /* @__PURE__ */e.createElement(M,{className:"size-5","aria-hidden":"true"}),
20
20
  /* @__PURE__ */e.createElement("span",{className:"sr-only"},"Loading articles list")),[]),f=!(m||i||t&&0!==t.length),g=e.useMemo(()=>{if(i){if(""===c||""===d)return[];const e=[],a=d,r=t=>{for(const n of t)o(n.label,a)&&e.push({...n,hasChildren:!1,items:[]}),n.items?.length&&r(n.items)};return r(t??[]),e}return t&&t.length>0?t:[]},[t,i,c,d,o]);/* @__PURE__ */
21
- return e.createElement("div",{className:a("flex flex-col gap-0.5 px-4",r)},f&&/* @__PURE__ */e.createElement(h,{variant:"ghost",className:"text-subtlest",onClick:()=>s?.(null).catch(()=>{})},/* @__PURE__ */e.createElement(p,{"aria-hidden":"true"}),"Create first article or folder"),m?/* @__PURE__ */e.createElement(q,{isSearching:i,articles:[],renderEmptyState:u}):/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement(D,null),/* @__PURE__ */e.createElement("nav",{"aria-label":"Articles navigation"},/* @__PURE__ */e.createElement(q,{key:i?""===c?"search:empty":`search:${d}`:"browse",isSearching:i,articles:g??[]}))))}const O=e.forwardRef(function({className:r,ItemLinkComponent:n,collapsed:i,showAppBack:l,onAppBack:s,appNavItems:o,appNavActiveId:c,isLoadingArticles:d,sectionNavItems:m,sectionNavActiveId:u,activeArticleId:f,showArticles:p,articles:h,onSelectArticle:g,onExpandArticle:v,onSearchArticles:b,onAddArticle:x,onMoreActions:E,canMoveArticle:y,onMoveArticle:A,...k},S){/* @__PURE__ */
21
+ return e.createElement("div",{className:a("flex flex-col gap-0.5 px-4",r)},f&&/* @__PURE__ */e.createElement(h,{variant:"ghost",className:"text-subtlest",onClick:()=>s?.(null).catch(()=>{})},/* @__PURE__ */e.createElement(p,{"aria-hidden":"true"}),"Create first article or folder"),m?/* @__PURE__ */e.createElement(q,{isSearching:i,articles:[],renderEmptyState:u}):/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement(K,null),/* @__PURE__ */e.createElement("nav",{"aria-label":"Articles navigation"},/* @__PURE__ */e.createElement(q,{key:i?""===c?"search:empty":`search:${d}`:"browse",isSearching:i,articles:g??[]}))))}const O=e.forwardRef(function({className:r,ItemLinkComponent:n,collapsed:i,showAppBack:l,onAppBack:s,appNavItems:o,appNavActiveId:c,isLoadingArticles:d,sectionNavItems:m,sectionNavActiveId:u,activeArticleId:f,showArticles:p,articles:h,onSelectArticle:g,onExpandArticle:v,onSearchArticles:b,onAddArticle:x,onMoreActions:E,canMoveArticle:y,onMoveArticle:A,...k},S){/* @__PURE__ */
22
22
  return e.createElement(j,{collapsed:!!i,ItemLinkComponent:n,activeArticleId:f,onSelectArticle:g,onExpandArticle:v,onSearchArticles:b,onAddArticle:x,onMoreActions:E,canMoveArticle:y,onMoveArticle:A},
23
23
  /* @__PURE__ */e.createElement("aside",{ref:S,...k,className:a("py-4 transition-width duration-200 ease-in-out flex flex-col h-dvh",i?"w-[64px]":"w-[260px]",r),"aria-label":"Application navigation"},
24
24
  /* @__PURE__ */e.createElement($,{className:a("flex-shrink-0",o&&o.length>0&&"pb-4",!i&&"border-b border-border-subtle"),showBack:l,items:o,activeId:c,onBack:s,sectionNavItems:m,sectionNavActiveId:u}),!i&&/* @__PURE__ */e.createElement(e.Fragment,null,p&&/* @__PURE__ */e.createElement(t,null,/* @__PURE__ */e.createElement(J,{className:"py-4 max-w-[var(--left-nav-width,inherit)]",articles:h,isLoadingArticles:d})))))});export{O as S,B as u};
25
- //# sourceMappingURL=sidebar.CcFsNjrN.js.map
25
+ //# sourceMappingURL=sidebar.BhcrMAU3.js.map