@mastra/playground-ui 40.0.0-alpha.3 → 40.0.0-alpha.4

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 (69) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/components/CodeBlock.cjs.js +1 -1
  3. package/dist/components/CodeBlock.es.js +1 -1
  4. package/dist/components/MessageScroller.cjs.js +538 -0
  5. package/dist/components/MessageScroller.cjs.js.map +1 -0
  6. package/dist/components/MessageScroller.d.ts +2 -0
  7. package/dist/components/MessageScroller.es.js +505 -0
  8. package/dist/components/MessageScroller.es.js.map +1 -0
  9. package/dist/components/Tabs.cjs.js +1 -1
  10. package/dist/components/Tabs.es.js +1 -1
  11. package/dist/components/ThreadRail.cjs.js +432 -0
  12. package/dist/components/ThreadRail.cjs.js.map +1 -0
  13. package/dist/components/ThreadRail.d.ts +2 -0
  14. package/dist/components/ThreadRail.es.js +407 -0
  15. package/dist/components/ThreadRail.es.js.map +1 -0
  16. package/dist/components/Tree.cjs.js +2 -2
  17. package/dist/components/Tree.cjs.js.map +1 -1
  18. package/dist/components/Tree.es.js +1 -1
  19. package/dist/components/Tree.es.js.map +1 -1
  20. package/dist/domains/metrics/components/latency-card-view.cjs.js +64 -42
  21. package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
  22. package/dist/domains/metrics/components/latency-card-view.es.js +65 -43
  23. package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
  24. package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
  25. package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
  26. package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
  27. package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
  28. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
  29. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
  30. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +1 -1
  31. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +1 -1
  32. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
  33. package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
  34. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  35. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  36. package/dist/ee/signals/components/signal-details-page.cjs.js +1 -1
  37. package/dist/ee/signals/components/signal-details-page.es.js +1 -1
  38. package/dist/hooks/use-isomorphic-layout-effect.cjs.js +29 -0
  39. package/dist/hooks/use-isomorphic-layout-effect.cjs.js.map +1 -0
  40. package/dist/hooks/use-isomorphic-layout-effect.d.ts +2 -0
  41. package/dist/hooks/use-isomorphic-layout-effect.es.js +6 -0
  42. package/dist/hooks/use-isomorphic-layout-effect.es.js.map +1 -0
  43. package/dist/hooks/use-measured-auto-height.cjs.js +75 -0
  44. package/dist/hooks/use-measured-auto-height.cjs.js.map +1 -0
  45. package/dist/hooks/use-measured-auto-height.d.ts +2 -0
  46. package/dist/hooks/use-measured-auto-height.es.js +52 -0
  47. package/dist/hooks/use-measured-auto-height.es.js.map +1 -0
  48. package/dist/message-scroller-hooks-CdsHnth6.js +62 -0
  49. package/dist/message-scroller-hooks-CdsHnth6.js.map +1 -0
  50. package/dist/message-scroller-hooks-DdXqrmC2.cjs +98 -0
  51. package/dist/message-scroller-hooks-DdXqrmC2.cjs.map +1 -0
  52. package/dist/src/ds/components/MessageScroller/index.d.ts +2 -0
  53. package/dist/src/ds/components/MessageScroller/message-scroller-context.d.ts +38 -0
  54. package/dist/src/ds/components/MessageScroller/message-scroller-hooks.d.ts +26 -0
  55. package/dist/src/ds/components/MessageScroller/message-scroller.d.ts +44 -0
  56. package/dist/src/ds/components/Tabs/tabs-tab.d.ts +2 -1
  57. package/dist/src/ds/components/ThreadRail/index.d.ts +2 -0
  58. package/dist/src/ds/components/ThreadRail/thread-rail-turns.d.ts +11 -0
  59. package/dist/src/ds/components/ThreadRail/thread-rail.d.ts +12 -0
  60. package/dist/src/hooks/use-isomorphic-layout-effect.d.ts +2 -0
  61. package/dist/src/hooks/use-measured-auto-height.d.ts +8 -0
  62. package/dist/style.css +249 -5
  63. package/dist/{tabs-tab-CaZnZdY8.js → tabs-tab-1KGOybMG.js} +27 -17
  64. package/dist/tabs-tab-1KGOybMG.js.map +1 -0
  65. package/dist/{tabs-tab-BeUPTvaP.cjs → tabs-tab-DkeS2Iv0.cjs} +27 -17
  66. package/dist/tabs-tab-DkeS2Iv0.cjs.map +1 -0
  67. package/package.json +7 -7
  68. package/dist/tabs-tab-BeUPTvaP.cjs.map +0 -1
  69. package/dist/tabs-tab-CaZnZdY8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.cjs.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:outline-hidden focus-visible:bg-surface4 focus-visible:text-neutral6',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 min-w-0 w-full items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:outline-hidden focus-visible:ring-0\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-3 shrink-0 text-neutral3\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:outline-hidden focus-within:bg-surface4 focus-within:text-neutral6',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"min-w-0 flex-1 border-none bg-transparent text-xs text-neutral5 outline-hidden placeholder:text-neutral3\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":["React","jsx","cn","transitions","Collapsible","CollapsibleContent","jsxs","CollapsibleTrigger","ChevronRight","Folder","File"],"mappings":"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"}
1
+ {"version":3,"file":"Tree.cjs.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:outline-hidden focus-visible:bg-surface4 focus-visible:text-neutral6',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 min-w-0 w-full items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:outline-hidden focus-visible:ring-0\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-3 shrink-0 text-neutral3\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:outline-hidden focus-within:bg-surface4 focus-within:text-neutral6',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"min-w-0 flex-1 border-none bg-transparent text-xs text-neutral5 outline-hidden placeholder:text-neutral3\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":["React","jsx","cn","transitions","Collapsible","CollapsibleContent","jsxs","CollapsibleTrigger","ChevronRight","Folder","File","useIsomorphicLayoutEffect"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { transitions } from '../primitives/transitions.es.js';
4
4
  import { c as cn } from '../cn-BakJzhuv.js';
5
5
  import { C as Collapsible, a as CollapsibleContent, b as CollapsibleTrigger } from '../collapsible-CwP9t1xW.js';
6
6
  import { ChevronRight, Folder, File } from 'lucide-react';
7
+ import { useIsomorphicLayoutEffect } from '../hooks/use-isomorphic-layout-effect.es.js';
7
8
 
8
9
  const TreeContext = React.createContext(null);
9
10
  function TreeProvider({ children, value }) {
@@ -269,7 +270,6 @@ TreeLabel.displayName = "Tree.Label";
269
270
 
270
271
  const TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind="folder"], [data-tree-item-kind="file"]';
271
272
  const TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger="true"]';
272
- const useIsomorphicLayoutEffect = typeof window === "undefined" ? React.useEffect : React.useLayoutEffect;
273
273
  function assignRef(ref, value) {
274
274
  if (typeof ref === "function") {
275
275
  ref(value);
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.es.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:outline-hidden focus-visible:bg-surface4 focus-visible:text-neutral6',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 min-w-0 w-full items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:outline-hidden focus-visible:ring-0\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-3 shrink-0 text-neutral3\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:outline-hidden focus-within:bg-surface4 focus-within:text-neutral6',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"min-w-0 flex-1 border-none bg-transparent text-xs text-neutral5 outline-hidden placeholder:text-neutral3\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Tree.es.js","sources":["../../src/ds/components/Tree/tree-context.tsx","../../src/ds/components/Tree/tree-file.tsx","../../src/ds/components/Tree/tree-folder.tsx","../../src/ds/components/Tree/tree-folder-content.tsx","../../src/ds/components/Tree/tree-folder-trigger.tsx","../../src/ds/components/Tree/tree-icon.tsx","../../src/ds/components/Tree/tree-input.tsx","../../src/ds/components/Tree/tree-label.tsx","../../src/ds/components/Tree/tree-root.tsx","../../src/ds/components/Tree/tree.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-surface4 focus-visible:outline-hidden focus-visible:bg-surface4 focus-visible:text-neutral6',\n isSelected && 'bg-surface4 text-neutral6',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused }), [isFocused]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 min-w-0 w-full items-center rounded-sm hover:bg-surface4',\n transitions.colors,\n folderCtx?.isFocused && 'bg-surface4 text-neutral6',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:outline-hidden focus-visible:ring-0\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-3 shrink-0 text-neutral3\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:outline-hidden focus-within:bg-surface4 focus-within:text-neutral6',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-neutral3\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n className=\"min-w-0 flex-1 border-none bg-transparent text-xs text-neutral5 outline-hidden placeholder:text-neutral3\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-neutral5', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-xs', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"names":[],"mappings":";;;;;;;;AAQA,MAAM,WAAA,GAAc,KAAA,CAAM,aAAA,CAAuC,IAAI,CAAA;AAE9D,SAAS,YAAA,CAAa,EAAE,QAAA,EAAU,KAAA,EAAM,EAA2D;AACxG,EAAA,uBAAO,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAEO,SAAS,cAAA,GAA0C;AACxD,EAAA,OAAO,KAAA,CAAM,WAAW,WAAW,CAAA;AACrC;AAMA,MAAM,iBAAA,GAAoB,KAAA,CAAM,aAAA,CAA6C,IAAI,CAAA;AAE1E,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,KAAA,EAAM,EAAiE;AACpH,EAAA,uBAAO,GAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OAAe,QAAA,EAAS,CAAA;AAC7D;AAEO,SAAS,oBAAA,GAAsD;AACpE,EAAA,OAAO,KAAA,CAAM,WAAW,iBAAiB,CAAA;AAC3C;AAEA,MAAM,gBAAA,GAAmB,KAAA,CAAM,aAAA,CAAsB,CAAC,CAAA;AAE/C,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAU,KAAA,EAAM,EAAiD;AACnG,EAAA,2BAAQ,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,OAAQ,QAAA,EAAS,CAAA;AAC5D;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,KAAA,CAAM,WAAW,gBAAgB,CAAA;AAC1C;;AC7BO,MAAM,QAAA,GAAW,MAAM,UAAA,CAAyC,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,QAAA,EAAS,EAAG,GAAA,KAAQ;AAC3G,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,EAAA,MAAM,UAAA,GAAa,EAAA,IAAM,IAAA,IAAQ,OAAA,EAAS,UAAA,KAAe,EAAA;AAEzD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuC;AAC1D,IAAA,OAAA,EAAS,SAAA,GAAY,EAAE,aAAa,CAAA;AACpC,IAAA,IAAI,EAAA,IAAM,IAAA,IAAQ,OAAA,EAAS,QAAA,EAAU;AACnC,MAAA,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuC;AAC1D,IAAA,OAAA,EAAS,YAAY,CAAA,CAAE,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,IAAA,IAAA,CAAK,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,KAAQ,EAAA,IAAM,IAAA,IAAQ,OAAA,EAAS,QAAA,EAAU;AAC3E,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,UAAA;AAAA,MACL,cAAY,KAAA,GAAQ,CAAA;AAAA,MACpB,iBAAe,UAAA,IAAc,MAAA;AAAA,MAC7B,qBAAA,EAAoB,MAAA;AAAA,MACpB,mBAAA,EAAmB,EAAA;AAAA,MACnB,QAAA,EAAU,EAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,4EAAA;AAAA,QACA,WAAA,CAAY,MAAA;AAAA,QACZ,qHAAA;AAAA,QACA,UAAA,IAAc,2BAAA;AAAA,QACd;AAAA,OACF;AAAA,MAEA,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,GAAQ,KAAK,EAAA,EAAG;AAAA,MACtC,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ,CAAC,CAAA;AACD,QAAA,CAAS,WAAA,GAAc,WAAA;;AC9ChB,MAAM,aAAa,KAAA,CAAM,UAAA;AAAA,EAC9B,CAAC,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,YAAA,EAAc,SAAA,EAAW,QAAA,EAAS,EAAG,GAAA,KAAQ;AACrE,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAI,KAAA,CAAM,QAAA,CAAS,eAAe,KAAK,CAAA;AAC3E,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,KAAA,CAAM,SAAS,KAAK,CAAA;AACtD,IAAA,MAAM,SAAS,IAAA,IAAQ,YAAA;AAEvB,IAAA,MAAM,mBAAmB,KAAA,CAAM,WAAA;AAAA,MAC7B,CAAC,QAAA,KAAsB;AACrB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,YAAA,GAAe,QAAQ,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAAA,MACxB,CAAC,CAAA,KAAuC;AACtC,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe;AAChC,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAA,EAAS,YAAY,CAAA,CAAE,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,CAAY,MAAM;AACzC,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,kBAAA,GAAqB,MAAM,OAAA,CAAQ,OAAO,EAAE,SAAA,EAAU,CAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AAE3E,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,MAAA;AAAA,QACf,cAAY,KAAA,GAAQ,CAAA;AAAA,QACpB,qBAAA,EAAoB,QAAA;AAAA,QACpB,mBAAA,EAAmB,EAAA;AAAA,QACnB,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,8BAAA,EAAgC,SAAS,CAAA;AAAA,QACvD,OAAA,EAAS,WAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QAER,QAAA,kBAAA,GAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,kBAAA,EACzB,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,gBAAA,EACtC,QAAA,EACH,CAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AACA,UAAA,CAAW,WAAA,GAAc,aAAA;;AC7DlB,MAAM,oBAAoB,KAAA,CAAM,UAAA;AAAA,EACrC,CAAC,EAAE,SAAA,EAAW,QAAA,IAAY,GAAA,KAAQ;AAChC,IAAA,MAAM,QAAQ,YAAA,EAAa;AAE3B,IAAA,uBACE,GAAA,CAAC,sBAAmB,GAAA,EAAU,SAAA,EAAW,GAAG,SAAS,CAAA,EACnD,8BAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,QAAQ,CAAA,EAChC,QAAA,kBAAA,GAAA,CAAC,QAAG,IAAA,EAAK,OAAA,EAAQ,WAAU,eAAA,EACxB,QAAA,EACH,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,iBAAA,CAAkB,WAAA,GAAc,oBAAA;;ACZzB,MAAM,oBAAoB,KAAA,CAAM,UAAA;AAAA,EACrC,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,OAAA,IAAW,GAAA,KAAQ;AACzC,IAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,IAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,IAAA,MAAM,QAAQ,YAAA,EAAa;AAE3B,IAAA,MAAM,kBAAkB,KAAA,CAAM,WAAA;AAAA,MAC5B,CAAC,QAAqB,OAAA,KAAkC;AACtD,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAqB,gCAAgC,CAAA;AACzE,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAA,EAAS,SAAA,GAAY,MAAM,OAAO,CAAA;AAAA,QACpC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,sBAAA,EAAqB,MAAA;AAAA,QACrB,SAAA,EAAW,EAAA;AAAA,UACT,yEAAA;AAAA,UACA,WAAA,CAAY,MAAA;AAAA,UACZ,WAAW,SAAA,IAAa,2BAAA;AAAA,UACxB;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,0BAAA,EAAyB,MAAA;AAAA,cACzB,QAAA,EAAU,EAAA;AAAA,cACV,SAAA,EAAU,8IAAA;AAAA,cACV,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,GAAQ,EAAA,EAAG;AAAA,cACjC,aAAa,CAAA,CAAA,KAAK;AAChB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,eAAA,CAAgB,EAAE,aAAa,CAAA;AAAA,cACjC,CAAA;AAAA,cACA,SAAS,CAAA,CAAA,KAAK;AACZ,gBAAA,eAAA,CAAgB,CAAA,CAAE,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,cACnD,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,YAAA,EAAA,EAAa,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,gBAC1E;AAAA;AAAA;AAAA,WACH;AAAA,UACC,OAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,SAAS,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB,EAC7D,QAAA,EAAA,OAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF,CAAA;AACA,iBAAA,CAAkB,WAAA,GAAc,oBAAA;;ACzDzB,MAAM,WAAW,KAAA,CAAM,UAAA,CAA2C,CAAC,EAAE,SAAA,EAAW,UAAS,EAAG,GAAA,qBACjG,GAAA,CAAC,MAAA,EAAA,EAAK,KAAU,SAAA,EAAW,EAAA,CAAG,+CAA+C,SAAS,CAAA,EACnF,UACH,CACD,CAAA;AACD,QAAA,CAAS,WAAA,GAAc,WAAA;;ACGhB,MAAM,YAAY,KAAA,CAAM,UAAA;AAAA,EAC7B,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,YAAA,GAAe,EAAA,EAAI,WAAA,EAAa,SAAA,GAAY,IAAA,EAAM,SAAA,EAAU,EAAG,GAAA,KAAQ;AAClG,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAEvC,IAAA,MAAM,eAAe,KAAA,CAAM,WAAA;AAAA,MACzB,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,UAAA,QAAA,CAAS,OAAO,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,QAAA,IAAW;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MACA,CAAC,UAAU,QAAQ;AAAA,KACrB;AAEA,IAAA,MAAM,gBAAgB,KAAA,CAAM,WAAA;AAAA,MAC1B,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,YAAA,CAAa,CAAA,CAAE,cAAc,KAAK,CAAA;AAAA,QACpC,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,IAAW;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAc,QAAQ;AAAA,KACzB;AAEA,IAAA,MAAM,aAAa,KAAA,CAAM,WAAA;AAAA,MACvB,CAAC,CAAA,KAA0C;AACzC,QAAA,YAAA,CAAa,CAAA,CAAE,cAAc,KAAK,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,KAA0C;AAC/E,MAAA,CAAA,CAAE,cAAc,MAAA,EAAO;AAAA,IACzB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,QAAA,GAAW,MAAA,GAAS,IAAA;AAE1C,IAAA,uBACE,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,cAAY,KAAA,GAAQ,CAAA;AAAA,QACpB,qBAAA,EAAoB,OAAA;AAAA,QACpB,SAAA,EAAW,EAAA;AAAA,UACT,6DAAA;AAAA,UACA,WAAA,CAAY,MAAA;AAAA,UACZ,iFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,GAAQ,KAAK,EAAA,EAAG;AAAA,QAEtC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,6CAAA,EACd,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,CAAA,EAClC,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,YAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA;AAAA,cACA,SAAA,EAAW,aAAA;AAAA,cACX,MAAA,EAAQ,UAAA;AAAA,cACR,OAAA,EAAS,WAAA;AAAA,cACT,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AACA,SAAA,CAAU,WAAA,GAAc,YAAA;;ACtFjB,MAAM,YAAY,KAAA,CAAM,UAAA,CAA4C,CAAC,EAAE,SAAA,EAAW,UAAS,EAAG,GAAA,qBACnG,GAAA,CAAC,MAAA,EAAA,EAAK,KAAU,SAAA,EAAW,EAAA,CAAG,0BAA0B,SAAS,CAAA,EAC9D,UACH,CACD,CAAA;AACD,SAAA,CAAU,WAAA,GAAc,YAAA;;ACRxB,MAAM,4BAAA,GAA+B,8DAAA;AACrC,MAAM,4BAAA,GAA+B,mCAAA;AASrC,SAAS,SAAA,CAAa,KAA4B,KAAA,EAAiB;AACjE,EAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,IAAA,GAAA,CAAI,KAAK,CAAA;AAAA,EACX,WAAW,GAAA,EAAK;AACd,IAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAAA,EAChB;AACF;AAEA,SAAS,aAAa,IAAA,EAAkC;AACtD,EAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,4BAA4B,CAAC,CAAA,CAAE,MAAA;AAAA,IAClF,CAAA,IAAA,KAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,KAAM;AAAA,GACxC;AACF;AAEA,SAAS,WAAA,CAAY,OAAsB,aAAA,EAA4B;AACrE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,KAAS,aAAA,GAAgB,CAAA,GAAI,EAAA;AAAA,EAC/C;AACF;AAEA,SAAS,wBAAwB,IAAA,EAAmB;AAClD,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAM,GAAG,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAA8B,gBAAgB,CAAC,CAAC,CAAA;AAEzF,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA;AAAA,MACvC,CAAC,KAAA,KACC,KAAA,YAAiB,WAAA,IACjB,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,KAAM,UAAA,IAC/B,KAAA,CAAM,YAAA,CAAa,qBAAqB;AAAA,KAC5C;AAEA,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,IAAA,CAAK,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AACpD,MAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,gBAAA,CAAiB,OAAsB,UAAA,EAAoD;AAClG,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,OAAO,MAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,OAAA,CAAQ,UAAA,KAAe,UAAU,CAAA,IAAK,IAAA;AACvE;AAEA,SAAS,iBAAA,CAAkB,MAAmB,KAAA,EAA0C;AACtF,EAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,CAAc,aAAA;AACzC,EAAA,IAAI,EAAE,yBAAyB,WAAA,CAAA,IAAgB,CAAC,KAAK,QAAA,CAAS,aAAa,GAAG,OAAO,IAAA;AAErF,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAqB,4BAA4B,CAAA;AAClF,EAAA,OAAO,UAAA,IAAc,KAAA,CAAM,QAAA,CAAS,UAAU,IAAI,UAAA,GAAa,IAAA;AACjE;AAEA,SAAS,kBAAA,CAAmB,MAAmB,MAAA,EAAgD;AAC7F,EAAA,IAAI,EAAE,kBAAkB,WAAA,CAAA,IAAgB,CAAC,KAAK,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACvE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAqB,4BAA4B,CAAA;AACrE,EAAA,OAAO,IAAA,EAAM,YAAA,CAAa,MAAM,CAAA,KAAM,aAAa,IAAA,GAAO,IAAA;AAC5D;AAEA,SAAS,aAAA,CAAc,IAAA,EAAmB,IAAA,EAAmB,OAAA,GAA+B,EAAC,EAAG;AAC9F,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAE3B,EAAA,WAAA,CAAY,OAAO,IAAI,CAAA;AACvB,EAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,EAAO;AAC3B,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAmB,UAAA,EAAgC;AAC3E,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,uBAAA,CAAwB,IAAI,CAAA;AAE5B,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AACvD,EAAA,WAAA,CAAY,KAAA,EAAO,UAAA,IAAc,YAAA,IAAgB,SAAS,CAAA;AAC5D;AAEA,SAAS,iBAAiB,MAAA,EAAqC;AAC7D,EAAA,IAAI,EAAE,MAAA,YAAkB,WAAA,CAAA,EAAc,OAAO,KAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,iBAAA,KAAsB,MAAA,EAAQ,OAAO,KAAA;AACxD,EAAA,IAAI,MAAA,CAAO,mBAAmB,OAAO,IAAA;AAErC,EAAA,OAAO,CAAC,CAAC,MAAA,CAAO,OAAA,CAAQ,2DAA2D,CAAA;AACrF;AAEA,SAAS,iBAAiB,IAAA,EAA6C;AACrE,EAAA,OAAO,IAAA,CAAK,cAAiC,4BAA4B,CAAA;AAC3E;AAEA,SAAS,kBAAkB,IAAA,EAAuC;AAChE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,EAAe,OAAA,CAAQ,gBAAgB,CAAA;AAChE,EAAA,OAAO,WAAA,EAAa,OAAA,CAAqB,4BAA4B,CAAA,IAAK,IAAA;AAC5E;AAEA,SAAS,iBAAiB,IAAA,EAAmB;AAC3C,EAAA,MAAM,OAAA,GAAU,iBAAiB,IAAI,CAAA;AACrC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AACF;AAEO,MAAM,WAAW,KAAA,CAAM,UAAA;AAAA,EAC5B,CAAC,EAAE,UAAA,EAAY,UAAU,SAAA,EAAW,QAAA,IAAY,GAAA,KAAQ;AACtD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAgC,IAAI,CAAA;AAE1D,IAAA,MAAM,gBAAgB,KAAA,CAAM,WAAA;AAAA,MAC1B,CAAC,IAAA,KAAkC;AACjC,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,CAAC,GAAG;AAAA,KACN;AAEA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,CAAC,MAAmB,OAAA,KAAkC;AACxF,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,aAAA,CAAc,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,IACnC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,WAAA,CAAY,CAAC,KAAA,KAAiD;AACxF,MAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA,EAAG;AAE9D,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,MAAA,MAAM,WAAA,GACJ,kBAAA,CAAmB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,IACrC,iBAAA,CAAkB,IAAA,EAAM,KAAK,KAC7B,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,aAAa,CAAC,CAAA;AACxC,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAC9C,MAAA,IAAI,eAAe,CAAA,EAAG;AAEtB,MAAA,IAAI,QAAA,GAA+B,IAAA;AACnC,MAAA,IAAI,OAAA,GAAU,IAAA;AAEd,MAAA,QAAQ,MAAM,GAAA;AAAK,QACjB,KAAK,WAAA;AACH,UAAA,QAAA,GAAW,KAAA,CAAM,KAAK,GAAA,CAAI,YAAA,GAAe,GAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,IAAA;AAClE,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,IAAA;AACnD,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AACvB,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AACtC,UAAA;AAAA,QACF,KAAK,YAAA,EAAc;AACjB,UAAA,MAAM,OAAA,GAAU,iBAAiB,WAAW,CAAA;AAC5C,UAAA,IAAI,OAAA,IAAW,WAAA,CAAY,YAAA,CAAa,eAAe,MAAM,MAAA,EAAQ;AACnE,YAAA,OAAA,CAAQ,KAAA,EAAM;AACd,YAAA,QAAA,GAAW,WAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,KAAA,CAAM,KAAK,GAAA,CAAI,YAAA,GAAe,GAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,IAAA;AAAA,UACpE;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,MAAM,OAAA,GAAU,iBAAiB,WAAW,CAAA;AAC5C,UAAA,IAAI,OAAA,IAAW,WAAA,CAAY,YAAA,CAAa,eAAe,MAAM,MAAA,EAAQ;AACnE,YAAA,OAAA,CAAQ,KAAA,EAAM;AACd,YAAA,QAAA,GAAW,WAAA;AAAA,UACb,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,kBAAkB,WAAW,CAAA;AAAA,UAC1C;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA;AAAA,QACL,KAAK,GAAA;AAAA,QACL,KAAK,UAAA;AACH,UAAA,gBAAA,CAAiB,WAAW,CAAA;AAC5B,UAAA,QAAA,GAAW,WAAA;AACX,UAAA;AAAA,QACF;AACE,UAAA,OAAA,GAAU,KAAA;AAAA;AAGd,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAEtB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,aAAA,CAAc,MAAM,QAAQ,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,yBAAA,CAA0B,MAAM;AAC9B,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,gBAAA,CAAiB,MAAM,UAAU,CAAA;AAAA,IACnC,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,IAAA,KAAA,CAAM,UAAU,MAAM;AACpB,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,gBAAA,KAAqB,WAAA,EAAa;AAEtD,MAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,QAAA,gBAAA,CAAiB,MAAM,UAAU,CAAA;AAAA,MACnC,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAEzD,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,UAAA,EAAW;AAAA,MACtB,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,UAAA,EAAY,QAAA,EAAU,SAAA,EAAU,CAAA,EAAI,CAAC,UAAA,EAAY,QAAA,EAAU,SAAS,CAAC,CAAA;AAEjH,IAAA,2BACG,YAAA,EAAA,EAAa,KAAA,EAAO,cACnB,QAAA,kBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,OAAO,CAAA,EACxB,QAAA,kBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,aAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA;AAAA,QAChD,SAAA,EAAW,aAAA;AAAA,QAEV;AAAA;AAAA,OAEL,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,QAAA,CAAS,WAAA,GAAc,MAAA;;AC/OhB,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU;AAAA,EAC1C,MAAA,EAAQ,UAAA;AAAA,EACR,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAC;;;;"}
@@ -6,8 +6,8 @@ const jsxRuntime = require('react/jsx-runtime');
6
6
  const React = require('react');
7
7
  const metricsCard = require('../../../metrics-card-CriQ3I_h.cjs');
8
8
  const metricsLineChart = require('../../../metrics-line-chart-D1ZGVepo.cjs');
9
- const tabsTab = require('../../../tabs-tab-BeUPTvaP.cjs');
10
9
  const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
10
+ const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
11
11
  const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
12
12
 
13
13
  const latencySeries = [
@@ -30,6 +30,9 @@ const latencySeries = [
30
30
  })
31
31
  }
32
32
  ];
33
+ function isLatencyTab(value) {
34
+ return value === "agents" || value === "workflows" || value === "tools";
35
+ }
33
36
  function LatencyChart({ data, onPointClick }) {
34
37
  if (data.length === 0) {
35
38
  return /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.NoData, { message: "No latency data yet" });
@@ -47,19 +50,17 @@ function LatencyChart({ data, onPointClick }) {
47
50
  );
48
51
  }
49
52
  function LatencyCardView({ data, isLoading, isError, onPointClick, actions }) {
50
- const initialTab = !data ? "agents" : data.agentData.length > 0 ? "agents" : data.workflowData.length > 0 ? "workflows" : data.toolData.length > 0 ? "tools" : "agents";
51
- const [activeTab, setActiveTab] = React.useState(initialTab);
52
- React.useEffect(() => {
53
- if (!data) return;
54
- const tabHasData = {
55
- agents: data.agentData.length > 0,
56
- workflows: data.workflowData.length > 0,
57
- tools: data.toolData.length > 0
58
- };
59
- if (!tabHasData[activeTab] && tabHasData[initialTab]) {
60
- setActiveTab(initialTab);
61
- }
62
- }, [data, activeTab, initialTab]);
53
+ const agentsHasData = (data?.agentData.length ?? 0) > 0;
54
+ const workflowsHasData = (data?.workflowData.length ?? 0) > 0;
55
+ const toolsHasData = (data?.toolData.length ?? 0) > 0;
56
+ const tabHasData = {
57
+ agents: agentsHasData,
58
+ workflows: workflowsHasData,
59
+ tools: toolsHasData
60
+ };
61
+ const initialTab = agentsHasData ? "agents" : workflowsHasData ? "workflows" : toolsHasData ? "tools" : "agents";
62
+ const [selectedTab, setSelectedTab] = React.useState("agents");
63
+ const activeTab = tabHasData[selectedTab] ? selectedTab : initialTab;
63
64
  const renderedActions = typeof actions === "function" ? actions(activeTab) : actions;
64
65
  const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);
65
66
  const p50Values = data ? Object.values(data).filter(Array.isArray).flat().map((d) => d.p50).filter((v) => typeof v === "number") : [];
@@ -70,34 +71,55 @@ function LatencyCardView({ data, isLoading, isError, onPointClick, actions }) {
70
71
  hasData && /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Summary, { value: avgP50, label: "Avg p50" }),
71
72
  renderedActions ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Actions, { children: renderedActions }) : null
72
73
  ] }),
73
- isLoading ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Error, { message: "Failed to load latency data" }) : /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.NoData, { message: "No latency data yet" }) : /* @__PURE__ */ jsxRuntime.jsxs(tabsTab.Tabs, { value: activeTab, onValueChange: setActiveTab, defaultTab: initialTab, className: "overflow-visible", children: [
74
- /* @__PURE__ */ jsxRuntime.jsxs(tabsTab.TabList, { children: [
75
- /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "agents", children: "Agents" }),
76
- /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "workflows", children: "Workflows" }),
77
- /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "tools", children: "Tools" })
78
- ] }),
79
- /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "agents", children: /* @__PURE__ */ jsxRuntime.jsx(
80
- LatencyChart,
81
- {
82
- data: data.agentData,
83
- onPointClick: onPointClick ? (p) => onPointClick("agents", p) : void 0
84
- }
85
- ) }),
86
- /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "workflows", children: /* @__PURE__ */ jsxRuntime.jsx(
87
- LatencyChart,
88
- {
89
- data: data.workflowData,
90
- onPointClick: onPointClick ? (p) => onPointClick("workflows", p) : void 0
91
- }
92
- ) }),
93
- /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "tools", children: /* @__PURE__ */ jsxRuntime.jsx(
94
- LatencyChart,
95
- {
96
- data: data.toolData,
97
- onPointClick: onPointClick ? (p) => onPointClick("tools", p) : void 0
98
- }
99
- ) })
100
- ] }) })
74
+ isLoading ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Error, { message: "Failed to load latency data" }) : /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.NoData, { message: "No latency data yet" }) : /* @__PURE__ */ jsxRuntime.jsxs(
75
+ tabsTab.Tabs,
76
+ {
77
+ value: activeTab,
78
+ onValueChange: (value) => {
79
+ if (isLatencyTab(value) && tabHasData[value]) {
80
+ setSelectedTab(value);
81
+ }
82
+ },
83
+ defaultTab: initialTab,
84
+ className: "overflow-visible",
85
+ children: [
86
+ /* @__PURE__ */ jsxRuntime.jsxs(tabsTab.TabList, { children: [
87
+ /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "agents", disabled: !agentsHasData, disabledTooltip: "No agent latency data for this period", children: "Agents" }),
88
+ /* @__PURE__ */ jsxRuntime.jsx(
89
+ tabsTab.Tab,
90
+ {
91
+ value: "workflows",
92
+ disabled: !workflowsHasData,
93
+ disabledTooltip: "No workflow latency data for this period",
94
+ children: "Workflows"
95
+ }
96
+ ),
97
+ /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "tools", disabled: !toolsHasData, disabledTooltip: "No tool latency data for this period", children: "Tools" })
98
+ ] }),
99
+ /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "agents", children: /* @__PURE__ */ jsxRuntime.jsx(
100
+ LatencyChart,
101
+ {
102
+ data: data.agentData,
103
+ onPointClick: onPointClick ? (p) => onPointClick("agents", p) : void 0
104
+ }
105
+ ) }),
106
+ /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "workflows", children: /* @__PURE__ */ jsxRuntime.jsx(
107
+ LatencyChart,
108
+ {
109
+ data: data.workflowData,
110
+ onPointClick: onPointClick ? (p) => onPointClick("workflows", p) : void 0
111
+ }
112
+ ) }),
113
+ /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "tools", children: /* @__PURE__ */ jsxRuntime.jsx(
114
+ LatencyChart,
115
+ {
116
+ data: data.toolData,
117
+ onPointClick: onPointClick ? (p) => onPointClick("tools", p) : void 0
118
+ }
119
+ ) })
120
+ ]
121
+ }
122
+ ) })
101
123
  ] });
102
124
  }
103
125
 
@@ -1 +1 @@
1
- {"version":3,"file":"latency-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/latency-card-view.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { LatencyPoint } from '../hooks/use-latency-metrics';\nimport { CHART_COLORS } from './metrics-utils';\n\nconst latencySeries = [\n {\n dataKey: 'p50',\n label: 'p50',\n color: CHART_COLORS.blue,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p50 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n {\n dataKey: 'p95',\n label: 'p95',\n color: CHART_COLORS.yellow,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p95 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n];\n\nexport type LatencyTab = 'agents' | 'workflows' | 'tools';\n\nfunction LatencyChart({ data, onPointClick }: { data: LatencyPoint[]; onPointClick?: (point: LatencyPoint) => void }) {\n if (data.length === 0) {\n return <MetricsCard.NoData message=\"No latency data yet\" />;\n }\n return (\n <MetricsLineChart\n data={data}\n series={latencySeries}\n onPointClick={\n onPointClick\n ? point => {\n const p = point as LatencyPoint;\n if (typeof p?.tsMs === 'number' && Number.isFinite(p.tsMs)) onPointClick(p);\n }\n : undefined\n }\n />\n );\n}\n\nexport interface LatencyCardViewProps {\n data: { agentData: LatencyPoint[]; workflowData: LatencyPoint[]; toolData: LatencyPoint[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: invoked when a chart node is clicked. Container provides the navigation. */\n onPointClick?: (tab: LatencyTab, point: LatencyPoint) => void;\n /**\n * Optional slot for top-bar action buttons (e.g. \"View in Traces\").\n * Pass a function to receive the active tab so the action can scope itself to the current entity type.\n */\n actions?: ReactNode | ((tab: LatencyTab) => ReactNode);\n}\n\nexport function LatencyCardView({ data, isLoading, isError, onPointClick, actions }: LatencyCardViewProps) {\n const initialTab: LatencyTab = !data\n ? 'agents'\n : data.agentData.length > 0\n ? 'agents'\n : data.workflowData.length > 0\n ? 'workflows'\n : data.toolData.length > 0\n ? 'tools'\n : 'agents';\n const [activeTab, setActiveTab] = useState<LatencyTab>(initialTab);\n // Resync to a non-empty tab when async data finishes loading. Without this,\n // a card that mounts before data arrives stays stuck on `agents` even when\n // only workflow/tool data exists.\n useEffect(() => {\n if (!data) return;\n const tabHasData = {\n agents: data.agentData.length > 0,\n workflows: data.workflowData.length > 0,\n tools: data.toolData.length > 0,\n } as const;\n if (!tabHasData[activeTab] && tabHasData[initialTab]) {\n setActiveTab(initialTab);\n }\n }, [data, activeTab, initialTab]);\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const p50Values = data\n ? Object.values(data)\n .filter(Array.isArray)\n .flat()\n .map(d => d.p50)\n .filter((v): v is number => typeof v === 'number')\n : [];\n const avgP50 =\n p50Values.length > 0 ? `${Math.round(p50Values.reduce((s, v) => s + v, 0) / p50Values.length)}ms` : '—';\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Latency\" description=\"Hourly p50 and p95 latency.\" />\n {hasData && <MetricsCard.Summary value={avgP50} label=\"Avg p50\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load latency data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No latency data yet\" />\n ) : (\n <Tabs value={activeTab} onValueChange={setActiveTab} defaultTab={initialTab} className=\"overflow-visible\">\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\">\n <LatencyChart\n data={data.agentData}\n onPointClick={onPointClick ? p => onPointClick('agents', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"workflows\">\n <LatencyChart\n data={data.workflowData}\n onPointClick={onPointClick ? p => onPointClick('workflows', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"tools\">\n <LatencyChart\n data={data.toolData}\n onPointClick={onPointClick ? p => onPointClick('tools', p) : undefined}\n />\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["CHART_COLORS","jsx","MetricsCard","MetricsLineChart","useState","useEffect","jsxs","Tabs","TabList","Tab","TabContent"],"mappings":"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"}
1
+ {"version":3,"file":"latency-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/latency-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart/metrics-line-chart';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LatencyPoint } from '../hooks/use-latency-metrics';\nimport { CHART_COLORS } from './metrics-utils';\n\nconst latencySeries = [\n {\n dataKey: 'p50',\n label: 'p50',\n color: CHART_COLORS.blue,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p50 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n {\n dataKey: 'p95',\n label: 'p95',\n color: CHART_COLORS.yellow,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p95 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n];\n\nexport type LatencyTab = 'agents' | 'workflows' | 'tools';\n\nfunction isLatencyTab(value: string): value is LatencyTab {\n return value === 'agents' || value === 'workflows' || value === 'tools';\n}\n\nfunction LatencyChart({ data, onPointClick }: { data: LatencyPoint[]; onPointClick?: (point: LatencyPoint) => void }) {\n if (data.length === 0) {\n return <MetricsCard.NoData message=\"No latency data yet\" />;\n }\n return (\n <MetricsLineChart\n data={data}\n series={latencySeries}\n onPointClick={\n onPointClick\n ? point => {\n const p = point as LatencyPoint;\n if (typeof p?.tsMs === 'number' && Number.isFinite(p.tsMs)) onPointClick(p);\n }\n : undefined\n }\n />\n );\n}\n\nexport interface LatencyCardViewProps {\n data: { agentData: LatencyPoint[]; workflowData: LatencyPoint[]; toolData: LatencyPoint[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: invoked when a chart node is clicked. Container provides the navigation. */\n onPointClick?: (tab: LatencyTab, point: LatencyPoint) => void;\n /**\n * Optional slot for top-bar action buttons (e.g. \"View in Traces\").\n * Pass a function to receive the active tab so the action can scope itself to the current entity type.\n */\n actions?: ReactNode | ((tab: LatencyTab) => ReactNode);\n}\n\nexport function LatencyCardView({ data, isLoading, isError, onPointClick, actions }: LatencyCardViewProps) {\n const agentsHasData = (data?.agentData.length ?? 0) > 0;\n const workflowsHasData = (data?.workflowData.length ?? 0) > 0;\n const toolsHasData = (data?.toolData.length ?? 0) > 0;\n const tabHasData = {\n agents: agentsHasData,\n workflows: workflowsHasData,\n tools: toolsHasData,\n } as const;\n const initialTab: LatencyTab = agentsHasData\n ? 'agents'\n : workflowsHasData\n ? 'workflows'\n : toolsHasData\n ? 'tools'\n : 'agents';\n const [selectedTab, setSelectedTab] = useState<LatencyTab>('agents');\n const activeTab = tabHasData[selectedTab] ? selectedTab : initialTab;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const p50Values = data\n ? Object.values(data)\n .filter(Array.isArray)\n .flat()\n .map(d => d.p50)\n .filter((v): v is number => typeof v === 'number')\n : [];\n const avgP50 =\n p50Values.length > 0 ? `${Math.round(p50Values.reduce((s, v) => s + v, 0) / p50Values.length)}ms` : '—';\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Latency\" description=\"Hourly p50 and p95 latency.\" />\n {hasData && <MetricsCard.Summary value={avgP50} label=\"Avg p50\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load latency data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No latency data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={value => {\n if (isLatencyTab(value) && tabHasData[value]) {\n setSelectedTab(value);\n }\n }}\n defaultTab={initialTab}\n className=\"overflow-visible\"\n >\n <TabList>\n <Tab value=\"agents\" disabled={!agentsHasData} disabledTooltip=\"No agent latency data for this period\">\n Agents\n </Tab>\n <Tab\n value=\"workflows\"\n disabled={!workflowsHasData}\n disabledTooltip=\"No workflow latency data for this period\"\n >\n Workflows\n </Tab>\n <Tab value=\"tools\" disabled={!toolsHasData} disabledTooltip=\"No tool latency data for this period\">\n Tools\n </Tab>\n </TabList>\n <TabContent value=\"agents\">\n <LatencyChart\n data={data.agentData}\n onPointClick={onPointClick ? p => onPointClick('agents', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"workflows\">\n <LatencyChart\n data={data.workflowData}\n onPointClick={onPointClick ? p => onPointClick('workflows', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"tools\">\n <LatencyChart\n data={data.toolData}\n onPointClick={onPointClick ? p => onPointClick('tools', p) : undefined}\n />\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["CHART_COLORS","jsx","MetricsCard","MetricsLineChart","useState","jsxs","Tabs","TabList","Tab","TabContent"],"mappings":"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"}