@anymux/ui-kit 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{calendar-DSlrbHoj.js → calendar-DQKfYSQS.js} +48 -45
- package/dist/calendar-DQKfYSQS.js.map +1 -0
- package/dist/calendar.d.ts +1 -1
- package/dist/calendar.js +1 -1
- package/dist/{contacts-DQXTZzHc.js → contacts-By9Wg3kn.js} +35 -33
- package/dist/contacts-By9Wg3kn.js.map +1 -0
- package/dist/contacts.d.ts +1 -1
- package/dist/contacts.js +1 -1
- package/dist/{file-browser-m5atC3kF.js → file-browser-CkhNwADU.js} +61 -133
- package/dist/file-browser-CkhNwADU.js.map +1 -0
- package/dist/file-browser.d.ts +6 -6
- package/dist/file-browser.js +4 -4
- package/dist/{git-B55e6LL-.js → git-m4lboTfx.js} +29 -29
- package/dist/git-m4lboTfx.js.map +1 -0
- package/dist/git.js +1 -1
- package/dist/{iconMap-V4B8P-Uh.js → iconMap-DDpe35ek.js} +5 -5
- package/dist/iconMap-DDpe35ek.js.map +1 -0
- package/dist/icons.js +1 -1
- package/dist/{index-Bryv_GCG.d.ts → index-BP4IYXiF.d.ts} +46 -53
- package/dist/index-BP4IYXiF.d.ts.map +1 -0
- package/dist/{index-kHr9udZD.d.ts → index-BkIh8oov.d.ts} +17 -17
- package/dist/{index-kHr9udZD.d.ts.map → index-BkIh8oov.d.ts.map} +1 -1
- package/dist/{index-DSu19mq0.d.ts → index-D3Ob3aXg.d.ts} +9 -9
- package/dist/{index-DSu19mq0.d.ts.map → index-D3Ob3aXg.d.ts.map} +1 -1
- package/dist/{index-Ml_SgiKa.d.ts → index-DGoLQBX6.d.ts} +18 -42
- package/dist/index-DGoLQBX6.d.ts.map +1 -0
- package/dist/index-DnJaZr08.d.ts +67 -0
- package/dist/index-DnJaZr08.d.ts.map +1 -0
- package/dist/{index-DmsyeHFr.d.ts → index-Pty-N7-g.d.ts} +5 -5
- package/dist/{index-DmsyeHFr.d.ts.map → index-Pty-N7-g.d.ts.map} +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +10 -10
- package/dist/layout-BYsc16hD.js +183 -0
- package/dist/layout-BYsc16hD.js.map +1 -0
- package/dist/layout.d.ts +2 -2
- package/dist/layout.js +2 -2
- package/dist/{list-CxfT6hix.js → list-DAq-b6RR.js} +49 -63
- package/dist/list-DAq-b6RR.js.map +1 -0
- package/dist/list.d.ts +2 -2
- package/dist/list.js +4 -3
- package/dist/{media-DZ292aKK.js → media-DuczOGsk.js} +32 -31
- package/dist/media-DuczOGsk.js.map +1 -0
- package/dist/media.js +1 -1
- package/dist/{tree-Dd9Z0Aso.js → tree-B9VQcKBp.js} +2 -2
- package/dist/{tree-Dd9Z0Aso.js.map → tree-B9VQcKBp.js.map} +1 -1
- package/dist/tree.d.ts +1 -1
- package/dist/tree.js +2 -2
- package/package.json +2 -2
- package/src/calendar/AgendaView.tsx +2 -2
- package/src/calendar/CalendarBrowser.tsx +11 -11
- package/src/calendar/CalendarSidebar.tsx +10 -10
- package/src/calendar/DayView.tsx +5 -5
- package/src/calendar/EventCard.tsx +3 -3
- package/src/calendar/MonthView.tsx +6 -6
- package/src/calendar/WeekView.tsx +10 -10
- package/src/contacts/ContactBrowser.tsx +8 -8
- package/src/contacts/ContactCard.tsx +4 -4
- package/src/contacts/ContactDetail.tsx +10 -10
- package/src/contacts/ContactGroupSidebar.tsx +6 -6
- package/src/contacts/ContactList.tsx +3 -3
- package/src/file-browser/components/FileBrowser.tsx +3 -2
- package/src/file-browser/components/FileBrowserContent.tsx +1 -1
- package/src/file-browser/examples/BasicUsage.tsx +2 -2
- package/src/file-browser/index.ts +1 -1
- package/src/file-browser/providers/FileSystemProvider.ts +1 -1
- package/src/git/BranchList.tsx +12 -12
- package/src/git/CommitList.tsx +11 -11
- package/src/git/DiffViewer.tsx +11 -11
- package/src/icons/iconMap.ts +4 -4
- package/src/layout/index.ts +6 -2
- package/src/layout/models/ResponsiveLayoutModel.ts +116 -0
- package/src/list/components/ListItem.tsx +1 -1
- package/src/list/index.ts +1 -1
- package/src/media/AlbumSidebar.tsx +4 -4
- package/src/media/MediaBrowser.tsx +11 -11
- package/src/media/MediaGrid.tsx +3 -3
- package/src/media/MediaList.tsx +6 -6
- package/src/media/MediaPreview.tsx +2 -2
- package/src/media/MediaTimeline.tsx +3 -3
- package/src/{file-browser/components/shared → shared}/ErrorBoundary.tsx +3 -3
- package/dist/calendar-DSlrbHoj.js.map +0 -1
- package/dist/contacts-DQXTZzHc.js.map +0 -1
- package/dist/file-browser-m5atC3kF.js.map +0 -1
- package/dist/git-B55e6LL-.js.map +0 -1
- package/dist/iconMap-V4B8P-Uh.js.map +0 -1
- package/dist/index-Bryv_GCG.d.ts.map +0 -1
- package/dist/index-DzfY1Tok.d.ts +0 -32
- package/dist/index-DzfY1Tok.d.ts.map +0 -1
- package/dist/index-Ml_SgiKa.d.ts.map +0 -1
- package/dist/layout-Ca_4r8ka.js +0 -89
- package/dist/layout-Ca_4r8ka.js.map +0 -1
- package/dist/list-CxfT6hix.js.map +0 -1
- package/dist/media-DZ292aKK.js.map +0 -1
- package/src/list/components/shared/ErrorBoundary.tsx +0 -123
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-Dd9Z0Aso.js","names":["DEFAULT_SELECTION_THEME: TreeSelectionTheme","colorScheme: SelectionColorScheme","intensity: SelectionIntensity","focusStyle: FocusIndicatorStyle","theme: TreeSelectionTheme","isSelected: boolean","isFocused: boolean","useCheckboxes: boolean","theme: Partial<TreeSelectionTheme>","enabled: boolean","options?: TreeLoadOptions","node: TreeNodeData","path?: string","baseItems: TreeContextMenuItem[]","nodes: TreeNodeData[]","menuItemId: string","value: string","value: number","value: Date","sort: TreeTableSort | null","options: TreeTableExportOptions","parentPath: string","depth: number","fileType: string","index: number","fileNames: Record<string, string[]>","folderType: string","descriptions: Record<string, string>","categories: Record<string, string>","options: SimpleTreeProviderOptions","theme: Partial<TreeSelectionTheme>","enabled: boolean","options?: TreeLoadOptions","node: TreeNodeData","path?: string","nodes: TreeNodeData[]","data: TreeNodeData[]","parentPath: string | null","newNode: TreeNodeData","nodePath: string","path: string","targetPath: string","level: LogEntry['level']","message: string","context?: LogContext","data?: any","entry: LogEntry","context: LogContext","parts: string[]","operation: string","nodeId: string","component: string","classes: string","selected: boolean","focused: boolean","method: string","property: string","oldValue: any","newValue: any","filter?: { level?: LogEntry['level'], component?: string }","provider: TreeProvider","options?: TreeLoadOptions","node: TreeNodeData","child: TreeNodeData","nodes: TreeNodeData[]","nodeId: string","newState: CheckboxState","state: CheckboxState","parentState: CheckboxState","targetId: string","parentNode: TreeNodeData | null","result: TreeNodeData[]","event: MouseEvent","menuItem: TreeContextMenuItem","event: React.MouseEvent","event: React.KeyboardEvent","TreeInlineRename: React.FC<{\n currentName: string;\n onCommit: (newName: string) => void;\n onCancel: () => void;\n}>","node: TreeNodeData","event: React.MouseEvent","event: MouseEvent","event: KeyboardEvent","item: TreeContextMenuItem","event: React.MouseEvent","result: TreeNodeData[]","nodes: TreeNodeData[]","targetIndex: number","nodeId: string","targetId: string","parentNode: TreeNodeData | null","event: KeyboardEvent","defaultColumns: TreeTableColumn[]","node: TreeNodeData","level: number","data: Array<{ node: TreeNodeData; level: number }>","columnKey: string","cellContent: React.ReactNode"],"sources":["../src/tree/utils/SelectionTheme.ts","../src/tree/providers/TestTreeProvider.ts","../src/tree/providers/SimpleTreeProvider.ts","../src/tree/utils/logger.ts","../src/tree/models/TreeModel.ts","../src/tree/components/TreeCheckbox.tsx","../src/tree/components/TreeNodeList.tsx","../src/tree/components/TreeContextMenu.tsx","../src/tree/components/Tree.tsx","../src/tree/components/TreeTable.tsx"],"sourcesContent":["/**\n * SelectionTheme - Utility for theme-aware selection styling\n * \n * This module provides utilities for generating theme-aware CSS classes\n * for tree node selection based on the configured selection theme.\n */\n\nimport { cn } from '../../lib/utils';\nimport type { TreeSelectionTheme, SelectionColorScheme, SelectionIntensity, FocusIndicatorStyle } from '../types/TreeTypes';\n\n/**\n * Default selection theme configuration\n */\nexport const DEFAULT_SELECTION_THEME: TreeSelectionTheme = {\n colorScheme: 'primary',\n intensity: 'subtle',\n focusStyle: 'ring',\n animated: true,\n persistSelection: true\n};\n\n/**\n * Generate selection background classes based on color scheme and intensity\n */\nexport function getSelectionBackground(colorScheme: SelectionColorScheme, intensity: SelectionIntensity): string {\n if (colorScheme === 'custom') {\n // Use inline styles for custom colors - return empty string for CSS classes\n return '';\n }\n\n const intensityMap = {\n subtle: {\n primary: 'bg-primary/10',\n secondary: 'bg-secondary/10',\n accent: 'bg-accent/20',\n muted: 'bg-muted'\n },\n prominent: {\n primary: 'bg-primary/20',\n secondary: 'bg-secondary/20', \n accent: 'bg-accent/40',\n muted: 'bg-muted/60'\n },\n 'high-contrast': {\n primary: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground',\n accent: 'bg-accent text-accent-foreground',\n muted: 'bg-muted-foreground text-muted'\n }\n };\n\n return intensityMap[intensity]?.[colorScheme] || intensityMap.subtle.primary;\n}\n\n/**\n * Generate hover background classes\n */\nexport function getHoverBackground(colorScheme: SelectionColorScheme): string {\n if (colorScheme === 'custom') {\n // Use inline styles for custom colors instead of CSS custom properties\n return '';\n }\n\n const hoverMap = {\n primary: 'hover:bg-primary/5',\n secondary: 'hover:bg-secondary/5',\n accent: 'hover:bg-accent/10',\n muted: 'hover:bg-muted/30'\n };\n\n return hoverMap[colorScheme] || hoverMap.primary;\n}\n\n/**\n * Generate focus indicator classes based on focus style\n */\nexport function getFocusIndicator(focusStyle: FocusIndicatorStyle, colorScheme: SelectionColorScheme): string {\n if (colorScheme === 'custom') {\n return focusStyle === 'ring' \n ? 'ring-2 ring-[var(--tree-focus-ring)] ring-offset-1'\n : 'border-l-2 border-[var(--tree-focus-border)]';\n }\n\n const focusMap = {\n ring: {\n primary: 'ring-2 ring-primary ring-offset-1',\n secondary: 'ring-2 ring-secondary ring-offset-1',\n accent: 'ring-2 ring-accent ring-offset-1',\n muted: 'ring-2 ring-muted-foreground ring-offset-1'\n },\n outline: {\n primary: 'outline-2 outline-primary',\n secondary: 'outline-2 outline-secondary',\n accent: 'outline-2 outline-accent',\n muted: 'outline-2 outline-muted-foreground'\n },\n border: {\n primary: 'border-l-2 border-primary',\n secondary: 'border-l-2 border-secondary',\n accent: 'border-l-2 border-accent',\n muted: 'border-l-2 border-muted-foreground'\n },\n underline: {\n primary: 'border-b-2 border-primary',\n secondary: 'border-b-2 border-secondary',\n accent: 'border-b-2 border-accent',\n muted: 'border-b-2 border-muted-foreground'\n }\n };\n\n return focusMap[focusStyle]?.[colorScheme] || focusMap.ring.primary;\n}\n\n/**\n * Generate complete selection classes for a tree node\n */\nexport function getSelectionClasses(\n theme: TreeSelectionTheme,\n isSelected: boolean,\n isFocused: boolean,\n useCheckboxes: boolean = false\n): string {\n const baseClasses = [\n 'transition-colors',\n theme.animated ? 'duration-150' : '',\n getHoverBackground(theme.colorScheme)\n ];\n\n if (isSelected) {\n baseClasses.push(getSelectionBackground(theme.colorScheme, theme.intensity));\n }\n\n if (isFocused && !useCheckboxes) {\n baseClasses.push(getFocusIndicator(theme.focusStyle, theme.colorScheme));\n }\n\n return cn(baseClasses);\n}\n\n\n\n/**\n * Generate CSS custom properties for custom color schemes\n * NOTE: This function is now simplified since we handle custom colors with inline styles\n */\nexport function getCustomColorVariables(theme: TreeSelectionTheme): Record<string, string> {\n // Return empty object since we now handle custom colors with inline styles\n // This avoids TypeScript issues with potentially undefined color properties\n return {};\n} ","import { makeAutoObservable } from 'mobx';\nimport type { TreeProvider, TreeSelectionInfo } from './TreeProvider';\nimport type { TreeNodeData, TreeLoadResult, TreeLoadOptions, TreeTableColumn, TreeTableSort, TreeTableExportOptions, TreeSelectionTheme } from '../types/TreeTypes';\nimport type { TreeContextMenuItem } from '../types/TreeTypes';\nimport { DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\nimport React from 'react';\nimport { \n FileText, ImageIcon as Image, Settings, BookOpen, TestTube, Package, \n Palette, Globe, Zap, Music, Archive, GitBranch, Database, Key, \n Code, Braces, Play, Component \n} from 'lucide-react';\n\nexport class TestTreeProvider implements TreeProvider {\n // Provider metadata (required)\n readonly id = 'test-tree-provider';\n readonly name = 'Test Tree Provider';\n readonly version = '1.0.0';\n \n // Configuration (required)\n isMultiSelectEnabled = true;\n readonly isDragDropEnabled = false;\n readonly isVirtualizationEnabled = false;\n readonly isTableViewEnabled = true;\n useCheckboxSelection = false;\n readonly allowPartialSelection = true;\n readonly config = {};\n\n // Observable selection theme\n selectionTheme: TreeSelectionTheme = {\n ...DEFAULT_SELECTION_THEME,\n colorScheme: 'primary',\n intensity: 'prominent',\n focusStyle: 'ring',\n animated: true,\n persistSelection: true\n };\n\n // Test provider specific settings\n slowLoading = false;\n simulateErrors = false;\n maxDepth = 3;\n nodesPerLevel = 5;\n loadingDelay = 300;\n\n // Callbacks (optional)\n onSelectionChange?: (selectionInfo: TreeSelectionInfo) => void;\n onNodeExpansion?: (node: TreeNodeData, isExpanded: boolean) => void;\n onNodeFocus?: (node: TreeNodeData | null) => void;\n\n constructor() {\n makeAutoObservable(this, {\n id: false,\n name: false,\n version: false,\n isDragDropEnabled: false,\n isVirtualizationEnabled: false,\n isTableViewEnabled: false,\n config: false,\n // Make isMultiSelectEnabled and useCheckboxSelection observable\n // isMultiSelectEnabled: true (default - observable)\n // useCheckboxSelection: true (default - observable)\n });\n }\n\n /**\n * Update selection theme reactively\n */\n updateSelectionTheme = (theme: Partial<TreeSelectionTheme>) => {\n this.selectionTheme = { ...this.selectionTheme, ...theme };\n };\n\n /**\n * Update multi-select setting\n */\n setMultiSelectEnabled = (enabled: boolean) => {\n this.isMultiSelectEnabled = enabled;\n };\n\n /**\n * Update checkbox selection setting\n */\n setCheckboxSelection = (enabled: boolean) => {\n this.useCheckboxSelection = enabled;\n };\n\n /**\n * Get selection theme configuration\n */\n getSelectionTheme(): TreeSelectionTheme {\n return this.selectionTheme;\n }\n\n /**\n * Load tree nodes\n */\n async loadNodes(options?: TreeLoadOptions): Promise<TreeLoadResult> {\n await this.simulateDelay();\n \n if (this.simulateErrors && Math.random() < 0.3) {\n throw new Error('Simulated loading error - try again!');\n }\n \n const nodes = this.generateMockNodes('', 0);\n \n return {\n nodes,\n hasMore: false,\n totalCount: nodes.length\n };\n }\n\n /**\n * Load child nodes for a given parent\n */\n async loadChildren(node: TreeNodeData, options?: TreeLoadOptions): Promise<TreeLoadResult> {\n await this.simulateDelay();\n \n if (this.simulateErrors && Math.random() < 0.3) {\n throw new Error('Simulated loading error - try again!');\n }\n \n // Generate children for the given node\n const pathParts = node.path.split('/').filter(Boolean);\n const depth = pathParts.length;\n \n // Only generate children if we haven't exceeded max depth\n if (depth >= this.maxDepth) {\n return {\n nodes: [],\n hasMore: false,\n totalCount: 0\n };\n }\n \n const children = this.generateMockNodes(node.path, depth);\n \n return {\n nodes: children,\n hasMore: false,\n totalCount: children.length\n };\n }\n\n /**\n * Refresh tree data\n */\n async refresh(path?: string): Promise<TreeLoadResult> {\n return path ? this.loadChildren({ path } as TreeNodeData) : this.loadNodes();\n }\n\n canExpand(node: TreeNodeData): boolean {\n return node.type === 'directory' && (node.hasChildren ?? true);\n }\n\n canSelect(node: TreeNodeData): boolean {\n return !node.disabled;\n }\n\n // Context menu support\n getNodeContextMenu(node: TreeNodeData): TreeContextMenuItem[] {\n // Enhanced context menus based on node type and file extension\n const baseItems: TreeContextMenuItem[] = [];\n\n if (node.type === 'directory') {\n // Folder-specific menus\n if (node.name.includes('components')) {\n // React Components folder\n return [\n { id: 'open', label: 'Open Folder' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'new-component', label: 'New React Component' },\n { id: 'new-hook', label: 'New Custom Hook' },\n { id: 'new-story', label: 'New Storybook Story' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'run-tests', label: 'Run Component Tests' },\n { id: 'build-docs', label: 'Generate Docs' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename Folder' },\n { id: 'delete', label: 'Delete Folder' }\n ];\n } else if (node.name.includes('config')) {\n // Configuration folder\n return [\n { id: 'open', label: 'Open Config Folder' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'new-env', label: 'New Environment File' },\n { id: 'new-config', label: 'New Config File' },\n { id: 'validate-config', label: 'Validate Configuration' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'backup-config', label: 'Backup Configuration' },\n { id: 'restore-config', label: 'Restore from Backup' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename Folder' },\n { id: 'delete', label: 'Delete Folder' }\n ];\n } else {\n // General folder menu\n return [\n { id: 'open', label: 'Open Folder' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'new-file', label: 'New File' },\n { id: 'new-folder', label: 'New Folder' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'import-files', label: 'Import Files' },\n { id: 'export-folder', label: 'Export Folder' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename Folder' },\n { id: 'delete', label: 'Delete Folder' },\n { id: 'separator-4', label: '', type: 'separator' },\n { id: 'copy', label: 'Copy Folder' },\n { id: 'cut', label: 'Cut Folder' }\n ];\n }\n }\n\n // File-specific menus based on extension\n const fileName = node.name;\n const fileExt = fileName.split('.').pop()?.toLowerCase() || '';\n\n switch (fileExt) {\n case 'js':\n case 'jsx':\n // JavaScript/React files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Open in Preview' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'run-file', label: 'Run JavaScript' },\n { id: 'debug-file', label: 'Debug in Browser' },\n { id: 'format-code', label: 'Format with Prettier' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'create-test', label: 'Create Test File' },\n { id: 'run-tests', label: 'Run Tests' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'ts':\n case 'tsx':\n // TypeScript files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Open in Preview' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compile-ts', label: 'Compile TypeScript' },\n { id: 'type-check', label: 'Run Type Check' },\n { id: 'generate-types', label: 'Generate Type Definitions' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'create-test', label: 'Create Test File' },\n { id: 'run-tests', label: 'Run Tests' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'css':\n case 'scss':\n case 'sass':\n case 'less':\n // Stylesheet files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Live Preview' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compile-css', label: 'Compile Stylesheet' },\n { id: 'optimize-css', label: 'Optimize CSS' },\n { id: 'validate-css', label: 'Validate CSS' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'extract-vars', label: 'Extract CSS Variables' },\n { id: 'generate-rtl', label: 'Generate RTL Version' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'md':\n case 'mdx':\n // Markdown files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Preview Markdown' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'export-html', label: 'Export to HTML' },\n { id: 'export-pdf', label: 'Export to PDF' },\n { id: 'check-links', label: 'Check Links' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'toc-generate', label: 'Generate Table of Contents' },\n { id: 'word-count', label: 'Word Count & Stats' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'json':\n // JSON configuration files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-viewer', label: 'Open JSON Viewer' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'validate-json', label: 'Validate JSON' },\n { id: 'format-json', label: 'Format JSON' },\n { id: 'minify-json', label: 'Minify JSON' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'compare-json', label: 'Compare with...' },\n { id: 'schema-validate', label: 'Validate Against Schema' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'svg':\n case 'webp':\n // Image files\n return [\n { id: 'open', label: 'Open Image' },\n { id: 'open-editor', label: 'Edit in Image Editor' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'resize-image', label: 'Resize Image' },\n { id: 'compress-image', label: 'Compress Image' },\n { id: 'convert-format', label: 'Convert Format' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'image-info', label: 'Image Properties' },\n { id: 'copy-url', label: 'Copy Image URL' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n default:\n // Generic file menu\n return [\n { id: 'open', label: 'Open File' },\n { id: 'open-with', label: 'Open With...' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'properties', label: 'File Properties' },\n { id: 'permissions', label: 'Change Permissions' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'copy', label: 'Copy File' },\n { id: 'cut', label: 'Cut File' }\n ];\n }\n }\n\n getMultiNodeContextMenu(nodes: TreeNodeData[]): TreeContextMenuItem[] {\n // Enhanced multi-selection menus\n const hasFiles = nodes.some(n => n.type === 'file');\n const hasFolders = nodes.some(n => n.type === 'directory');\n const allSameType = hasFiles && !hasFolders || hasFolders && !hasFiles;\n\n if (allSameType && hasFiles) {\n // All files selected\n return [\n { id: 'open-all', label: `Open ${nodes.length} Files` },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compress-files', label: `Create Archive (${nodes.length} files)` },\n { id: 'copy-paths', label: 'Copy File Paths' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'copy-all', label: `Copy ${nodes.length} Files` },\n { id: 'cut-all', label: `Cut ${nodes.length} Files` },\n { id: 'delete-all', label: `Delete ${nodes.length} Files` }\n ];\n } else if (allSameType && hasFolders) {\n // All folders selected\n return [\n { id: 'open-all', label: `Open ${nodes.length} Folders` },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'merge-folders', label: 'Merge Folders' },\n { id: 'compare-folders', label: 'Compare Folders' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'copy-all', label: `Copy ${nodes.length} Folders` },\n { id: 'cut-all', label: `Cut ${nodes.length} Folders` },\n { id: 'delete-all', label: `Delete ${nodes.length} Folders` }\n ];\n } else {\n // Mixed selection (files and folders)\n return [\n { id: 'open-all', label: `Open ${nodes.length} Items` },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compress-all', label: `Create Archive (${nodes.length} items)` },\n { id: 'copy-info', label: 'Copy Selection Info' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'copy-all', label: `Copy ${nodes.length} Items` },\n { id: 'cut-all', label: `Cut ${nodes.length} Items` },\n { id: 'delete-all', label: `Delete ${nodes.length} Items` }\n ];\n }\n }\n\n onContextMenuAction(menuItemId: string, nodes: TreeNodeData[]): void {\n const nodeNames = nodes.map(n => n.name).join(', ');\n console.log(`🎯 Context menu action: ${menuItemId} on nodes: ${nodeNames}`);\n \n // Enhanced action handling with more detailed logging\n switch (menuItemId) {\n // File operations\n case 'open':\n case 'open-all':\n console.log(`📂 Opening: ${nodeNames}`);\n alert(`Opening: ${nodeNames}`);\n break;\n case 'open-preview':\n console.log(`👁️ Opening preview for: ${nodeNames}`);\n alert(`Preview mode for: ${nodeNames}`);\n break;\n case 'open-editor':\n console.log(`✏️ Opening in editor: ${nodeNames}`);\n alert(`Editor opened for: ${nodeNames}`);\n break;\n\n // Development operations\n case 'run-file':\n case 'run-tests':\n console.log(`▶️ Running: ${nodeNames}`);\n alert(`Executing: ${nodeNames}`);\n break;\n case 'debug-file':\n console.log(`🐛 Debugging: ${nodeNames}`);\n alert(`Debug session started for: ${nodeNames}`);\n break;\n case 'compile-ts':\n case 'compile-css':\n console.log(`🔨 Compiling: ${nodeNames}`);\n alert(`Compilation started for: ${nodeNames}`);\n break;\n case 'format-code':\n case 'format-json':\n console.log(`🎨 Formatting: ${nodeNames}`);\n alert(`Code formatted: ${nodeNames}`);\n break;\n case 'type-check':\n console.log(`🔍 Type checking: ${nodeNames}`);\n alert(`Type check completed for: ${nodeNames}`);\n break;\n\n // Creation operations\n case 'new-file':\n case 'new-folder':\n case 'new-component':\n case 'new-hook':\n case 'new-story':\n console.log(`➕ Creating new ${menuItemId.replace('new-', '')} in: ${nodeNames}`);\n alert(`Creating new ${menuItemId.replace('new-', '')} in: ${nodeNames}`);\n break;\n\n // Export/Import operations\n case 'export-html':\n case 'export-pdf':\n console.log(`📤 Exporting ${menuItemId.replace('export-', '')}: ${nodeNames}`);\n alert(`Exporting ${menuItemId.replace('export-', '').toUpperCase()}: ${nodeNames}`);\n break;\n case 'import-files':\n console.log(`📥 Importing files to: ${nodeNames}`);\n alert(`Import dialog opened for: ${nodeNames}`);\n break;\n\n // File management\n case 'rename':\n console.log(`✏️ Renaming: ${nodeNames}`);\n alert(`Rename dialog for: ${nodeNames}`);\n break;\n case 'duplicate':\n console.log(`📋 Duplicating: ${nodeNames}`);\n alert(`Duplicated: ${nodeNames}`);\n break;\n case 'delete':\n case 'delete-all':\n console.log(`🗑️ Deleting: ${nodeNames}`);\n alert(`Deleted: ${nodeNames}`);\n break;\n case 'copy':\n case 'copy-all':\n console.log(`📋 Copying: ${nodeNames}`);\n alert(`Copied to clipboard: ${nodeNames}`);\n break;\n case 'cut':\n case 'cut-all':\n console.log(`✂️ Cutting: ${nodeNames}`);\n alert(`Cut to clipboard: ${nodeNames}`);\n break;\n\n // Specialized operations\n case 'validate-json':\n case 'validate-css':\n case 'validate-config':\n console.log(`✅ Validating: ${nodeNames}`);\n alert(`Validation passed for: ${nodeNames}`);\n break;\n case 'compress-image':\n case 'compress-files':\n case 'compress-all':\n console.log(`🗜️ Compressing: ${nodeNames}`);\n alert(`Compression completed for: ${nodeNames}`);\n break;\n case 'image-info':\n case 'properties':\n console.log(`ℹ️ Showing properties for: ${nodeNames}`);\n alert(`Properties: ${nodeNames}\\nSize: 1.2MB\\nType: ${nodes[0]?.type || 'unknown'}\\nModified: ${nodes[0]?.lastModified?.toLocaleDateString() || 'unknown'}`);\n break;\n\n default:\n console.log(`❓ Unknown action: ${menuItemId}`);\n alert(`Action executed: ${menuItemId} on ${nodeNames}`);\n }\n }\n \n // Table view configuration\n getTableColumns(): TreeTableColumn[] {\n return [\n {\n id: 'name',\n label: 'Name',\n dataKey: 'name',\n width: '300px',\n sortable: true,\n filterable: true,\n isTreeColumn: true,\n align: 'left'\n },\n {\n id: 'type',\n label: 'Type',\n dataKey: 'type',\n width: '100px',\n sortable: true,\n filterable: true,\n align: 'left',\n formatValue: (value: string) => value === 'directory' ? 'Folder' : 'File'\n },\n {\n id: 'size',\n label: 'Size',\n dataKey: 'size',\n width: '100px',\n sortable: true,\n align: 'right',\n formatValue: (value: number, node: TreeNodeData) => {\n if (node.type === 'directory') return '-';\n if (!value) return '-';\n \n if (value < 1024) return `${value} B`;\n if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`;\n if (value < 1024 * 1024 * 1024) return `${(value / (1024 * 1024)).toFixed(1)} MB`;\n return `${(value / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n },\n {\n id: 'lastModified',\n label: 'Modified',\n dataKey: 'lastModified',\n width: '150px',\n sortable: true,\n align: 'left',\n formatValue: (value: Date) => {\n if (!value) return '-';\n return value.toLocaleDateString();\n }\n },\n {\n id: 'path',\n label: 'Path',\n dataKey: 'path',\n width: '200px',\n sortable: true,\n filterable: true,\n align: 'left'\n }\n ];\n }\n\n getDefaultTableSort(): TreeTableSort {\n return {\n columnId: 'name',\n direction: 'asc'\n };\n }\n\n onTableSort(sort: TreeTableSort | null): void {\n console.log('Table sort changed:', sort);\n }\n\n async onTableExport(options: TreeTableExportOptions): Promise<string | void> {\n console.log('Table export requested:', options);\n alert(`Export to ${options.format.toUpperCase()} format requested`);\n }\n \n private async simulateDelay(): Promise<void> {\n const delay = this.slowLoading ? 1000 : this.loadingDelay;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n\n private generateMockNodes(parentPath: string, depth: number): TreeNodeData[] {\n if (depth >= this.maxDepth) {\n return [];\n }\n \n const nodes: TreeNodeData[] = [];\n \n // Enhanced file types with better variety for icon demo\n const fileTypes = [\n // Web Development\n 'js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'sass', 'less',\n // Documentation & Content\n 'md', 'mdx', 'txt', 'pdf',\n // Data & Config\n 'json', 'yml', 'yaml', 'xml', 'env', 'config',\n // Images\n 'jpg', 'jpeg', 'png', 'gif', 'svg', 'webp', 'ico',\n // Media\n 'mp4', 'mp3', 'wav', 'avi',\n // Archives & Executables\n 'zip', 'tar', 'gz', 'exe', 'app', 'dmg',\n // Development\n 'py', 'php', 'java', 'cpp', 'c', 'go', 'rs', 'rb'\n ];\n \n // Enhanced folder names with special types for icon demo\n const folderTypes = [\n // Development Folders\n { name: 'components', type: 'react' },\n { name: 'hooks', type: 'react' },\n { name: 'pages', type: 'react' },\n { name: 'utils', type: 'code' },\n { name: 'lib', type: 'code' },\n { name: 'src', type: 'source' },\n // Config & Build\n { name: 'config', type: 'config' },\n { name: 'build', type: 'build' },\n { name: 'dist', type: 'build' },\n { name: '.github', type: 'git' },\n { name: '.vscode', type: 'vscode' },\n // Assets & Media\n { name: 'assets', type: 'assets' },\n { name: 'images', type: 'images' },\n { name: 'media', type: 'media' },\n { name: 'public', type: 'public' },\n // Documentation & Tests\n { name: 'docs', type: 'docs' },\n { name: 'tests', type: 'test' },\n { name: '__tests__', type: 'test' },\n // Node.js specific\n { name: 'node_modules', type: 'node_modules' }\n ];\n \n for (let i = 0; i < this.nodesPerLevel; i++) {\n const nodeId = `${parentPath || 'root'}-${depth}-${i}`.replace(/[^a-zA-Z0-9-_]/g, '-');\n \n const shouldBeFolder = depth < this.maxDepth - 1 && (i < this.nodesPerLevel / 2 || Math.random() < 0.4);\n \n if (shouldBeFolder) {\n const folderType = folderTypes[i % folderTypes.length] || { name: `folder-${i}`, type: 'default' };\n const folderPath = parentPath ? `${parentPath}/${folderType.name}` : `/${folderType.name}`;\n \n nodes.push({\n id: nodeId,\n name: folderType.name,\n path: folderPath,\n type: 'directory',\n hasChildren: depth < this.maxDepth - 1,\n lastModified: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000),\n // Add metadata for enhanced demo\n metadata: {\n folderType: folderType.type,\n description: this.getFolderDescription(folderType.type)\n }\n });\n } else {\n const fileType = fileTypes[i % fileTypes.length] || 'txt';\n const fileName = this.generateFileName(fileType, i);\n const filePath = parentPath ? `${parentPath}/${fileName}` : `/${fileName}`;\n \n nodes.push({\n id: nodeId,\n name: fileName,\n path: filePath,\n type: 'file',\n hasChildren: false,\n size: Math.floor(Math.random() * 1000000) + 1024,\n lastModified: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000),\n // Add metadata for enhanced demo\n metadata: {\n fileType: fileType,\n category: this.getFileCategory(fileType),\n description: this.getFileDescription(fileType)\n }\n });\n }\n }\n \n return nodes;\n }\n \n private generateFileName(fileType: string, index: number): string {\n const fileNames: Record<string, string[]> = {\n 'js': ['utils', 'helpers', 'config', 'index', 'main'],\n 'jsx': ['App', 'Component', 'Button', 'Modal', 'Form'],\n 'ts': ['types', 'interfaces', 'utils', 'service', 'api'],\n 'tsx': ['HomePage', 'UserCard', 'Navigation', 'Layout', 'Dashboard'],\n 'css': ['styles', 'main', 'theme', 'reset', 'variables'],\n 'scss': ['app', 'components', 'layout', 'mixins', 'variables'],\n 'md': ['README', 'CHANGELOG', 'CONTRIBUTING', 'DOCS', 'API'],\n 'json': ['package', 'tsconfig', 'config', 'settings', 'data'],\n 'yml': ['docker-compose', 'config', 'ci', 'deployment', 'settings'],\n 'py': ['main', 'utils', 'models', 'views', 'tests'],\n 'jpg': ['hero-image', 'profile', 'banner', 'thumbnail', 'cover'],\n 'png': ['logo', 'icon', 'screenshot', 'diagram', 'chart']\n };\n \n const names = fileNames[fileType] || ['file'];\n const baseName = names[index % names.length];\n \n return `${baseName}.${fileType}`;\n }\n \n \n private getFolderDescription(folderType: string): string {\n const descriptions: Record<string, string> = {\n 'react': 'React components and hooks',\n 'source': 'Source code files',\n 'code': 'Utility functions and libraries',\n 'config': 'Configuration files',\n 'build': 'Build output and artifacts',\n 'git': 'Git workflow configurations',\n 'vscode': 'VS Code editor settings',\n 'assets': 'Project assets and resources',\n 'images': 'Image files and graphics',\n 'media': 'Media files (video, audio)',\n 'public': 'Public static files',\n 'docs': 'Documentation files',\n 'test': 'Test files and specs',\n 'node_modules': 'Node.js dependencies',\n 'default': 'General folder'\n };\n \n return descriptions[folderType] || 'General folder';\n }\n \n \n private getFileCategory(fileType: string): string {\n const categories: Record<string, string> = {\n // Web Development\n 'js': 'JavaScript', 'jsx': 'React', 'ts': 'TypeScript', 'tsx': 'React TypeScript',\n 'css': 'Stylesheet', 'scss': 'Sass', 'sass': 'Sass', 'less': 'Less',\n 'html': 'Markup', 'xml': 'Markup', 'svg': 'Vector Graphics',\n \n // Documentation\n 'md': 'Markdown', 'txt': 'Text', 'pdf': 'Document',\n \n // Configuration\n 'json': 'Data', 'yml': 'Config', 'yaml': 'Config', 'env': 'Environment',\n \n // Media\n 'jpg': 'Image', 'png': 'Image', 'gif': 'Image',\n 'mp3': 'Audio', 'mp4': 'Video',\n \n // Programming\n 'py': 'Python', 'php': 'PHP', 'java': 'Java', 'cpp': 'C++', 'go': 'Go',\n \n // Archives\n 'zip': 'Archive', 'tar': 'Archive',\n \n // Default\n 'default': 'File'\n };\n \n return categories[fileType] || categories['default'] || 'File';\n }\n \n private getFileDescription(fileType: string): string {\n const descriptions: Record<string, string> = {\n 'js': 'JavaScript source file',\n 'jsx': 'React component file',\n 'ts': 'TypeScript source file',\n 'tsx': 'React TypeScript component',\n 'css': 'Cascading Style Sheet',\n 'scss': 'Sass stylesheet',\n 'html': 'HTML markup file',\n 'md': 'Markdown documentation',\n 'json': 'JSON data file',\n 'py': 'Python script',\n 'jpg': 'JPEG image file',\n 'png': 'PNG image file',\n 'mp3': 'MP3 audio file',\n 'zip': 'Compressed archive'\n };\n \n return descriptions[fileType] || `${fileType.toUpperCase()} file`;\n }\n\n /**\n * Get custom icon for a node based on file type and category\n */\n getNodeIcon(node: TreeNodeData): string | React.ComponentType<any> {\n // If it's a directory/folder, use special folder icons\n if (node.type === 'directory') {\n // Special folder icons based on name\n if (node.name.includes('components')) {\n return Component; // React component folder\n }\n if (node.name.includes('assets') || node.name.includes('images')) {\n return Image;\n }\n if (node.name.includes('config') || node.name.includes('settings')) {\n return Settings;\n }\n if (node.name.includes('docs') || node.name.includes('documentation')) {\n return BookOpen;\n }\n if (node.name.includes('test') || node.name.includes('__tests__')) {\n return TestTube;\n }\n if (node.name.includes('lib') || node.name.includes('library')) {\n return Package;\n }\n \n // Default folder icons (already handled by TreeNodeList)\n return 'folder';\n }\n \n // File icons based on extension\n const extension = node.name.split('.').pop() || '';\n \n switch (extension.toLowerCase()) {\n // Web Development\n case 'js':\n case 'jsx':\n return FileText; // JavaScript icon\n \n case 'ts':\n case 'tsx':\n return Code; // TypeScript icon\n \n case 'html':\n case 'htm':\n return Globe; // HTML icon\n \n case 'css':\n case 'scss':\n case 'sass':\n case 'less':\n return Palette; // Stylesheet icon\n \n // Documentation\n case 'md':\n case 'mdx':\n return FileText; // Markdown icon\n \n case 'txt':\n return FileText;\n \n case 'pdf':\n return FileText;\n \n // Data & Configuration\n case 'json':\n return Braces; // JSON icon\n \n case 'yml':\n case 'yaml':\n return Settings; // YAML icon\n \n case 'xml':\n return Code; // XML icon\n \n case 'env':\n return Key; // Environment file icon\n \n case 'config':\n return Settings; // Config file icon\n \n // Images\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'webp':\n case 'bmp':\n case 'tiff':\n case 'ico':\n return Image; // Image icon\n \n case 'svg':\n return Zap; // SVG icon (special since it's vector)\n \n // Media\n case 'mp4':\n case 'avi':\n case 'mov':\n case 'mkv':\n return Play; // Video icon\n \n case 'mp3':\n case 'wav':\n case 'flac':\n case 'ogg':\n return Music; // Audio icon\n \n // Archives\n case 'zip':\n case 'tar':\n case 'gz':\n case '7z':\n case 'rar':\n return Archive; // Archive icon\n \n // Executables\n case 'exe':\n case 'app':\n case 'deb':\n case 'dmg':\n return Zap; // Executable icon\n \n // Development Tools\n case 'git':\n case 'gitignore':\n return GitBranch; // Git icon\n \n case 'dockerfile':\n return Package; // Docker icon\n \n case 'sql':\n return Database; // Database icon\n \n case 'log':\n return FileText; // Log file icon\n \n // Default file icon (handled by TreeNodeList)\n default:\n return 'file'; // Use default File icon\n }\n }\n} ","/**\n * SimpleTreeProvider - Straightforward implementation for static tree data\n * \n * This provider is designed for simple use cases where you have static\n * tree data that doesn't require complex loading, error simulation, or\n * dynamic generation. It's perfect for:\n * - Static file trees\n * - Simple navigation trees\n * - Documentation structures\n * - Basic hierarchical data display\n */\n\nimport { makeAutoObservable } from 'mobx';\nimport type { TreeProvider, TreeSelectionInfo } from './TreeProvider';\nimport type { TreeNodeData, TreeLoadResult, TreeLoadOptions, TreeContextMenuItem, TreeSelectionTheme } from '../types/TreeTypes';\nimport { DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\n\nexport interface SimpleTreeProviderOptions {\n /** Whether to enable multi-select functionality */\n enableMultiSelect?: boolean;\n /** Whether to enable drag and drop */\n enableDragDrop?: boolean;\n /** Static tree data to display */\n data?: TreeNodeData[];\n /** Custom context menu items */\n contextMenuItems?: TreeContextMenuItem[];\n /** Callback when nodes are selected */\n onSelectionChange?: (selectionInfo: TreeSelectionInfo) => void;\n /** Callback when context menu actions are triggered */\n onContextMenuAction?: (actionId: string, nodes: TreeNodeData[]) => void;\n}\n\nexport class SimpleTreeProvider implements TreeProvider {\n // Provider metadata (required)\n readonly id = 'simple-tree-provider';\n readonly name = 'Simple Tree Provider';\n readonly version = '1.0.0';\n \n // Configuration (required)\n isMultiSelectEnabled = true;\n readonly isDragDropEnabled = false;\n readonly isVirtualizationEnabled = false;\n readonly isTableViewEnabled = false;\n useCheckboxSelection = false;\n readonly allowPartialSelection = true;\n readonly config = {};\n\n // Observable selection theme\n selectionTheme: TreeSelectionTheme = {\n ...DEFAULT_SELECTION_THEME,\n colorScheme: 'primary',\n intensity: 'prominent',\n focusStyle: 'ring',\n animated: true,\n persistSelection: true\n };\n\n // Data\n private nodes: TreeNodeData[] = [];\n private contextMenuItems: TreeContextMenuItem[] = [];\n\n // Callbacks (optional)\n onSelectionChange?: (selectionInfo: TreeSelectionInfo) => void;\n onNodeExpansion?: (node: TreeNodeData, isExpanded: boolean) => void;\n onNodeFocus?: (node: TreeNodeData | null) => void;\n onContextMenuAction?: (actionId: string, nodes: TreeNodeData[]) => void;\n\n constructor(options: SimpleTreeProviderOptions = {}) {\n this.nodes = options.data ?? this.createDefaultData();\n this.contextMenuItems = options.contextMenuItems ?? this.createDefaultContextMenu();\n this.onSelectionChange = options.onSelectionChange;\n this.onContextMenuAction = options.onContextMenuAction;\n makeAutoObservable(this, {\n id: false,\n name: false,\n version: false,\n isDragDropEnabled: false,\n isVirtualizationEnabled: false,\n isTableViewEnabled: false,\n config: false,\n // Make isMultiSelectEnabled and useCheckboxSelection observable\n // isMultiSelectEnabled: true (default - observable)\n // useCheckboxSelection: true (default - observable)\n });\n }\n \n /**\n * Load root nodes\n */\n async loadNodes(options?: TreeLoadOptions): Promise<TreeLoadResult> {\n // Simple provider returns static data immediately\n return {\n nodes: this.nodes,\n hasMore: false,\n totalCount: this.nodes.length\n };\n }\n \n /**\n * Load children for a specific node\n */\n async loadChildren(node: TreeNodeData, options?: TreeLoadOptions): Promise<TreeLoadResult> {\n // Children are already loaded in the static data structure\n const children = node.children || [];\n \n return {\n nodes: children,\n hasMore: false,\n totalCount: children.length\n };\n }\n \n /**\n * Refresh/reload nodes\n */\n async refresh(path?: string): Promise<TreeLoadResult> {\n // For static provider, refresh just returns current data\n if (path) {\n // Find specific node to refresh\n const node = this.findNodeByPath(path);\n if (node) {\n return this.loadChildren(node);\n }\n }\n \n // Refresh all data\n return this.loadNodes();\n }\n \n /**\n * Get context menu for a single node\n */\n getNodeContextMenu(node: TreeNodeData): TreeContextMenuItem[] {\n return this.contextMenuItems.filter(item => {\n // Show different items based on node type\n if (item.id === 'expand' || item.id === 'collapse') {\n return node.hasChildren || (node.children && node.children.length > 0);\n }\n if (item.id === 'open') {\n return node.type === 'file';\n }\n return true; // Show other items for all nodes\n });\n }\n \n /**\n * Get context menu for multiple selected nodes\n */\n getMultiNodeContextMenu(nodes: TreeNodeData[]): TreeContextMenuItem[] {\n return this.contextMenuItems.filter(item => {\n // Only show actions that work on multiple items\n return ['delete', 'copy', 'cut', 'properties'].includes(item.id);\n });\n }\n\n /**\n * Get selection theme configuration\n */\n getSelectionTheme(): TreeSelectionTheme {\n return this.selectionTheme;\n }\n \n /**\n * Update the static data\n */\n setData(data: TreeNodeData[]): void {\n this.nodes = data;\n }\n \n /**\n * Get current data\n */\n getData(): TreeNodeData[] {\n return this.nodes;\n }\n \n /**\n * Add a new node to the tree\n */\n addNode(parentPath: string | null, newNode: TreeNodeData): boolean {\n if (parentPath === null) {\n // Add to root\n this.nodes.push(newNode);\n return true;\n }\n \n // Find parent and add to its children\n const parent = this.findNodeByPath(parentPath);\n if (parent) {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(newNode);\n parent.hasChildren = true;\n return true;\n }\n \n return false;\n }\n \n /**\n * Remove a node from the tree\n */\n removeNode(nodePath: string): boolean {\n // Try to remove from root level\n const rootIndex = this.nodes.findIndex(node => node.path === nodePath);\n if (rootIndex >= 0) {\n this.nodes.splice(rootIndex, 1);\n return true;\n }\n \n // Find and remove from children\n return this.removeNodeFromChildren(this.nodes, nodePath);\n }\n \n /**\n * Find a node by its path\n */\n findNodeByPath(path: string): TreeNodeData | null {\n const searchNodes = (nodes: TreeNodeData[]): TreeNodeData | null => {\n for (const node of nodes) {\n if (node.path === path) {\n return node;\n }\n if (node.children) {\n const found = searchNodes(node.children);\n if (found) return found;\n }\n }\n return null;\n };\n \n return searchNodes(this.nodes);\n }\n \n /**\n * Create default sample data\n */\n private createDefaultData(): TreeNodeData[] {\n return [\n {\n id: 'documents',\n name: 'Documents',\n path: '/documents',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'reports',\n name: 'Reports',\n path: '/documents/reports',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'quarterly-report',\n name: 'Quarterly Report.pdf',\n path: '/documents/reports/quarterly-report.pdf',\n type: 'file',\n size: 1024000,\n lastModified: new Date('2024-01-15')\n },\n {\n id: 'annual-report',\n name: 'Annual Report.pdf',\n path: '/documents/reports/annual-report.pdf',\n type: 'file',\n size: 2048000,\n lastModified: new Date('2024-01-10')\n }\n ]\n },\n {\n id: 'presentations',\n name: 'Presentations',\n path: '/documents/presentations',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'product-demo',\n name: 'Product Demo.pptx',\n path: '/documents/presentations/product-demo.pptx',\n type: 'file',\n size: 5120000,\n lastModified: new Date('2024-01-20')\n }\n ]\n },\n {\n id: 'readme',\n name: 'README.md',\n path: '/documents/readme.md',\n type: 'file',\n size: 2048,\n lastModified: new Date('2024-01-25')\n }\n ]\n },\n {\n id: 'projects',\n name: 'Projects',\n path: '/projects',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'web-app',\n name: 'Web Application',\n path: '/projects/web-app',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'src',\n name: 'src',\n path: '/projects/web-app/src',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'app-ts',\n name: 'app.ts',\n path: '/projects/web-app/src/app.ts',\n type: 'file',\n size: 4096,\n lastModified: new Date('2024-01-24')\n },\n {\n id: 'components',\n name: 'components',\n path: '/projects/web-app/src/components',\n type: 'directory',\n hasChildren: false,\n children: []\n }\n ]\n },\n {\n id: 'package-json',\n name: 'package.json',\n path: '/projects/web-app/package.json',\n type: 'file',\n size: 1024,\n lastModified: new Date('2024-01-23')\n }\n ]\n }\n ]\n },\n {\n id: 'downloads',\n name: 'Downloads',\n path: '/downloads',\n type: 'directory',\n hasChildren: false,\n children: []\n }\n ];\n }\n \n /**\n * Create default context menu items\n */\n private createDefaultContextMenu(): TreeContextMenuItem[] {\n return [\n {\n id: 'open',\n label: 'Open',\n icon: 'file-text',\n handler: (node) => this.onContextMenuAction?.('open', [node])\n },\n {\n id: 'expand',\n label: 'Expand',\n icon: 'chevron-down',\n handler: (node) => this.onContextMenuAction?.('expand', [node])\n },\n {\n id: 'collapse',\n label: 'Collapse', \n icon: 'chevron-right',\n handler: (node) => this.onContextMenuAction?.('collapse', [node])\n },\n { \n id: 'separator-1',\n label: '',\n type: 'separator' \n },\n {\n id: 'copy',\n label: 'Copy',\n icon: 'copy',\n handler: (node) => this.onContextMenuAction?.('copy', [node])\n },\n {\n id: 'cut',\n label: 'Cut',\n icon: 'scissors',\n handler: (node) => this.onContextMenuAction?.('cut', [node])\n },\n {\n id: 'delete',\n label: 'Delete',\n icon: 'trash-2',\n handler: (node) => this.onContextMenuAction?.('delete', [node])\n },\n { \n id: 'separator-2',\n label: '',\n type: 'separator'\n },\n {\n id: 'properties',\n label: 'Properties',\n icon: 'info',\n handler: (node) => this.onContextMenuAction?.('properties', [node])\n }\n ];\n }\n \n /**\n * Helper method to remove node from children recursively\n */\n private removeNodeFromChildren(nodes: TreeNodeData[], targetPath: string): boolean {\n for (const node of nodes) {\n if (node.children) {\n const childIndex = node.children.findIndex(child => child.path === targetPath);\n if (childIndex >= 0) {\n node.children.splice(childIndex, 1);\n node.hasChildren = node.children.length > 0;\n return true;\n }\n \n if (this.removeNodeFromChildren(node.children, targetPath)) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Update selection theme reactively\n */\n updateSelectionTheme = (theme: Partial<TreeSelectionTheme>) => {\n this.selectionTheme = { ...this.selectionTheme, ...theme };\n };\n\n /**\n * Update multi-select setting\n */\n setMultiSelectEnabled = (enabled: boolean) => {\n this.isMultiSelectEnabled = enabled;\n };\n\n /**\n * Update checkbox selection setting\n */\n setCheckboxSelection = (enabled: boolean) => {\n this.useCheckboxSelection = enabled;\n };\n} ","interface LogContext {\n component?: string;\n nodeId?: string;\n operation?: string;\n [key: string]: any;\n}\n\ninterface LogEntry {\n timestamp: string;\n level: 'debug' | 'info' | 'warn' | 'error';\n message: string;\n context?: LogContext;\n data?: any;\n}\n\nclass TreeLogger {\n private isEnabled = true;\n private logs: LogEntry[] = [];\n private maxLogs = 1000;\n\n enable() {\n this.isEnabled = true;\n console.log('🌳 TreeComponent logging enabled');\n }\n\n disable() {\n this.isEnabled = false;\n console.log('🌳 TreeComponent logging disabled');\n }\n\n private log(level: LogEntry['level'], message: string, context?: LogContext, data?: any) {\n if (!this.isEnabled) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n context,\n data\n };\n\n // Store log entry\n this.logs.push(entry);\n if (this.logs.length > this.maxLogs) {\n this.logs.shift();\n }\n\n // Format console output\n const prefix = this.getPrefix(level);\n const contextStr = context ? this.formatContext(context) : '';\n const fullMessage = `${prefix} ${message}${contextStr}`;\n\n // Console output with appropriate level\n switch (level) {\n case 'debug':\n console.debug(fullMessage, data || '');\n break;\n case 'info':\n console.info(fullMessage, data || '');\n break;\n case 'warn':\n console.warn(fullMessage, data || '');\n break;\n case 'error':\n console.error(fullMessage, data || '');\n break;\n }\n }\n\n private getPrefix(level: LogEntry['level']): string {\n const timestamp = new Date().toLocaleTimeString();\n switch (level) {\n case 'debug': return `🔍 [${timestamp}] TreeComponent:`;\n case 'info': return `ℹ️ [${timestamp}] TreeComponent:`;\n case 'warn': return `⚠️ [${timestamp}] TreeComponent:`;\n case 'error': return `❌ [${timestamp}] TreeComponent:`;\n }\n }\n\n private formatContext(context: LogContext): string {\n const parts: string[] = [];\n \n if (context.component) parts.push(`[${context.component}]`);\n if (context.nodeId) parts.push(`(node: ${context.nodeId})`);\n if (context.operation) parts.push(`{${context.operation}}`);\n \n // Add other context properties\n Object.entries(context).forEach(([key, value]) => {\n if (!['component', 'nodeId', 'operation'].includes(key)) {\n parts.push(`${key}=${value}`);\n }\n });\n\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n }\n\n debug(message: string, context?: LogContext, data?: any) {\n this.log('debug', message, context, data);\n }\n\n info(message: string, context?: LogContext, data?: any) {\n this.log('info', message, context, data);\n }\n\n warn(message: string, context?: LogContext, data?: any) {\n this.log('warn', message, context, data);\n }\n\n error(message: string, context?: LogContext, data?: any) {\n this.log('error', message, context, data);\n }\n\n // Specialized logging methods for common TreeComponent operations\n selection(operation: string, nodeId: string, data?: any) {\n this.debug(`Selection ${operation}`, { \n component: 'Selection', \n nodeId, \n operation \n }, data);\n }\n\n expansion(operation: string, nodeId: string, data?: any) {\n this.debug(`Expansion ${operation}`, { \n component: 'Expansion', \n nodeId, \n operation \n }, data);\n }\n\n interaction(operation: string, nodeId: string, data?: any) {\n this.debug(`User interaction: ${operation}`, { \n component: 'Interaction', \n nodeId, \n operation \n }, data);\n }\n\n rendering(component: string, nodeId: string, data?: any) {\n this.debug(`Rendering`, { \n component, \n nodeId, \n operation: 'render' \n }, data);\n }\n\n cssClasses(nodeId: string, classes: string, selected: boolean, focused: boolean) {\n this.debug(`CSS classes applied`, { \n component: 'Styling', \n nodeId,\n selected: selected.toString(),\n focused: focused.toString()\n }, { classes });\n }\n\n providerCall(method: string, data?: any) {\n this.debug(`Provider method called`, { \n component: 'Provider', \n operation: method \n }, data);\n }\n\n stateChange(component: string, property: string, oldValue: any, newValue: any) {\n this.debug(`State change`, { \n component, \n operation: 'state-change',\n property \n }, { oldValue, newValue });\n }\n\n // Get logs for debugging\n getLogs(filter?: { level?: LogEntry['level'], component?: string }): LogEntry[] {\n if (!filter) return [...this.logs];\n \n return this.logs.filter(log => {\n if (filter.level && log.level !== filter.level) return false;\n if (filter.component && log.context?.component !== filter.component) return false;\n return true;\n });\n }\n\n // Clear logs\n clearLogs() {\n this.logs = [];\n console.log('🌳 TreeComponent logs cleared');\n }\n\n // Export logs for analysis\n exportLogs(): string {\n return JSON.stringify(this.logs, null, 2);\n }\n}\n\n// Global logger instance\nexport const logger = new TreeLogger();\n\n// Enable by default in development\nif (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') {\n logger.enable();\n // Make logger available globally for debugging\n (window as any).treeLogger = logger;\n}\n\nexport type { LogContext, LogEntry }; ","/**\n * TreeModel - MobX state management for Tree Component\n * \n * This class manages all tree state including nodes, selection, expansion,\n * and loading states. It follows strict MobX patterns:\n * - Uses makeAutoObservable(this, {}) \n * - Uses observable.map() for reactive collections\n * - Uses composition over inheritance\n * - All async operations use flow\n */\n\nimport { makeAutoObservable, observable, flow } from 'mobx';\nimport type { TreeProvider } from '../providers/TreeProvider';\nimport type { TreeNodeData, TreeLoadOptions } from '../types/TreeTypes';\nimport type { TreeContextMenuItem } from '../types/TreeTypes';\nimport type { CheckboxState } from '../components/TreeCheckbox';\nimport { logger } from '../utils/logger';\n\nexport class TreeModel {\n // Core Data - using observable collections\n nodes: TreeNodeData[] = [];\n nodeMap = observable.map<string, TreeNodeData>();\n \n // Loading State\n isLoading: boolean = false;\n errors = observable.map<string, Error>();\n \n // Selection State - using observable collections\n selectedNodes = observable.map<string, TreeNodeData>();\n focusedNode: string | null = null;\n \n // Checkbox Selection State - for 3-state checkboxes\n checkboxStates = observable.map<string, CheckboxState>();\n \n // Expansion State - using observable collections\n expandedNodes = observable.map<string, boolean>();\n loadingNodes = observable.map<string, boolean>();\n \n // Context menu state\n contextMenuVisible: boolean = false;\n contextMenuPosition: { x: number; y: number } = { x: 0, y: 0 };\n contextMenuItems: TreeContextMenuItem[] = [];\n contextMenuNodes: TreeNodeData[] = [];\n \n constructor(public provider: TreeProvider) {\n makeAutoObservable(this, {\n // Most defaults are correct, empty overrides object\n });\n }\n \n // =====================\n // Computed Properties\n // =====================\n \n /**\n * Whether the tree has any nodes loaded\n */\n get hasNodes(): boolean {\n return this.nodes.length > 0;\n }\n \n /**\n * Total count of nodes currently loaded\n */\n get nodeCount(): number {\n return this.nodes.length;\n }\n \n /**\n * Whether data has been loaded (regardless of success/failure)\n */\n get isLoaded(): boolean {\n return !this.isLoading && (this.hasNodes || this.errors.size > 0);\n }\n \n /**\n * Array of currently selected nodes (computed from selectedNodes map)\n */\n get selectedNodesArray(): TreeNodeData[] {\n return Array.from(this.selectedNodes.values());\n }\n \n /**\n * Whether any nodes are currently selected\n */\n get hasSelection(): boolean {\n return this.selectedNodes.size > 0;\n }\n \n /**\n * Check if a specific node is selected\n */\n isNodeSelected(nodeId: string): boolean {\n return this.selectedNodes.has(nodeId);\n }\n \n /**\n * Check if a specific node is expanded\n */\n isNodeExpanded(nodeId: string): boolean {\n return this.expandedNodes.get(nodeId) ?? false;\n }\n \n /**\n * Check if a specific node is loading\n */\n isNodeLoading(nodeId: string): boolean {\n return this.loadingNodes.get(nodeId) ?? false;\n }\n \n // =====================\n // Async Actions (using flow)\n // =====================\n \n /**\n * Load nodes from the provider\n * Uses MobX flow for proper async action handling\n */\n loadNodes = flow(function* (this: TreeModel, options?: TreeLoadOptions) {\n this.isLoading = true;\n this.errors.clear();\n \n try {\n const result = yield this.provider.loadNodes(options);\n \n // Update nodes and nodeMap\n this.nodes = result.nodes;\n \n // Update node map for fast lookups\n this.nodeMap.clear();\n result.nodes.forEach((node: TreeNodeData) => this.nodeMap.set(node.id, node));\n \n } catch (error) {\n const errorKey = 'loadNodes';\n this.errors.set(errorKey, error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.isLoading = false;\n }\n });\n \n // =====================\n // Selection Actions (placeholder implementations)\n // =====================\n \n /**\n * Select a specific node\n * @param node Node to select\n */\n selectNode(node: TreeNodeData): void {\n const previousSelection = this.selectedNodesArray.map(n => n.id);\n logger.selection('selectNode called', node.id, { \n previouslySelected: previousSelection,\n isMultiSelect: this.provider.isMultiSelectEnabled \n });\n \n // Check if provider allows multi-selection\n if (!this.provider.isMultiSelectEnabled) {\n // Clear existing selection for single-select mode\n logger.selection('clearing selection (single-select mode)', node.id);\n this.selectedNodes.clear();\n }\n \n // Add node to selection\n this.selectedNodes.set(node.id, node);\n logger.selection('node added to selection', node.id, { \n totalSelected: this.selectedNodes.size \n });\n \n // Set focused node\n const previousFocus = this.focusedNode;\n this.focusedNode = node.id;\n logger.stateChange('TreeModel', 'focusedNode', previousFocus, this.focusedNode);\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n logger.providerCall('onSelectionChange', {\n selectedCount: this.selectedNodesArray.length,\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single'\n });\n this.provider.onSelectionChange({\n selectedNodes: this.selectedNodesArray,\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single',\n trigger: 'click'\n });\n }\n }\n \n /**\n * Deselect a specific node\n * @param node Node to deselect\n */\n deselectNode(node: TreeNodeData): void {\n logger.selection('deselectNode called', node.id, { \n wasSelected: this.selectedNodes.has(node.id) \n });\n \n // Remove from selection if present\n if (this.selectedNodes.has(node.id)) {\n this.selectedNodes.delete(node.id);\n logger.selection('node removed from selection', node.id, { \n remainingSelected: this.selectedNodes.size \n });\n \n // Clear focus if this was the focused node\n if (this.focusedNode === node.id) {\n const previousFocus = this.focusedNode;\n this.focusedNode = null;\n logger.stateChange('TreeModel', 'focusedNode', previousFocus, this.focusedNode);\n }\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n logger.providerCall('onSelectionChange', {\n selectedCount: this.selectedNodesArray.length,\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single'\n });\n this.provider.onSelectionChange({\n selectedNodes: this.selectedNodesArray,\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single',\n trigger: 'click'\n });\n }\n }\n }\n \n /**\n * Clear all selected nodes\n */\n clearSelection(): void {\n // Only proceed if there are selected nodes\n if (this.selectedNodes.size > 0) {\n this.selectedNodes.clear();\n this.focusedNode = null;\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n this.provider.onSelectionChange({\n selectedNodes: [],\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single',\n trigger: 'api'\n });\n }\n }\n }\n \n /**\n * Select all nodes (only if multi-select is enabled)\n */\n selectAll(): void {\n if (!this.provider.isMultiSelectEnabled) {\n return; // Not allowed in single-select mode\n }\n \n // Add all nodes to selection\n this.nodes.forEach(node => {\n this.selectedNodes.set(node.id, node);\n });\n \n // Set focus to the first node if any exist\n if (this.nodes.length > 0) {\n const firstNode = this.nodes[0];\n if (firstNode) {\n this.focusedNode = firstNode.id;\n }\n }\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n this.provider.onSelectionChange({\n selectedNodes: this.selectedNodesArray,\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: 'multi',\n trigger: 'api'\n });\n }\n }\n \n // =====================\n // Checkbox Selection Methods\n // =====================\n \n /**\n * Get checkbox state for a specific node\n */\n getCheckboxState(nodeId: string): CheckboxState {\n return this.checkboxStates.get(nodeId) ?? 'unchecked';\n }\n \n /**\n * Handle checkbox click for a node\n */\n handleCheckboxChange(node: TreeNodeData, newState: CheckboxState): void {\n logger.interaction('handleCheckboxChange called', node.id, { \n newState, \n useCheckboxSelection: this.provider.useCheckboxSelection,\n allowPartialSelection: this.provider.allowPartialSelection,\n currentCheckboxState: this.checkboxStates.get(node.id),\n isCurrentlySelected: this.selectedNodes.has(node.id)\n });\n\n if (!this.provider.useCheckboxSelection) {\n logger.interaction('handleCheckboxChange aborted - useCheckboxSelection is false', node.id);\n return;\n }\n \n // Set the state for this node\n const previousState = this.checkboxStates.get(node.id);\n this.checkboxStates.set(node.id, newState);\n \n logger.stateChange('TreeModel', 'checkboxStates', previousState, newState);\n \n // Update selection based on checkbox state\n const wasSelected = this.selectedNodes.has(node.id);\n if (newState === 'checked') {\n this.selectedNodes.set(node.id, node);\n logger.selection('node added via checkbox', node.id, { \n wasSelected, \n nowSelected: true \n });\n } else {\n this.selectedNodes.delete(node.id);\n logger.selection('node removed via checkbox', node.id, { \n wasSelected, \n nowSelected: false \n });\n }\n \n // If partial selection is allowed, update parent/child relationships\n if (this.provider.allowPartialSelection) {\n logger.debug('Updating parent/child checkbox relationships', { \n component: 'Checkbox',\n nodeId: node.id \n });\n this.updateChildCheckboxes(node, newState);\n this.updateParentCheckboxes(node);\n }\n \n // Notify provider of selection change\n if (this.provider.onSelectionChange) {\n const selectionInfo = {\n selectedNodes: this.selectedNodesArray,\n previousSelection: [],\n selectionType: 'multi' as const,\n trigger: 'click' as const\n };\n \n logger.providerCall('onSelectionChange', {\n selectedCount: selectionInfo.selectedNodes.length,\n trigger: selectionInfo.trigger\n });\n \n this.provider.onSelectionChange(selectionInfo);\n }\n }\n \n /**\n * Update all child checkboxes when parent state changes\n */\n private updateChildCheckboxes(node: TreeNodeData, state: CheckboxState): void {\n logger.debug('updateChildCheckboxes called', { \n component: 'Checkbox',\n nodeId: node.id,\n operation: 'update-children'\n }, { \n parentState: state, \n hasChildren: !!node.children,\n childrenCount: node.children?.length || 0 \n });\n\n if (!node.children || state === 'indeterminate') {\n logger.debug('updateChildCheckboxes skipped', { \n component: 'Checkbox',\n nodeId: node.id \n }, { \n reason: !node.children ? 'no-children' : 'indeterminate-state',\n hasChildren: !!node.children,\n state \n });\n return;\n }\n \n node.children.forEach(child => {\n const previousState = this.checkboxStates.get(child.id);\n this.checkboxStates.set(child.id, state);\n \n logger.debug('updateChildCheckboxes - child updated', { \n component: 'Checkbox',\n nodeId: child.id \n }, { \n previousState, \n newState: state,\n parentNode: node.id \n });\n \n // Update selection\n if (state === 'checked') {\n this.selectedNodes.set(child.id, child);\n logger.selection('child selected via parent', child.id, { parentNode: node.id });\n } else {\n this.selectedNodes.delete(child.id);\n logger.selection('child deselected via parent', child.id, { parentNode: node.id });\n }\n \n // Recursively update grandchildren\n this.updateChildCheckboxes(child, state);\n });\n }\n \n /**\n * Update parent checkbox state based on children\n */\n private updateParentCheckboxes(node: TreeNodeData): void {\n const parent = this.findParentNode(node.id);\n \n logger.debug('updateParentCheckboxes called', { \n component: 'Checkbox',\n nodeId: node.id,\n operation: 'update-parent'\n }, { \n parentFound: !!parent,\n parentId: parent?.id \n });\n\n if (!parent || !parent.children) {\n logger.debug('updateParentCheckboxes skipped', { \n component: 'Checkbox',\n nodeId: node.id \n }, { \n reason: !parent ? 'no-parent' : 'parent-no-children' \n });\n return;\n }\n \n const childStates = parent.children.map(child => this.getCheckboxState(child.id));\n const checkedCount = childStates.filter(state => state === 'checked').length;\n const uncheckedCount = childStates.filter(state => state === 'unchecked').length;\n const indeterminateCount = childStates.filter(state => state === 'indeterminate').length;\n \n logger.debug('updateParentCheckboxes - analyzing children', { \n component: 'Checkbox',\n nodeId: parent.id \n }, { \n totalChildren: parent.children.length,\n checkedCount,\n uncheckedCount,\n indeterminateCount,\n childStates \n });\n \n let parentState: CheckboxState;\n \n if (checkedCount === parent.children.length) {\n // All children checked\n parentState = 'checked';\n } else if (checkedCount === 0 && indeterminateCount === 0) {\n // No children checked or indeterminate\n parentState = 'unchecked';\n } else {\n // Some children checked or indeterminate\n parentState = 'indeterminate';\n }\n \n const previousParentState = this.checkboxStates.get(parent.id);\n this.checkboxStates.set(parent.id, parentState);\n \n logger.debug('updateParentCheckboxes - parent state calculated', { \n component: 'Checkbox',\n nodeId: parent.id \n }, { \n previousState: previousParentState,\n newState: parentState,\n logic: checkedCount === parent.children.length ? 'all-checked' :\n (checkedCount === 0 && indeterminateCount === 0) ? 'none-checked' : 'mixed'\n });\n \n // Update selection based on parent state\n if (parentState === 'checked') {\n this.selectedNodes.set(parent.id, parent);\n logger.selection('parent selected via children', parent.id, { newState: parentState });\n } else {\n this.selectedNodes.delete(parent.id);\n logger.selection('parent deselected via children', parent.id, { newState: parentState });\n }\n \n // Recursively update grandparent\n this.updateParentCheckboxes(parent);\n }\n \n /**\n * Find parent node of a given node ID\n */\n private findParentNode(nodeId: string): TreeNodeData | null {\n const findParent = (nodes: TreeNodeData[], targetId: string, parentNode: TreeNodeData | null = null): TreeNodeData | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return parentNode;\n }\n if (node.children && node.children.length > 0) {\n const parent = findParent(node.children, targetId, node);\n if (parent) return parent;\n }\n }\n return null;\n };\n \n return findParent(this.nodes, nodeId);\n }\n \n // =====================\n // Focus Management & Navigation\n // =====================\n\n /**\n * Set focus to a specific node\n * @param nodeId ID of node to focus\n */\n setFocus(nodeId: string): void {\n if (this.nodeMap.has(nodeId)) {\n this.focusedNode = nodeId;\n }\n }\n\n /**\n * Move focus to next visible node\n */\n focusNext(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n const currentIndex = flatNodes.findIndex(node => node.id === this.focusedNode);\n \n if (currentIndex >= 0 && currentIndex < flatNodes.length - 1) {\n const nextNode = flatNodes[currentIndex + 1];\n if (nextNode) {\n this.focusedNode = nextNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to previous visible node\n */\n focusPrevious(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n const currentIndex = flatNodes.findIndex(node => node.id === this.focusedNode);\n \n if (currentIndex > 0) {\n const prevNode = flatNodes[currentIndex - 1];\n if (prevNode) {\n this.focusedNode = prevNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to first visible node\n */\n focusFirst(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n if (flatNodes.length > 0) {\n const firstNode = flatNodes[0];\n if (firstNode) {\n this.focusedNode = firstNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to last visible node\n */\n focusLast(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n if (flatNodes.length > 0) {\n const lastNode = flatNodes[flatNodes.length - 1];\n if (lastNode) {\n this.focusedNode = lastNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get flattened list of all currently visible nodes\n * @private\n */\n private getFlattenedVisibleNodes(): TreeNodeData[] {\n const result: TreeNodeData[] = [];\n \n const processNodes = (nodes: TreeNodeData[]) => {\n for (const node of nodes) {\n result.push(node);\n // Add children if node is expanded\n if (this.isNodeExpanded(node.id) && node.children && node.children.length > 0) {\n processNodes(node.children);\n }\n }\n };\n \n processNodes(this.nodes);\n return result;\n }\n \n // =====================\n // Expansion Actions (placeholder implementations) \n // =====================\n \n /**\n * Expand a specific node\n * @param node Node to expand\n */\n expandNode = flow(function* (this: TreeModel, node: TreeNodeData) {\n logger.expansion('expandNode called', node.id, {\n hasChildren: node.hasChildren,\n currentlyExpanded: this.isNodeExpanded(node.id),\n hasLoadedChildren: !!(node.children && node.children.length > 0)\n });\n\n // Guard: skip if node no longer exists in the tree (stale reference after rename/delete)\n if (!this.nodeMap.has(node.id)) {\n logger.expansion('expandNode skipped - node not in tree', node.id);\n return;\n }\n\n // Set expansion state\n this.expandedNodes.set(node.id, true);\n logger.expansion('expansion state set to true', node.id);\n \n // Notify provider of expansion (if callback exists)\n if (this.provider.onNodeExpansion) {\n logger.providerCall('onNodeExpansion', { nodeId: node.id, expanded: true });\n this.provider.onNodeExpansion(node, true);\n }\n \n // Load children if they haven't been loaded yet\n if (node.hasChildren && (!node.children || node.children.length === 0)) {\n logger.expansion('loading children', node.id, { hasChildren: node.hasChildren });\n this.loadingNodes.set(node.id, true);\n \n try {\n logger.providerCall('loadChildren', { nodeId: node.id });\n const result = yield this.provider.loadChildren(node);\n logger.expansion('children loaded successfully', node.id, { \n childCount: result.nodes.length \n });\n \n // Update the node with children data both in nodeMap and original node\n const existingNode = this.nodeMap.get(node.id);\n if (existingNode) {\n existingNode.children = result.nodes;\n \n // Add children to nodeMap for fast lookups\n result.nodes.forEach((child: TreeNodeData) => {\n this.nodeMap.set(child.id, child);\n });\n }\n \n // Also update the original node object to ensure reactivity\n node.children = result.nodes;\n \n // Update any references to this node in the main nodes array recursively\n const updateNodeInTree = (nodes: TreeNodeData[]): void => {\n for (const treeNode of nodes) {\n if (treeNode.id === node.id) {\n treeNode.children = result.nodes;\n }\n if (treeNode.children) {\n updateNodeInTree(treeNode.children);\n }\n }\n };\n \n updateNodeInTree(this.nodes);\n \n // IMPORTANT: Apply parent's checkbox state to newly loaded children\n if (this.provider.allowPartialSelection && this.provider.useCheckboxSelection) {\n const parentCheckboxState = this.getCheckboxState(node.id);\n \n logger.debug('Applying parent checkbox state to newly loaded children', { \n component: 'Checkbox',\n nodeId: node.id,\n operation: 'children-loaded-inheritance'\n }, { \n parentState: parentCheckboxState,\n childrenCount: result.nodes.length,\n childIds: result.nodes.map((child: TreeNodeData) => child.id)\n });\n \n if (parentCheckboxState === 'checked' || parentCheckboxState === 'unchecked') {\n // Apply parent's state to all newly loaded children\n result.nodes.forEach((child: TreeNodeData) => {\n const previousChildState = this.checkboxStates.get(child.id);\n this.checkboxStates.set(child.id, parentCheckboxState);\n \n logger.debug('Child checkbox state inherited from parent', { \n component: 'Checkbox',\n nodeId: child.id \n }, { \n parentNode: node.id,\n parentState: parentCheckboxState,\n previousChildState,\n newChildState: parentCheckboxState\n });\n \n // Update selection state accordingly\n if (parentCheckboxState === 'checked') {\n this.selectedNodes.set(child.id, child);\n logger.selection('child auto-selected via parent inheritance', child.id, { \n parentNode: node.id \n });\n } else {\n this.selectedNodes.delete(child.id);\n logger.selection('child auto-deselected via parent inheritance', child.id, { \n parentNode: node.id \n });\n }\n \n // Recursively apply to grandchildren if they exist\n if (child.children && child.children.length > 0) {\n this.updateChildCheckboxes(child, parentCheckboxState);\n }\n });\n }\n }\n \n } catch (error) {\n const errorKey = `loadChildren-${node.id}`;\n this.errors.set(errorKey, error instanceof Error ? error : new Error(String(error)));\n \n // Collapse node on error\n this.expandedNodes.set(node.id, false);\n } finally {\n this.loadingNodes.delete(node.id);\n }\n }\n });\n \n /**\n * Collapse a specific node\n * @param node Node to collapse\n */\n collapseNode(node: TreeNodeData): void {\n logger.expansion('collapseNode called', node.id, { \n currentlyExpanded: this.isNodeExpanded(node.id) \n });\n \n // Set collapsed state\n this.expandedNodes.set(node.id, false);\n logger.expansion('expansion state set to false', node.id);\n \n // Notify provider of collapse (if callback exists)\n if (this.provider.onNodeExpansion) {\n logger.providerCall('onNodeExpansion', { nodeId: node.id, expanded: false });\n this.provider.onNodeExpansion(node, false);\n }\n }\n \n /**\n * Toggle expansion state of a specific node\n * @param node Node to toggle\n */\n toggleExpansion(node: TreeNodeData): void {\n if (this.isNodeExpanded(node.id)) {\n this.collapseNode(node);\n } else {\n this.expandNode(node);\n }\n }\n\n // =====================\n // Context Menu Actions\n // =====================\n\n /**\n * Show context menu for a specific node\n * @param node Target node\n * @param event Mouse event\n */\n showContextMenu(node: TreeNodeData, event: MouseEvent): void {\n // Get context menu items from provider\n const menuItems = this.provider.getNodeContextMenu?.(node) || [];\n \n if (menuItems.length === 0) return;\n \n // Set context menu state\n this.contextMenuVisible = true;\n this.contextMenuPosition = { x: event.clientX, y: event.clientY };\n this.contextMenuItems = menuItems;\n this.contextMenuNodes = [node];\n }\n\n /**\n * Show context menu for multiple selected nodes\n * @param nodes Selected nodes\n * @param event Mouse event\n */\n showMultiNodeContextMenu(nodes: TreeNodeData[], event: MouseEvent): void {\n // Get context menu items from provider\n const menuItems = this.provider.getMultiNodeContextMenu?.(nodes) || [];\n \n if (menuItems.length === 0) return;\n \n // Set context menu state\n this.contextMenuVisible = true;\n this.contextMenuPosition = { x: event.clientX, y: event.clientY };\n this.contextMenuItems = menuItems;\n this.contextMenuNodes = nodes;\n }\n\n /**\n * Hide context menu\n */\n hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuItems = [];\n this.contextMenuNodes = [];\n }\n\n /**\n * Handle context menu item click\n * @param menuItem Clicked menu item\n */\n handleContextMenuAction(menuItem: TreeContextMenuItem): void {\n // Call provider callback if available\n if (this.provider.onContextMenuAction) {\n this.provider.onContextMenuAction(menuItem.id, this.contextMenuNodes);\n }\n \n // Hide context menu\n this.hideContextMenu();\n }\n} ","/**\n * TreeCheckbox - 3-state checkbox component for tree selection\n * \n * Supports three states:\n * - unchecked (false): No children selected\n * - checked (true): All children selected \n * - indeterminate (mixed): Some children selected\n */\n\nimport React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Check, Minus } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { logger } from '../utils/logger';\n\nexport type CheckboxState = 'unchecked' | 'checked' | 'indeterminate';\n\nexport interface TreeCheckboxProps {\n /** Current checkbox state */\n state: CheckboxState;\n \n /** Callback when checkbox is clicked */\n onChange: (newState: CheckboxState) => void;\n \n /** Whether the checkbox is disabled */\n disabled?: boolean;\n \n /** Additional CSS classes */\n className?: string;\n \n /** ARIA label for accessibility */\n ariaLabel?: string;\n \n /** Size of the checkbox */\n size?: 'sm' | 'md' | 'lg';\n \n /** Node ID for logging purposes */\n nodeId?: string;\n}\n\n/**\n * TreeCheckbox Component - 3-state checkbox for tree selection\n */\nexport const TreeCheckbox = observer<TreeCheckboxProps>(({\n state,\n onChange,\n disabled = false,\n className,\n ariaLabel,\n size = 'md',\n nodeId = 'unknown'\n}) => {\n logger.rendering('TreeCheckbox', nodeId, { \n state, \n disabled, \n size,\n hasOnChange: !!onChange \n });\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation(); // Prevent node selection\n \n logger.interaction('TreeCheckbox click', nodeId, { \n currentState: state, \n disabled,\n eventType: 'click'\n });\n \n if (disabled) {\n logger.interaction('TreeCheckbox click ignored (disabled)', nodeId);\n return;\n }\n \n // Toggle logic: unchecked -> checked -> unchecked\n // Indeterminate state can only be set programmatically\n const newState = state === 'checked' ? 'unchecked' : 'checked';\n \n logger.interaction('TreeCheckbox state change', nodeId, { \n from: state, \n to: newState,\n trigger: 'click'\n });\n \n onChange(newState);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n \n logger.interaction('TreeCheckbox keydown', nodeId, { \n key: event.key,\n currentState: state \n });\n \n handleClick(event as any);\n }\n };\n\n const sizeClasses = {\n sm: 'w-3 h-3',\n md: 'w-4 h-4', \n lg: 'w-5 h-5'\n };\n\n const iconSizeClasses = {\n sm: 'w-2 h-2',\n md: 'w-3 h-3',\n lg: 'w-4 h-4'\n };\n\n const computedClasses = cn(\n 'flex items-center justify-center rounded border cursor-pointer transition-all',\n 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-1',\n sizeClasses[size],\n // Base styles\n 'border-border bg-background',\n // State-specific styles\n state === 'checked' && 'bg-primary border-primary text-primary-foreground',\n state === 'indeterminate' && 'bg-primary border-primary text-primary-foreground',\n state === 'unchecked' && 'hover:border-primary/50',\n // Disabled styles\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none',\n className\n );\n\n logger.cssClasses(`TreeCheckbox-${nodeId}`, computedClasses, state === 'checked', false);\n\n return (\n <div\n role=\"checkbox\"\n aria-checked={state === 'indeterminate' ? 'mixed' : state === 'checked'}\n aria-label={ariaLabel}\n className={computedClasses}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : 0}\n >\n {state === 'checked' && (\n <Check className={cn(iconSizeClasses[size], 'stroke-[3]')} />\n )}\n {state === 'indeterminate' && (\n <Minus className={cn(iconSizeClasses[size], 'stroke-[3]')} />\n )}\n </div>\n );\n}); ","/**\n * TreeNodeList - Recursive component for rendering tree node lists\n * \n * This component handles the recursive rendering of tree nodes and their children,\n * providing proper indentation and hierarchy visualization.\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { ChevronRight, ChevronDown, Loader2, MoreVertical } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { resolveIcon } from '../../icons/iconMap';\nimport { TreeCheckbox } from './TreeCheckbox';\nimport { getSelectionClasses, getCustomColorVariables, DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\nimport type { TreeNodeData } from '../types/TreeTypes';\nimport type { TreeModel } from '../models/TreeModel';\nimport { logger } from '../utils/logger';\nimport { useFileBrowserContext } from '../../file-browser/context/FileBrowserContext';\n\n// Inline rename input for tree nodes\nconst TreeInlineRename: React.FC<{\n currentName: string;\n onCommit: (newName: string) => void;\n onCancel: () => void;\n}> = ({ currentName, onCommit, onCancel }) => {\n const [value, setValue] = useState(currentName);\n const inputRef = useRef<HTMLInputElement>(null);\n const mountTimeRef = useRef(Date.now());\n const committedRef = useRef(false);\n\n useEffect(() => {\n mountTimeRef.current = Date.now();\n const raf = requestAnimationFrame(() => {\n const input = inputRef.current;\n if (input) {\n input.focus();\n const dotIndex = currentName.lastIndexOf('.');\n input.setSelectionRange(0, dotIndex > 0 ? dotIndex : currentName.length);\n }\n });\n return () => cancelAnimationFrame(raf);\n }, [currentName]);\n\n const commit = () => {\n if (committedRef.current) return;\n committedRef.current = true;\n const trimmed = value.trim();\n if (trimmed && trimmed !== currentName) {\n onCommit(trimmed);\n } else {\n onCancel();\n }\n };\n\n const handleBlur = () => {\n if (Date.now() - mountTimeRef.current < 200) return;\n commit();\n };\n\n return (\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') { e.preventDefault(); commit(); }\n if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n onBlur={handleBlur}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n className=\"flex-1 bg-background border border-primary rounded px-1 py-0 text-[13px] outline-none min-w-0\"\n />\n );\n};\n\nexport interface TreeNodeListProps {\n /** Tree nodes to render */\n nodes: TreeNodeData[];\n /** Tree model instance */\n treeModel: TreeModel;\n /** Current depth level (for indentation) */\n depth?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * TreeNodeList component renders a list of tree nodes with proper nesting and interaction\n */\nexport const TreeNodeList = observer<TreeNodeListProps>(({\n nodes,\n treeModel,\n depth = 0,\n className\n}) => {\n const fileBrowserCtx = useFileBrowserContext();\n\n const renderNode = (node: TreeNodeData) => {\n const isSelected = treeModel.isNodeSelected(node.id);\n const isExpanded = treeModel.isNodeExpanded(node.id);\n const isFocused = treeModel.focusedNode === node.id;\n const isLoading = treeModel.isNodeLoading(node.id);\n const isDirectory = node.type === 'directory';\n const hasChildren = node.hasChildren || (node.children && node.children.length > 0);\n const showCheckbox = treeModel.provider.useCheckboxSelection;\n const [isHovered, setIsHovered] = useState(false);\n const isRenaming = fileBrowserCtx?.renameState?.itemId === node.id && fileBrowserCtx?.renameState?.source === 'tree';\n\n // Get selection theme\n const selectionTheme = treeModel.provider.getSelectionTheme?.() || DEFAULT_SELECTION_THEME;\n\n const nodeClasses = cn(\n // Base styles\n 'group flex items-center gap-2 py-1 px-2 text-[13px] cursor-default select-none transition-colors duration-150',\n 'focus:outline-none',\n\n // Selection styling - must come before hover so selected state is visible\n isSelected\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-muted/50',\n\n // Focus styles\n isFocused && !isSelected && 'ring-1 ring-primary/50',\n );\n\n // Handle node click\n const handleNodeClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n logger.interaction('TreeNode clicked', node.id, { name: node.name });\n \n if (event.ctrlKey || event.metaKey) {\n // Multi-select with Ctrl/Cmd\n if (treeModel.provider.isMultiSelectEnabled) {\n if (isSelected) {\n treeModel.deselectNode(node);\n } else {\n treeModel.selectNode(node);\n }\n }\n } else {\n // Single select\n if (!isSelected) {\n treeModel.selectNode(node);\n }\n }\n };\n\n // Handle expand/collapse click\n const handleExpandClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n logger.interaction('TreeNode expand/collapse clicked', node.id, { name: node.name });\n \n if (hasChildren) {\n treeModel.toggleExpansion(node);\n }\n };\n\n // Handle context menu (right-click)\n const handleContextMenu = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n logger.interaction('TreeNode context menu', node.id, { name: node.name });\n \n // Don't change selection on right-click, but ensure we show menu for this node\n if (!isSelected && treeModel.selectedNodesArray.length <= 1) {\n treeModel.selectNode(node);\n }\n \n // Show context menu at cursor position\n const rect = { x: event.clientX, y: event.clientY };\n \n // Check if this node is part of a multi-selection\n const selectedNodes = treeModel.selectedNodesArray;\n if (selectedNodes.length > 1 && isSelected) {\n treeModel.showMultiNodeContextMenu(selectedNodes, event.nativeEvent);\n } else {\n treeModel.showContextMenu(node, event.nativeEvent);\n }\n };\n\n // Handle menu button click - shows context menu without changing selection\n const handleMenuButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n logger.interaction('TreeNode menu button clicked', node.id, { name: node.name });\n\n // Show context menu positioned near the button\n const rect = event.currentTarget.getBoundingClientRect();\n const fakeEvent = new MouseEvent('contextmenu', {\n clientX: rect.right - 10,\n clientY: rect.bottom,\n bubbles: true,\n cancelable: true\n });\n\n // If this node is part of a multi-selection, show multi-menu\n const selectedNodes = treeModel.selectedNodesArray;\n if (selectedNodes.length > 1 && isSelected) {\n treeModel.showMultiNodeContextMenu(selectedNodes, fakeEvent);\n } else {\n // Show menu for this specific node without changing selection\n treeModel.showContextMenu(node, fakeEvent);\n }\n };\n\n const iconSize = 'w-4 h-4';\n\n // Get custom icon from provider\n const renderIcon = () => {\n // Try to get custom icon from provider first\n const customIcon = treeModel.provider.getNodeIcon?.(node);\n if (customIcon) {\n if (typeof customIcon === 'string') {\n return resolveIcon(customIcon, iconSize);\n } else {\n const IconComponent = customIcon;\n return <IconComponent className={iconSize} />;\n }\n }\n\n // Default icons via shared icon map\n if (isDirectory) {\n return resolveIcon(isExpanded ? 'folder-open' : 'folder', iconSize);\n } else {\n return resolveIcon('file', iconSize);\n }\n };\n\n return (\n <div key={node.id} className=\"w-full\">\n {/* Node */}\n <div\n className={nodeClasses}\n style={{ paddingLeft: `${depth * 20 + 8}px` }}\n onClick={handleNodeClick}\n onContextMenu={handleContextMenu}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={isFocused ? 0 : -1}\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-level={depth + 1}\n aria-label={`${node.type === 'directory' ? 'Folder' : 'File'}: ${node.name}`}\n >\n {/* Expand/Collapse Button */}\n <div className=\"flex-shrink-0 w-4 h-4\">\n {hasChildren && (\n <button\n className=\"w-4 h-4 flex items-center justify-center hover:bg-muted rounded-sm transition-colors\"\n onClick={handleExpandClick}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n >\n {isLoading ? (\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n ) : isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </div>\n\n {/* Checkbox (if enabled) */}\n {showCheckbox && (\n <TreeCheckbox\n state={treeModel.getCheckboxState(node.id)}\n onChange={(newState) => {\n logger.interaction('TreeCheckbox changed', node.id, { name: node.name, newState });\n treeModel.handleCheckboxChange(node, newState);\n }}\n nodeId={node.id}\n />\n )}\n\n {/* Icon */}\n <div className=\"flex-shrink-0 w-4 h-4\">\n {renderIcon()}\n </div>\n\n {/* Node Name */}\n {isRenaming && fileBrowserCtx ? (\n <TreeInlineRename\n currentName={fileBrowserCtx.renameState!.currentName}\n onCommit={fileBrowserCtx.onRenameCommit}\n onCancel={fileBrowserCtx.onRenameCancel}\n />\n ) : (\n <span className=\"flex-1 truncate\">\n {node.name}\n </span>\n )}\n\n {/* Menu Button - positioned on the right */}\n <button\n className={cn(\n 'flex-shrink-0 w-6 h-6 flex items-center justify-center rounded hover:bg-muted/70 transition-colors cursor-pointer',\n // Show on hover or when node is selected\n 'opacity-0 group-hover:opacity-100',\n (isSelected || isHovered) && 'opacity-100'\n )}\n onClick={handleMenuButtonClick}\n aria-label=\"Show context menu\"\n >\n <MoreVertical className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Children */}\n {isExpanded && hasChildren && node.children && (\n <TreeNodeList\n nodes={node.children}\n treeModel={treeModel}\n depth={depth + 1}\n className={className}\n />\n )}\n </div>\n );\n };\n\n return (\n <div className={cn('w-full', className)}>\n {nodes.map(renderNode)}\n </div>\n );\n});\n","import React, { useEffect, useRef } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { TreeContextMenuItem } from '../types/TreeTypes';\n\n/**\n * Props for the TreeContextMenu component\n */\nexport interface TreeContextMenuProps {\n /**\n * Menu items to display\n */\n items: TreeContextMenuItem[];\n \n /**\n * Position of the context menu\n */\n position: { x: number; y: number };\n \n /**\n * Whether the menu is visible\n */\n visible: boolean;\n \n /**\n * Callback when menu is closed\n */\n onClose: () => void;\n \n /**\n * Callback when menu item is clicked\n */\n onItemClick: (menuItem: TreeContextMenuItem) => void;\n \n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * TreeContextMenu - Context menu component for tree nodes\n * \n * Features:\n * - Renders context menu items with proper styling (no icons)\n * - Handles click outside to close\n * - Supports separators and disabled items\n * - Positioned absolutely at cursor position\n * - Keyboard navigation support\n */\nexport const TreeContextMenu = observer<TreeContextMenuProps>(({\n items,\n position,\n visible,\n onClose,\n onItemClick,\n className = ''\n}) => {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Handle click outside to close menu\n useEffect(() => {\n if (!visible) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n onClose();\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [visible, onClose]);\n\n const handleItemClick = (item: TreeContextMenuItem, event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (item.disabled) return;\n\n onItemClick(item);\n onClose();\n };\n\n if (!visible) return null;\n\n return (\n <div\n ref={menuRef}\n className={`\n bg-popover text-popover-foreground rounded-md border p-1 shadow-md min-w-[160px]\n fixed z-[100]\n ${className}\n `}\n style={{\n left: position.x,\n top: position.y,\n }}\n role=\"menu\"\n aria-label=\"Context menu\"\n >\n {items.map((item, index) => (\n <React.Fragment key={item.id}>\n <div\n className={`\n px-2 py-1.5 text-sm cursor-default hover:bg-accent hover:text-accent-foreground\n flex items-center rounded-sm transition-colors duration-150\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n onClick={(e) => handleItemClick(item, e)}\n role=\"menuitem\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n >\n <span className=\"flex-1\">{item.label}</span>\n </div>\n \n {item.separator && index < items.length - 1 && (\n <div className=\"h-px bg-border my-1\" role=\"separator\" />\n )}\n </React.Fragment>\n ))}\n </div>\n );\n});\n\nTreeContextMenu.displayName = 'TreeContextMenu';\n\nexport default TreeContextMenu; ","/**\n * Tree - Main tree component that renders nodes and manages UI states\n * \n * This component follows the observer pattern to react to TreeModel changes.\n * It handles loading states, errors, and renders the tree structure.\n */\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { TreeModel } from '../models/TreeModel';\nimport { TreeNodeList } from './TreeNodeList';\nimport { TreeContextMenu } from './TreeContextMenu';\nimport type { TreeProvider } from '../providers/TreeProvider';\nimport type { TreeLoadOptions, TreeNodeData } from '../types/TreeTypes';\n\nexport interface TreeProps {\n /** Provider that supplies tree data and operations */\n provider: TreeProvider;\n\n /** Optional pre-created TreeModel (if provided, component won't create its own) */\n model?: TreeModel;\n\n /** Optional loading options to pass to the provider */\n loadOptions?: TreeLoadOptions;\n\n /** Additional CSS classes to apply to the tree container */\n className?: string;\n}\n\n/**\n * Tree Component - Reactive tree display with loading states\n *\n * This is the main tree component that:\n * - Creates and manages TreeModel\n * - Shows loading/error states\n * - Renders tree nodes\n * - Follows MobX observer pattern for reactivity\n * - Handles keyboard navigation\n */\nexport const Tree = observer<TreeProps>(({ provider, model, loadOptions, className }) => {\n const [internalModel] = useState(() => model || new TreeModel(provider));\n const treeModel = model || internalModel;\n const treeRef = useRef<HTMLDivElement>(null);\n\n // Load data on mount and when loadOptions change (only if using internal model)\n useEffect(() => {\n if (!model) {\n treeModel.loadNodes(loadOptions);\n }\n }, [treeModel, loadOptions, model]);\n\n // Get flattened list of all visible nodes for navigation\n const getFlattenedNodes = (): TreeNodeData[] => {\n const result: TreeNodeData[] = [];\n \n const processNodes = (nodes: TreeNodeData[]) => {\n for (const node of nodes) {\n result.push(node);\n // Add children if node is expanded\n if (treeModel.isNodeExpanded(node.id) && node.children && node.children.length > 0) {\n processNodes(node.children);\n }\n }\n };\n \n processNodes(treeModel.nodes);\n return result;\n };\n\n // Navigate to node by index in flattened list\n const navigateToNode = (targetIndex: number) => {\n const flatNodes = getFlattenedNodes();\n if (targetIndex >= 0 && targetIndex < flatNodes.length) {\n const targetNode = flatNodes[targetIndex];\n if (targetNode) {\n treeModel.focusedNode = targetNode.id;\n // Also select the node (following common tree behavior)\n treeModel.selectNode(targetNode);\n }\n }\n };\n\n // Find current focused node index\n const getCurrentNodeIndex = (): number => {\n if (!treeModel.focusedNode) return -1;\n const flatNodes = getFlattenedNodes();\n return flatNodes.findIndex(node => node.id === treeModel.focusedNode);\n };\n\n // Get parent node of current focused node\n const getParentNode = (nodeId: string): TreeNodeData | null => {\n const findParent = (nodes: TreeNodeData[], targetId: string, parentNode: TreeNodeData | null = null): TreeNodeData | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return parentNode;\n }\n if (node.children && node.children.length > 0) {\n const parent = findParent(node.children, targetId, node);\n if (parent) return parent;\n }\n }\n return null;\n };\n \n return findParent(treeModel.nodes, nodeId);\n };\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n // Only handle if tree is focused or if we have a focused node\n if (!treeRef.current?.contains(document.activeElement) && !treeModel.focusedNode) {\n return;\n }\n\n const currentIndex = getCurrentNodeIndex();\n const flatNodes = getFlattenedNodes();\n const currentNode = treeModel.focusedNode ? treeModel.nodeMap.get(treeModel.focusedNode) : null;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (currentIndex < flatNodes.length - 1) {\n navigateToNode(currentIndex + 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (currentIndex > 0) {\n navigateToNode(currentIndex - 1);\n }\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n if (currentNode) {\n if (currentNode.hasChildren || (currentNode.children && currentNode.children.length > 0)) {\n if (!treeModel.isNodeExpanded(currentNode.id)) {\n // Expand the node\n treeModel.expandNode(currentNode);\n } else if (currentNode.children && currentNode.children.length > 0) {\n // Move to first child\n const firstChild = currentNode.children[0];\n if (firstChild) {\n treeModel.focusedNode = firstChild.id;\n treeModel.selectNode(firstChild);\n }\n }\n }\n }\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n if (currentNode) {\n if (treeModel.isNodeExpanded(currentNode.id) && (currentNode.hasChildren || (currentNode.children && currentNode.children.length > 0))) {\n // Collapse the node\n treeModel.collapseNode(currentNode);\n } else {\n // Move to parent node\n const parentNode = getParentNode(currentNode.id);\n if (parentNode) {\n treeModel.focusedNode = parentNode.id;\n treeModel.selectNode(parentNode);\n }\n }\n }\n break;\n\n case 'Home':\n event.preventDefault();\n if (flatNodes.length > 0) {\n navigateToNode(0);\n }\n break;\n\n case 'End':\n event.preventDefault();\n if (flatNodes.length > 0) {\n navigateToNode(flatNodes.length - 1);\n }\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (currentNode) {\n if (currentNode.hasChildren || (currentNode.children && currentNode.children.length > 0)) {\n treeModel.toggleExpansion(currentNode);\n }\n }\n break;\n\n case 'a':\n // Ctrl+A or Cmd+A to select all (when multi-select is enabled)\n if ((event.ctrlKey || event.metaKey) && treeModel.provider.isMultiSelectEnabled) {\n event.preventDefault();\n treeModel.selectAll();\n }\n break;\n \n case 'Escape':\n event.preventDefault();\n treeModel.clearSelection();\n treeModel.hideContextMenu();\n break;\n\n default:\n // Let other keys pass through\n break;\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [treeModel]);\n\n // Auto-focus first node if no node is focused and we have nodes\n useEffect(() => {\n if (!treeModel.focusedNode && treeModel.hasNodes && treeModel.nodes.length > 0) {\n const firstNode = treeModel.nodes[0];\n if (firstNode) {\n treeModel.focusedNode = firstNode.id;\n }\n }\n }, [treeModel.hasNodes, treeModel.nodes.length, treeModel.focusedNode]);\n \n return (\n <div \n ref={treeRef}\n className={`h-full overflow-hidden focus-within:outline-none ${className || ''}`}\n tabIndex={0}\n role=\"tree\"\n aria-label=\"File tree\"\n >\n {treeModel.isLoading && (\n <div className=\"p-4 text-center text-muted-foreground\" role=\"status\" aria-live=\"polite\">\n <div className=\"inline-flex items-center gap-2\">\n <div className=\"w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin\" />\n <span>Loading tree...</span>\n </div>\n </div>\n )}\n \n {!treeModel.isLoading && treeModel.errors.size > 0 && (\n <div className=\"p-4 text-red-600 bg-red-50 border-l-4 border-red-400\" role=\"alert\">\n {Array.from(treeModel.errors.entries()).map(([key, error]) => (\n <div key={key} className=\"flex items-start gap-2\">\n <span className=\"font-semibold\">Error:</span>\n <span>{error.message}</span>\n </div>\n ))}\n </div>\n )}\n \n {!treeModel.isLoading && treeModel.errors.size === 0 && !treeModel.hasNodes && (\n <div className=\"p-4 text-center text-muted-foreground\" role=\"status\">\n <span>No items to display</span>\n </div>\n )}\n \n {!treeModel.isLoading && treeModel.hasNodes && (\n <div className=\"h-full overflow-auto\">\n <TreeNodeList \n treeModel={treeModel}\n nodes={treeModel.nodes}\n depth={0}\n />\n </div>\n )}\n \n {/* Context Menu */}\n <TreeContextMenu\n items={treeModel.contextMenuItems}\n position={treeModel.contextMenuPosition}\n visible={treeModel.contextMenuVisible}\n onClose={() => treeModel.hideContextMenu()}\n onItemClick={(menuItem) => treeModel.handleContextMenuAction(menuItem)}\n />\n </div>\n );\n}); ","/**\n * TreeTable - Table component for displaying tree data in tabular format\n * \n * Provides a table view of tree data with:\n * - Hierarchical indentation in tree column\n * - Sortable columns\n * - Filterable columns \n * - Export functionality\n * - Expand/collapse support\n * - Selection support\n */\n\nimport React, { useMemo, useCallback, useState } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { ChevronRight, ChevronDown, ArrowUp, ArrowDown, ArrowUpDown, Download, Search } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { getSelectionClasses, getCustomColorVariables, DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\nimport type { TreeModel } from '../models/TreeModel';\nimport type { TreeTableColumn, TreeNodeData } from '../types/TreeTypes';\n\nexport interface TreeTableProps {\n /** The tree model managing state */\n treeModel: TreeModel;\n \n /** Table columns configuration */\n columns?: TreeTableColumn[];\n \n /** Enable animations for expand/collapse transitions */\n enableAnimations?: boolean;\n \n /** Additional CSS classes */\n className?: string;\n \n /** Whether to show export functionality */\n enableExport?: boolean;\n \n /** Whether to enable filtering */\n enableFiltering?: boolean;\n \n /** Whether to enable sorting */\n enableSorting?: boolean;\n}\n\n/**\n * TreeTable Component - Table view of tree data\n */\nexport const TreeTable = observer<TreeTableProps>(({\n treeModel,\n columns: propColumns,\n enableAnimations = true,\n className,\n enableExport = true,\n enableFiltering = false,\n enableSorting = true\n}) => {\n const [sortColumn, setSortColumn] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n const [filters, setFilters] = useState<Record<string, string>>({});\n \n // Default columns if none provided\n const defaultColumns: TreeTableColumn[] = useMemo(() => [\n {\n id: 'name',\n label: 'Name',\n dataKey: 'name',\n width: '100%',\n sortable: true,\n filterable: true,\n isTreeColumn: true\n }\n ], []);\n \n const columns = propColumns || defaultColumns;\n const isHeaderVisible = columns.length > 1 || enableFiltering || enableExport;\n \n // Flatten the tree into a list for table rendering\n const tableData = useMemo(() => {\n const flattenNode = (node: TreeNodeData, level: number = 0): Array<{ node: TreeNodeData; level: number }> => {\n const result = [{ node, level }];\n \n if (treeModel.isNodeExpanded(node.id) && node.children) {\n for (const child of node.children) {\n result.push(...flattenNode(child, level + 1));\n }\n }\n \n return result;\n };\n \n let data: Array<{ node: TreeNodeData; level: number }> = [];\n const rootNodes = treeModel.nodes;\n \n for (const node of rootNodes) {\n data.push(...flattenNode(node));\n }\n \n // Apply filters\n if (Object.values(filters).some(f => f.trim())) {\n data = data.filter(({ node }) => {\n return Object.entries(filters).every(([columnKey, filterValue]) => {\n if (!filterValue.trim()) return true;\n \n const column = columns.find(c => c.id === columnKey);\n if (!column) return true;\n \n let cellValue = '';\n if (column.renderCell) {\n // If custom renderer, use it to get the text value\n const rendered = column.renderCell((node as any)[column.dataKey], node);\n cellValue = typeof rendered === 'string' ? rendered : String(rendered || '');\n } else if (column.formatValue) {\n cellValue = column.formatValue((node as any)[column.dataKey], node);\n } else {\n cellValue = (node as any)[column.dataKey]?.toString() || '';\n }\n \n return cellValue.toLowerCase().includes(filterValue.toLowerCase());\n });\n });\n }\n \n // Apply sorting\n if (sortColumn) {\n const column = columns.find(c => c.id === sortColumn);\n if (column) {\n data.sort((a, b) => {\n let aValue = '';\n let bValue = '';\n \n if (column.formatValue) {\n aValue = column.formatValue((a.node as any)[column.dataKey], a.node);\n bValue = column.formatValue((b.node as any)[column.dataKey], b.node);\n } else {\n aValue = (a.node as any)[column.dataKey]?.toString() || '';\n bValue = (b.node as any)[column.dataKey]?.toString() || '';\n }\n \n const compareResult = aValue.localeCompare(bValue);\n return sortDirection === 'asc' ? compareResult : -compareResult;\n });\n }\n }\n \n return data;\n }, [treeModel.nodes, sortColumn, sortDirection, filters, columns, treeModel]);\n \n const handleSort = useCallback((columnKey: string) => {\n if (sortColumn === columnKey) {\n setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');\n } else {\n setSortColumn(columnKey);\n setSortDirection('asc');\n }\n }, [sortColumn]);\n \n const handleExport = useCallback(() => {\n const csvContent = [\n // Header\n columns.map(col => col.label).join(','),\n // Rows\n ...tableData.map(({ node }) => \n columns.map(col => {\n let value = '';\n if (col.formatValue) {\n value = col.formatValue((node as any)[col.dataKey], node);\n } else {\n value = (node as any)[col.dataKey]?.toString() || '';\n }\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }).join(',')\n )\n ].join('\\n');\n \n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = 'tree-data.csv';\n link.click();\n }, [tableData, columns]);\n\n const selectionTheme = treeModel.provider.getSelectionTheme?.() || DEFAULT_SELECTION_THEME;\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header with controls */}\n {isHeaderVisible && (\n <div className=\"flex-shrink-0 p-3 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2\">\n {enableFiltering && (\n <div className=\"flex items-center gap-2\">\n <Search className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Filter:</span>\n {columns.filter(c => c.filterable).map(column => (\n <input\n key={column.id}\n type=\"text\"\n placeholder={`Filter ${column.label}`}\n value={filters[column.id] || ''}\n onChange={(e) => setFilters(prev => ({ ...prev, [column.id]: e.target.value }))}\n className=\"px-2 py-1 text-sm border rounded-md w-32\"\n />\n ))}\n </div>\n )}\n </div>\n \n {enableExport && (\n <button\n onClick={handleExport}\n className=\"flex items-center gap-2 px-3 py-1 text-sm bg-primary text-primary-foreground rounded-md hover:bg-primary/90\"\n >\n <Download className=\"w-4 h-4\" />\n Export CSV\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Table content */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"min-w-full\">\n {/* Column headers - only show if more than one column */}\n {columns.length > 1 && (\n <div className=\"sticky top-0 bg-background border-b z-10\">\n <div className=\"flex\">\n {columns.map((column) => (\n <div\n key={column.id}\n className={cn(\n 'px-2 py-2 text-sm font-medium text-muted-foreground',\n column.sortable && enableSorting && 'cursor-pointer hover:text-foreground',\n 'flex items-center gap-1'\n )}\n style={{ width: column.width }}\n onClick={() => column.sortable && enableSorting && handleSort(column.id)}\n >\n <span>{column.label}</span>\n {column.sortable && enableSorting && (\n <div className=\"ml-auto\">\n {sortColumn === column.id ? (\n sortDirection === 'asc' ? (\n <ArrowUp className=\"w-3 h-3\" />\n ) : (\n <ArrowDown className=\"w-3 h-3\" />\n )\n ) : (\n <ArrowUpDown className=\"w-3 h-3 opacity-50\" />\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Rows */}\n <div>\n {tableData.length === 0 ? (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {Object.values(filters).some(f => f.trim()) ? 'No results found for current filters' : 'No data available'}\n </p>\n </div>\n ) : (\n tableData.map(({ node, level }) => {\n const isSelected = treeModel.isNodeSelected(node.id);\n const isFocused = treeModel.focusedNode === node.id;\n const isExpanded = treeModel.isNodeExpanded(node.id);\n const hasChildren = node.hasChildren || (node.children && node.children.length > 0);\n const useCheckboxes = treeModel.provider.useCheckboxSelection;\n const customColorVars = getCustomColorVariables(selectionTheme);\n\n return (\n <div\n key={node.id}\n className={cn(\n 'flex w-full cursor-pointer group',\n getSelectionClasses(selectionTheme, isSelected, isFocused, !!useCheckboxes),\n useCheckboxes && 'select-none'\n )}\n style={customColorVars}\n onClick={(event) => {\n if (useCheckboxes) return;\n \n const isMultiSelectKeyPressed = event.ctrlKey || event.metaKey;\n \n if (treeModel.provider.isMultiSelectEnabled && isMultiSelectKeyPressed) {\n // Toggle selection for multi-select mode with Ctrl/Cmd\n if (isSelected) {\n treeModel.deselectNode(node);\n } else {\n treeModel.selectNode(node);\n }\n } else {\n // Single click without modifier\n if (treeModel.provider.isMultiSelectEnabled) {\n // In multi-select mode, single click replaces selection\n treeModel.clearSelection();\n treeModel.selectNode(node);\n } else {\n // In single-select mode, toggle selection\n if (isSelected) {\n treeModel.clearSelection();\n } else {\n treeModel.selectNode(node);\n }\n }\n }\n }}\n onDoubleClick={() => hasChildren && treeModel.toggleExpansion(node)}\n >\n {columns.map((column, columnIndex) => {\n let cellContent: React.ReactNode = '';\n \n if (column.renderCell) {\n cellContent = column.renderCell((node as any)[column.dataKey], node);\n } else if (column.formatValue) {\n cellContent = column.formatValue((node as any)[column.dataKey], node);\n } else {\n cellContent = (node as any)[column.dataKey]?.toString() || '';\n }\n\n // For tree column, add indentation and controls\n if (column.isTreeColumn) {\n return (\n <div\n key={column.id}\n className=\"flex items-center px-2 py-1 text-sm\"\n style={{ width: column.width }}\n >\n {/* Indentation */}\n <div style={{ width: level * 16 }} className=\"flex-shrink-0\" />\n\n {/* Expand/Collapse Icon */}\n <div className=\"flex-shrink-0 w-4 h-4 mr-1\">\n {hasChildren && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n treeModel.toggleExpansion(node);\n }}\n className=\"w-4 h-4 flex items-center justify-center transition-transform duration-200 hover:bg-accent/20\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </div>\n\n {/* Content */}\n <span className=\"flex-1 truncate\">{cellContent}</span>\n </div>\n );\n }\n\n // Regular column\n return (\n <div\n key={column.id}\n className=\"px-2 py-1 text-sm truncate\"\n style={{ width: column.width }}\n >\n {cellContent}\n </div>\n );\n })}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}); "],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree-B9VQcKBp.js","names":["DEFAULT_SELECTION_THEME: TreeSelectionTheme","colorScheme: SelectionColorScheme","intensity: SelectionIntensity","focusStyle: FocusIndicatorStyle","theme: TreeSelectionTheme","isSelected: boolean","isFocused: boolean","useCheckboxes: boolean","theme: Partial<TreeSelectionTheme>","enabled: boolean","options?: TreeLoadOptions","node: TreeNodeData","path?: string","baseItems: TreeContextMenuItem[]","nodes: TreeNodeData[]","menuItemId: string","value: string","value: number","value: Date","sort: TreeTableSort | null","options: TreeTableExportOptions","parentPath: string","depth: number","fileType: string","index: number","fileNames: Record<string, string[]>","folderType: string","descriptions: Record<string, string>","categories: Record<string, string>","options: SimpleTreeProviderOptions","theme: Partial<TreeSelectionTheme>","enabled: boolean","options?: TreeLoadOptions","node: TreeNodeData","path?: string","nodes: TreeNodeData[]","data: TreeNodeData[]","parentPath: string | null","newNode: TreeNodeData","nodePath: string","path: string","targetPath: string","level: LogEntry['level']","message: string","context?: LogContext","data?: any","entry: LogEntry","context: LogContext","parts: string[]","operation: string","nodeId: string","component: string","classes: string","selected: boolean","focused: boolean","method: string","property: string","oldValue: any","newValue: any","filter?: { level?: LogEntry['level'], component?: string }","provider: TreeProvider","options?: TreeLoadOptions","node: TreeNodeData","child: TreeNodeData","nodes: TreeNodeData[]","nodeId: string","newState: CheckboxState","state: CheckboxState","parentState: CheckboxState","targetId: string","parentNode: TreeNodeData | null","result: TreeNodeData[]","event: MouseEvent","menuItem: TreeContextMenuItem","event: React.MouseEvent","event: React.KeyboardEvent","TreeInlineRename: React.FC<{\n currentName: string;\n onCommit: (newName: string) => void;\n onCancel: () => void;\n}>","node: TreeNodeData","event: React.MouseEvent","event: MouseEvent","event: KeyboardEvent","item: TreeContextMenuItem","event: React.MouseEvent","result: TreeNodeData[]","nodes: TreeNodeData[]","targetIndex: number","nodeId: string","targetId: string","parentNode: TreeNodeData | null","event: KeyboardEvent","defaultColumns: TreeTableColumn[]","node: TreeNodeData","level: number","data: Array<{ node: TreeNodeData; level: number }>","columnKey: string","cellContent: React.ReactNode"],"sources":["../src/tree/utils/SelectionTheme.ts","../src/tree/providers/TestTreeProvider.ts","../src/tree/providers/SimpleTreeProvider.ts","../src/tree/utils/logger.ts","../src/tree/models/TreeModel.ts","../src/tree/components/TreeCheckbox.tsx","../src/tree/components/TreeNodeList.tsx","../src/tree/components/TreeContextMenu.tsx","../src/tree/components/Tree.tsx","../src/tree/components/TreeTable.tsx"],"sourcesContent":["/**\n * SelectionTheme - Utility for theme-aware selection styling\n * \n * This module provides utilities for generating theme-aware CSS classes\n * for tree node selection based on the configured selection theme.\n */\n\nimport { cn } from '../../lib/utils';\nimport type { TreeSelectionTheme, SelectionColorScheme, SelectionIntensity, FocusIndicatorStyle } from '../types/TreeTypes';\n\n/**\n * Default selection theme configuration\n */\nexport const DEFAULT_SELECTION_THEME: TreeSelectionTheme = {\n colorScheme: 'primary',\n intensity: 'subtle',\n focusStyle: 'ring',\n animated: true,\n persistSelection: true\n};\n\n/**\n * Generate selection background classes based on color scheme and intensity\n */\nexport function getSelectionBackground(colorScheme: SelectionColorScheme, intensity: SelectionIntensity): string {\n if (colorScheme === 'custom') {\n // Use inline styles for custom colors - return empty string for CSS classes\n return '';\n }\n\n const intensityMap = {\n subtle: {\n primary: 'bg-primary/10',\n secondary: 'bg-secondary/10',\n accent: 'bg-accent/20',\n muted: 'bg-muted'\n },\n prominent: {\n primary: 'bg-primary/20',\n secondary: 'bg-secondary/20', \n accent: 'bg-accent/40',\n muted: 'bg-muted/60'\n },\n 'high-contrast': {\n primary: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground',\n accent: 'bg-accent text-accent-foreground',\n muted: 'bg-muted-foreground text-muted'\n }\n };\n\n return intensityMap[intensity]?.[colorScheme] || intensityMap.subtle.primary;\n}\n\n/**\n * Generate hover background classes\n */\nexport function getHoverBackground(colorScheme: SelectionColorScheme): string {\n if (colorScheme === 'custom') {\n // Use inline styles for custom colors instead of CSS custom properties\n return '';\n }\n\n const hoverMap = {\n primary: 'hover:bg-primary/5',\n secondary: 'hover:bg-secondary/5',\n accent: 'hover:bg-accent/10',\n muted: 'hover:bg-muted/30'\n };\n\n return hoverMap[colorScheme] || hoverMap.primary;\n}\n\n/**\n * Generate focus indicator classes based on focus style\n */\nexport function getFocusIndicator(focusStyle: FocusIndicatorStyle, colorScheme: SelectionColorScheme): string {\n if (colorScheme === 'custom') {\n return focusStyle === 'ring' \n ? 'ring-2 ring-[var(--tree-focus-ring)] ring-offset-1'\n : 'border-l-2 border-[var(--tree-focus-border)]';\n }\n\n const focusMap = {\n ring: {\n primary: 'ring-2 ring-primary ring-offset-1',\n secondary: 'ring-2 ring-secondary ring-offset-1',\n accent: 'ring-2 ring-accent ring-offset-1',\n muted: 'ring-2 ring-muted-foreground ring-offset-1'\n },\n outline: {\n primary: 'outline-2 outline-primary',\n secondary: 'outline-2 outline-secondary',\n accent: 'outline-2 outline-accent',\n muted: 'outline-2 outline-muted-foreground'\n },\n border: {\n primary: 'border-l-2 border-primary',\n secondary: 'border-l-2 border-secondary',\n accent: 'border-l-2 border-accent',\n muted: 'border-l-2 border-muted-foreground'\n },\n underline: {\n primary: 'border-b-2 border-primary',\n secondary: 'border-b-2 border-secondary',\n accent: 'border-b-2 border-accent',\n muted: 'border-b-2 border-muted-foreground'\n }\n };\n\n return focusMap[focusStyle]?.[colorScheme] || focusMap.ring.primary;\n}\n\n/**\n * Generate complete selection classes for a tree node\n */\nexport function getSelectionClasses(\n theme: TreeSelectionTheme,\n isSelected: boolean,\n isFocused: boolean,\n useCheckboxes: boolean = false\n): string {\n const baseClasses = [\n 'transition-colors',\n theme.animated ? 'duration-150' : '',\n getHoverBackground(theme.colorScheme)\n ];\n\n if (isSelected) {\n baseClasses.push(getSelectionBackground(theme.colorScheme, theme.intensity));\n }\n\n if (isFocused && !useCheckboxes) {\n baseClasses.push(getFocusIndicator(theme.focusStyle, theme.colorScheme));\n }\n\n return cn(baseClasses);\n}\n\n\n\n/**\n * Generate CSS custom properties for custom color schemes\n * NOTE: This function is now simplified since we handle custom colors with inline styles\n */\nexport function getCustomColorVariables(theme: TreeSelectionTheme): Record<string, string> {\n // Return empty object since we now handle custom colors with inline styles\n // This avoids TypeScript issues with potentially undefined color properties\n return {};\n} ","import { makeAutoObservable } from 'mobx';\nimport type { TreeProvider, TreeSelectionInfo } from './TreeProvider';\nimport type { TreeNodeData, TreeLoadResult, TreeLoadOptions, TreeTableColumn, TreeTableSort, TreeTableExportOptions, TreeSelectionTheme } from '../types/TreeTypes';\nimport type { TreeContextMenuItem } from '../types/TreeTypes';\nimport { DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\nimport React from 'react';\nimport { \n FileText, ImageIcon as Image, Settings, BookOpen, TestTube, Package, \n Palette, Globe, Zap, Music, Archive, GitBranch, Database, Key, \n Code, Braces, Play, Component \n} from 'lucide-react';\n\nexport class TestTreeProvider implements TreeProvider {\n // Provider metadata (required)\n readonly id = 'test-tree-provider';\n readonly name = 'Test Tree Provider';\n readonly version = '1.0.0';\n \n // Configuration (required)\n isMultiSelectEnabled = true;\n readonly isDragDropEnabled = false;\n readonly isVirtualizationEnabled = false;\n readonly isTableViewEnabled = true;\n useCheckboxSelection = false;\n readonly allowPartialSelection = true;\n readonly config = {};\n\n // Observable selection theme\n selectionTheme: TreeSelectionTheme = {\n ...DEFAULT_SELECTION_THEME,\n colorScheme: 'primary',\n intensity: 'prominent',\n focusStyle: 'ring',\n animated: true,\n persistSelection: true\n };\n\n // Test provider specific settings\n slowLoading = false;\n simulateErrors = false;\n maxDepth = 3;\n nodesPerLevel = 5;\n loadingDelay = 300;\n\n // Callbacks (optional)\n onSelectionChange?: (selectionInfo: TreeSelectionInfo) => void;\n onNodeExpansion?: (node: TreeNodeData, isExpanded: boolean) => void;\n onNodeFocus?: (node: TreeNodeData | null) => void;\n\n constructor() {\n makeAutoObservable(this, {\n id: false,\n name: false,\n version: false,\n isDragDropEnabled: false,\n isVirtualizationEnabled: false,\n isTableViewEnabled: false,\n config: false,\n // Make isMultiSelectEnabled and useCheckboxSelection observable\n // isMultiSelectEnabled: true (default - observable)\n // useCheckboxSelection: true (default - observable)\n });\n }\n\n /**\n * Update selection theme reactively\n */\n updateSelectionTheme = (theme: Partial<TreeSelectionTheme>) => {\n this.selectionTheme = { ...this.selectionTheme, ...theme };\n };\n\n /**\n * Update multi-select setting\n */\n setMultiSelectEnabled = (enabled: boolean) => {\n this.isMultiSelectEnabled = enabled;\n };\n\n /**\n * Update checkbox selection setting\n */\n setCheckboxSelection = (enabled: boolean) => {\n this.useCheckboxSelection = enabled;\n };\n\n /**\n * Get selection theme configuration\n */\n getSelectionTheme(): TreeSelectionTheme {\n return this.selectionTheme;\n }\n\n /**\n * Load tree nodes\n */\n async loadNodes(options?: TreeLoadOptions): Promise<TreeLoadResult> {\n await this.simulateDelay();\n \n if (this.simulateErrors && Math.random() < 0.3) {\n throw new Error('Simulated loading error - try again!');\n }\n \n const nodes = this.generateMockNodes('', 0);\n \n return {\n nodes,\n hasMore: false,\n totalCount: nodes.length\n };\n }\n\n /**\n * Load child nodes for a given parent\n */\n async loadChildren(node: TreeNodeData, options?: TreeLoadOptions): Promise<TreeLoadResult> {\n await this.simulateDelay();\n \n if (this.simulateErrors && Math.random() < 0.3) {\n throw new Error('Simulated loading error - try again!');\n }\n \n // Generate children for the given node\n const pathParts = node.path.split('/').filter(Boolean);\n const depth = pathParts.length;\n \n // Only generate children if we haven't exceeded max depth\n if (depth >= this.maxDepth) {\n return {\n nodes: [],\n hasMore: false,\n totalCount: 0\n };\n }\n \n const children = this.generateMockNodes(node.path, depth);\n \n return {\n nodes: children,\n hasMore: false,\n totalCount: children.length\n };\n }\n\n /**\n * Refresh tree data\n */\n async refresh(path?: string): Promise<TreeLoadResult> {\n return path ? this.loadChildren({ path } as TreeNodeData) : this.loadNodes();\n }\n\n canExpand(node: TreeNodeData): boolean {\n return node.type === 'directory' && (node.hasChildren ?? true);\n }\n\n canSelect(node: TreeNodeData): boolean {\n return !node.disabled;\n }\n\n // Context menu support\n getNodeContextMenu(node: TreeNodeData): TreeContextMenuItem[] {\n // Enhanced context menus based on node type and file extension\n const baseItems: TreeContextMenuItem[] = [];\n\n if (node.type === 'directory') {\n // Folder-specific menus\n if (node.name.includes('components')) {\n // React Components folder\n return [\n { id: 'open', label: 'Open Folder' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'new-component', label: 'New React Component' },\n { id: 'new-hook', label: 'New Custom Hook' },\n { id: 'new-story', label: 'New Storybook Story' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'run-tests', label: 'Run Component Tests' },\n { id: 'build-docs', label: 'Generate Docs' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename Folder' },\n { id: 'delete', label: 'Delete Folder' }\n ];\n } else if (node.name.includes('config')) {\n // Configuration folder\n return [\n { id: 'open', label: 'Open Config Folder' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'new-env', label: 'New Environment File' },\n { id: 'new-config', label: 'New Config File' },\n { id: 'validate-config', label: 'Validate Configuration' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'backup-config', label: 'Backup Configuration' },\n { id: 'restore-config', label: 'Restore from Backup' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename Folder' },\n { id: 'delete', label: 'Delete Folder' }\n ];\n } else {\n // General folder menu\n return [\n { id: 'open', label: 'Open Folder' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'new-file', label: 'New File' },\n { id: 'new-folder', label: 'New Folder' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'import-files', label: 'Import Files' },\n { id: 'export-folder', label: 'Export Folder' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename Folder' },\n { id: 'delete', label: 'Delete Folder' },\n { id: 'separator-4', label: '', type: 'separator' },\n { id: 'copy', label: 'Copy Folder' },\n { id: 'cut', label: 'Cut Folder' }\n ];\n }\n }\n\n // File-specific menus based on extension\n const fileName = node.name;\n const fileExt = fileName.split('.').pop()?.toLowerCase() || '';\n\n switch (fileExt) {\n case 'js':\n case 'jsx':\n // JavaScript/React files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Open in Preview' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'run-file', label: 'Run JavaScript' },\n { id: 'debug-file', label: 'Debug in Browser' },\n { id: 'format-code', label: 'Format with Prettier' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'create-test', label: 'Create Test File' },\n { id: 'run-tests', label: 'Run Tests' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'ts':\n case 'tsx':\n // TypeScript files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Open in Preview' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compile-ts', label: 'Compile TypeScript' },\n { id: 'type-check', label: 'Run Type Check' },\n { id: 'generate-types', label: 'Generate Type Definitions' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'create-test', label: 'Create Test File' },\n { id: 'run-tests', label: 'Run Tests' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'css':\n case 'scss':\n case 'sass':\n case 'less':\n // Stylesheet files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Live Preview' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compile-css', label: 'Compile Stylesheet' },\n { id: 'optimize-css', label: 'Optimize CSS' },\n { id: 'validate-css', label: 'Validate CSS' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'extract-vars', label: 'Extract CSS Variables' },\n { id: 'generate-rtl', label: 'Generate RTL Version' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'md':\n case 'mdx':\n // Markdown files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-preview', label: 'Preview Markdown' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'export-html', label: 'Export to HTML' },\n { id: 'export-pdf', label: 'Export to PDF' },\n { id: 'check-links', label: 'Check Links' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'toc-generate', label: 'Generate Table of Contents' },\n { id: 'word-count', label: 'Word Count & Stats' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'json':\n // JSON configuration files\n return [\n { id: 'open', label: 'Open in Editor' },\n { id: 'open-viewer', label: 'Open JSON Viewer' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'validate-json', label: 'Validate JSON' },\n { id: 'format-json', label: 'Format JSON' },\n { id: 'minify-json', label: 'Minify JSON' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'compare-json', label: 'Compare with...' },\n { id: 'schema-validate', label: 'Validate Against Schema' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'svg':\n case 'webp':\n // Image files\n return [\n { id: 'open', label: 'Open Image' },\n { id: 'open-editor', label: 'Edit in Image Editor' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'resize-image', label: 'Resize Image' },\n { id: 'compress-image', label: 'Compress Image' },\n { id: 'convert-format', label: 'Convert Format' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'image-info', label: 'Image Properties' },\n { id: 'copy-url', label: 'Copy Image URL' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' }\n ];\n\n default:\n // Generic file menu\n return [\n { id: 'open', label: 'Open File' },\n { id: 'open-with', label: 'Open With...' },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'properties', label: 'File Properties' },\n { id: 'permissions', label: 'Change Permissions' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'rename', label: 'Rename File' },\n { id: 'duplicate', label: 'Duplicate File' },\n { id: 'delete', label: 'Delete File' },\n { id: 'separator-3', label: '', type: 'separator' },\n { id: 'copy', label: 'Copy File' },\n { id: 'cut', label: 'Cut File' }\n ];\n }\n }\n\n getMultiNodeContextMenu(nodes: TreeNodeData[]): TreeContextMenuItem[] {\n // Enhanced multi-selection menus\n const hasFiles = nodes.some(n => n.type === 'file');\n const hasFolders = nodes.some(n => n.type === 'directory');\n const allSameType = hasFiles && !hasFolders || hasFolders && !hasFiles;\n\n if (allSameType && hasFiles) {\n // All files selected\n return [\n { id: 'open-all', label: `Open ${nodes.length} Files` },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compress-files', label: `Create Archive (${nodes.length} files)` },\n { id: 'copy-paths', label: 'Copy File Paths' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'copy-all', label: `Copy ${nodes.length} Files` },\n { id: 'cut-all', label: `Cut ${nodes.length} Files` },\n { id: 'delete-all', label: `Delete ${nodes.length} Files` }\n ];\n } else if (allSameType && hasFolders) {\n // All folders selected\n return [\n { id: 'open-all', label: `Open ${nodes.length} Folders` },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'merge-folders', label: 'Merge Folders' },\n { id: 'compare-folders', label: 'Compare Folders' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'copy-all', label: `Copy ${nodes.length} Folders` },\n { id: 'cut-all', label: `Cut ${nodes.length} Folders` },\n { id: 'delete-all', label: `Delete ${nodes.length} Folders` }\n ];\n } else {\n // Mixed selection (files and folders)\n return [\n { id: 'open-all', label: `Open ${nodes.length} Items` },\n { id: 'separator-1', label: '', type: 'separator' },\n { id: 'compress-all', label: `Create Archive (${nodes.length} items)` },\n { id: 'copy-info', label: 'Copy Selection Info' },\n { id: 'separator-2', label: '', type: 'separator' },\n { id: 'copy-all', label: `Copy ${nodes.length} Items` },\n { id: 'cut-all', label: `Cut ${nodes.length} Items` },\n { id: 'delete-all', label: `Delete ${nodes.length} Items` }\n ];\n }\n }\n\n onContextMenuAction(menuItemId: string, nodes: TreeNodeData[]): void {\n const nodeNames = nodes.map(n => n.name).join(', ');\n console.log(`🎯 Context menu action: ${menuItemId} on nodes: ${nodeNames}`);\n \n // Enhanced action handling with more detailed logging\n switch (menuItemId) {\n // File operations\n case 'open':\n case 'open-all':\n console.log(`📂 Opening: ${nodeNames}`);\n alert(`Opening: ${nodeNames}`);\n break;\n case 'open-preview':\n console.log(`👁️ Opening preview for: ${nodeNames}`);\n alert(`Preview mode for: ${nodeNames}`);\n break;\n case 'open-editor':\n console.log(`✏️ Opening in editor: ${nodeNames}`);\n alert(`Editor opened for: ${nodeNames}`);\n break;\n\n // Development operations\n case 'run-file':\n case 'run-tests':\n console.log(`▶️ Running: ${nodeNames}`);\n alert(`Executing: ${nodeNames}`);\n break;\n case 'debug-file':\n console.log(`🐛 Debugging: ${nodeNames}`);\n alert(`Debug session started for: ${nodeNames}`);\n break;\n case 'compile-ts':\n case 'compile-css':\n console.log(`🔨 Compiling: ${nodeNames}`);\n alert(`Compilation started for: ${nodeNames}`);\n break;\n case 'format-code':\n case 'format-json':\n console.log(`🎨 Formatting: ${nodeNames}`);\n alert(`Code formatted: ${nodeNames}`);\n break;\n case 'type-check':\n console.log(`🔍 Type checking: ${nodeNames}`);\n alert(`Type check completed for: ${nodeNames}`);\n break;\n\n // Creation operations\n case 'new-file':\n case 'new-folder':\n case 'new-component':\n case 'new-hook':\n case 'new-story':\n console.log(`➕ Creating new ${menuItemId.replace('new-', '')} in: ${nodeNames}`);\n alert(`Creating new ${menuItemId.replace('new-', '')} in: ${nodeNames}`);\n break;\n\n // Export/Import operations\n case 'export-html':\n case 'export-pdf':\n console.log(`📤 Exporting ${menuItemId.replace('export-', '')}: ${nodeNames}`);\n alert(`Exporting ${menuItemId.replace('export-', '').toUpperCase()}: ${nodeNames}`);\n break;\n case 'import-files':\n console.log(`📥 Importing files to: ${nodeNames}`);\n alert(`Import dialog opened for: ${nodeNames}`);\n break;\n\n // File management\n case 'rename':\n console.log(`✏️ Renaming: ${nodeNames}`);\n alert(`Rename dialog for: ${nodeNames}`);\n break;\n case 'duplicate':\n console.log(`📋 Duplicating: ${nodeNames}`);\n alert(`Duplicated: ${nodeNames}`);\n break;\n case 'delete':\n case 'delete-all':\n console.log(`🗑️ Deleting: ${nodeNames}`);\n alert(`Deleted: ${nodeNames}`);\n break;\n case 'copy':\n case 'copy-all':\n console.log(`📋 Copying: ${nodeNames}`);\n alert(`Copied to clipboard: ${nodeNames}`);\n break;\n case 'cut':\n case 'cut-all':\n console.log(`✂️ Cutting: ${nodeNames}`);\n alert(`Cut to clipboard: ${nodeNames}`);\n break;\n\n // Specialized operations\n case 'validate-json':\n case 'validate-css':\n case 'validate-config':\n console.log(`✅ Validating: ${nodeNames}`);\n alert(`Validation passed for: ${nodeNames}`);\n break;\n case 'compress-image':\n case 'compress-files':\n case 'compress-all':\n console.log(`🗜️ Compressing: ${nodeNames}`);\n alert(`Compression completed for: ${nodeNames}`);\n break;\n case 'image-info':\n case 'properties':\n console.log(`ℹ️ Showing properties for: ${nodeNames}`);\n alert(`Properties: ${nodeNames}\\nSize: 1.2MB\\nType: ${nodes[0]?.type || 'unknown'}\\nModified: ${nodes[0]?.lastModified?.toLocaleDateString() || 'unknown'}`);\n break;\n\n default:\n console.log(`❓ Unknown action: ${menuItemId}`);\n alert(`Action executed: ${menuItemId} on ${nodeNames}`);\n }\n }\n \n // Table view configuration\n getTableColumns(): TreeTableColumn[] {\n return [\n {\n id: 'name',\n label: 'Name',\n dataKey: 'name',\n width: '300px',\n sortable: true,\n filterable: true,\n isTreeColumn: true,\n align: 'left'\n },\n {\n id: 'type',\n label: 'Type',\n dataKey: 'type',\n width: '100px',\n sortable: true,\n filterable: true,\n align: 'left',\n formatValue: (value: string) => value === 'directory' ? 'Folder' : 'File'\n },\n {\n id: 'size',\n label: 'Size',\n dataKey: 'size',\n width: '100px',\n sortable: true,\n align: 'right',\n formatValue: (value: number, node: TreeNodeData) => {\n if (node.type === 'directory') return '-';\n if (!value) return '-';\n \n if (value < 1024) return `${value} B`;\n if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`;\n if (value < 1024 * 1024 * 1024) return `${(value / (1024 * 1024)).toFixed(1)} MB`;\n return `${(value / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n },\n {\n id: 'lastModified',\n label: 'Modified',\n dataKey: 'lastModified',\n width: '150px',\n sortable: true,\n align: 'left',\n formatValue: (value: Date) => {\n if (!value) return '-';\n return value.toLocaleDateString();\n }\n },\n {\n id: 'path',\n label: 'Path',\n dataKey: 'path',\n width: '200px',\n sortable: true,\n filterable: true,\n align: 'left'\n }\n ];\n }\n\n getDefaultTableSort(): TreeTableSort {\n return {\n columnId: 'name',\n direction: 'asc'\n };\n }\n\n onTableSort(sort: TreeTableSort | null): void {\n console.log('Table sort changed:', sort);\n }\n\n async onTableExport(options: TreeTableExportOptions): Promise<string | void> {\n console.log('Table export requested:', options);\n alert(`Export to ${options.format.toUpperCase()} format requested`);\n }\n \n private async simulateDelay(): Promise<void> {\n const delay = this.slowLoading ? 1000 : this.loadingDelay;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n\n private generateMockNodes(parentPath: string, depth: number): TreeNodeData[] {\n if (depth >= this.maxDepth) {\n return [];\n }\n \n const nodes: TreeNodeData[] = [];\n \n // Enhanced file types with better variety for icon demo\n const fileTypes = [\n // Web Development\n 'js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'sass', 'less',\n // Documentation & Content\n 'md', 'mdx', 'txt', 'pdf',\n // Data & Config\n 'json', 'yml', 'yaml', 'xml', 'env', 'config',\n // Images\n 'jpg', 'jpeg', 'png', 'gif', 'svg', 'webp', 'ico',\n // Media\n 'mp4', 'mp3', 'wav', 'avi',\n // Archives & Executables\n 'zip', 'tar', 'gz', 'exe', 'app', 'dmg',\n // Development\n 'py', 'php', 'java', 'cpp', 'c', 'go', 'rs', 'rb'\n ];\n \n // Enhanced folder names with special types for icon demo\n const folderTypes = [\n // Development Folders\n { name: 'components', type: 'react' },\n { name: 'hooks', type: 'react' },\n { name: 'pages', type: 'react' },\n { name: 'utils', type: 'code' },\n { name: 'lib', type: 'code' },\n { name: 'src', type: 'source' },\n // Config & Build\n { name: 'config', type: 'config' },\n { name: 'build', type: 'build' },\n { name: 'dist', type: 'build' },\n { name: '.github', type: 'git' },\n { name: '.vscode', type: 'vscode' },\n // Assets & Media\n { name: 'assets', type: 'assets' },\n { name: 'images', type: 'images' },\n { name: 'media', type: 'media' },\n { name: 'public', type: 'public' },\n // Documentation & Tests\n { name: 'docs', type: 'docs' },\n { name: 'tests', type: 'test' },\n { name: '__tests__', type: 'test' },\n // Node.js specific\n { name: 'node_modules', type: 'node_modules' }\n ];\n \n for (let i = 0; i < this.nodesPerLevel; i++) {\n const nodeId = `${parentPath || 'root'}-${depth}-${i}`.replace(/[^a-zA-Z0-9-_]/g, '-');\n \n const shouldBeFolder = depth < this.maxDepth - 1 && (i < this.nodesPerLevel / 2 || Math.random() < 0.4);\n \n if (shouldBeFolder) {\n const folderType = folderTypes[i % folderTypes.length] || { name: `folder-${i}`, type: 'default' };\n const folderPath = parentPath ? `${parentPath}/${folderType.name}` : `/${folderType.name}`;\n \n nodes.push({\n id: nodeId,\n name: folderType.name,\n path: folderPath,\n type: 'directory',\n hasChildren: depth < this.maxDepth - 1,\n lastModified: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000),\n // Add metadata for enhanced demo\n metadata: {\n folderType: folderType.type,\n description: this.getFolderDescription(folderType.type)\n }\n });\n } else {\n const fileType = fileTypes[i % fileTypes.length] || 'txt';\n const fileName = this.generateFileName(fileType, i);\n const filePath = parentPath ? `${parentPath}/${fileName}` : `/${fileName}`;\n \n nodes.push({\n id: nodeId,\n name: fileName,\n path: filePath,\n type: 'file',\n hasChildren: false,\n size: Math.floor(Math.random() * 1000000) + 1024,\n lastModified: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000),\n // Add metadata for enhanced demo\n metadata: {\n fileType: fileType,\n category: this.getFileCategory(fileType),\n description: this.getFileDescription(fileType)\n }\n });\n }\n }\n \n return nodes;\n }\n \n private generateFileName(fileType: string, index: number): string {\n const fileNames: Record<string, string[]> = {\n 'js': ['utils', 'helpers', 'config', 'index', 'main'],\n 'jsx': ['App', 'Component', 'Button', 'Modal', 'Form'],\n 'ts': ['types', 'interfaces', 'utils', 'service', 'api'],\n 'tsx': ['HomePage', 'UserCard', 'Navigation', 'Layout', 'Dashboard'],\n 'css': ['styles', 'main', 'theme', 'reset', 'variables'],\n 'scss': ['app', 'components', 'layout', 'mixins', 'variables'],\n 'md': ['README', 'CHANGELOG', 'CONTRIBUTING', 'DOCS', 'API'],\n 'json': ['package', 'tsconfig', 'config', 'settings', 'data'],\n 'yml': ['docker-compose', 'config', 'ci', 'deployment', 'settings'],\n 'py': ['main', 'utils', 'models', 'views', 'tests'],\n 'jpg': ['hero-image', 'profile', 'banner', 'thumbnail', 'cover'],\n 'png': ['logo', 'icon', 'screenshot', 'diagram', 'chart']\n };\n \n const names = fileNames[fileType] || ['file'];\n const baseName = names[index % names.length];\n \n return `${baseName}.${fileType}`;\n }\n \n \n private getFolderDescription(folderType: string): string {\n const descriptions: Record<string, string> = {\n 'react': 'React components and hooks',\n 'source': 'Source code files',\n 'code': 'Utility functions and libraries',\n 'config': 'Configuration files',\n 'build': 'Build output and artifacts',\n 'git': 'Git workflow configurations',\n 'vscode': 'VS Code editor settings',\n 'assets': 'Project assets and resources',\n 'images': 'Image files and graphics',\n 'media': 'Media files (video, audio)',\n 'public': 'Public static files',\n 'docs': 'Documentation files',\n 'test': 'Test files and specs',\n 'node_modules': 'Node.js dependencies',\n 'default': 'General folder'\n };\n \n return descriptions[folderType] || 'General folder';\n }\n \n \n private getFileCategory(fileType: string): string {\n const categories: Record<string, string> = {\n // Web Development\n 'js': 'JavaScript', 'jsx': 'React', 'ts': 'TypeScript', 'tsx': 'React TypeScript',\n 'css': 'Stylesheet', 'scss': 'Sass', 'sass': 'Sass', 'less': 'Less',\n 'html': 'Markup', 'xml': 'Markup', 'svg': 'Vector Graphics',\n \n // Documentation\n 'md': 'Markdown', 'txt': 'Text', 'pdf': 'Document',\n \n // Configuration\n 'json': 'Data', 'yml': 'Config', 'yaml': 'Config', 'env': 'Environment',\n \n // Media\n 'jpg': 'Image', 'png': 'Image', 'gif': 'Image',\n 'mp3': 'Audio', 'mp4': 'Video',\n \n // Programming\n 'py': 'Python', 'php': 'PHP', 'java': 'Java', 'cpp': 'C++', 'go': 'Go',\n \n // Archives\n 'zip': 'Archive', 'tar': 'Archive',\n \n // Default\n 'default': 'File'\n };\n \n return categories[fileType] || categories['default'] || 'File';\n }\n \n private getFileDescription(fileType: string): string {\n const descriptions: Record<string, string> = {\n 'js': 'JavaScript source file',\n 'jsx': 'React component file',\n 'ts': 'TypeScript source file',\n 'tsx': 'React TypeScript component',\n 'css': 'Cascading Style Sheet',\n 'scss': 'Sass stylesheet',\n 'html': 'HTML markup file',\n 'md': 'Markdown documentation',\n 'json': 'JSON data file',\n 'py': 'Python script',\n 'jpg': 'JPEG image file',\n 'png': 'PNG image file',\n 'mp3': 'MP3 audio file',\n 'zip': 'Compressed archive'\n };\n \n return descriptions[fileType] || `${fileType.toUpperCase()} file`;\n }\n\n /**\n * Get custom icon for a node based on file type and category\n */\n getNodeIcon(node: TreeNodeData): string | React.ComponentType<any> {\n // If it's a directory/folder, use special folder icons\n if (node.type === 'directory') {\n // Special folder icons based on name\n if (node.name.includes('components')) {\n return Component; // React component folder\n }\n if (node.name.includes('assets') || node.name.includes('images')) {\n return Image;\n }\n if (node.name.includes('config') || node.name.includes('settings')) {\n return Settings;\n }\n if (node.name.includes('docs') || node.name.includes('documentation')) {\n return BookOpen;\n }\n if (node.name.includes('test') || node.name.includes('__tests__')) {\n return TestTube;\n }\n if (node.name.includes('lib') || node.name.includes('library')) {\n return Package;\n }\n \n // Default folder icons (already handled by TreeNodeList)\n return 'folder';\n }\n \n // File icons based on extension\n const extension = node.name.split('.').pop() || '';\n \n switch (extension.toLowerCase()) {\n // Web Development\n case 'js':\n case 'jsx':\n return FileText; // JavaScript icon\n \n case 'ts':\n case 'tsx':\n return Code; // TypeScript icon\n \n case 'html':\n case 'htm':\n return Globe; // HTML icon\n \n case 'css':\n case 'scss':\n case 'sass':\n case 'less':\n return Palette; // Stylesheet icon\n \n // Documentation\n case 'md':\n case 'mdx':\n return FileText; // Markdown icon\n \n case 'txt':\n return FileText;\n \n case 'pdf':\n return FileText;\n \n // Data & Configuration\n case 'json':\n return Braces; // JSON icon\n \n case 'yml':\n case 'yaml':\n return Settings; // YAML icon\n \n case 'xml':\n return Code; // XML icon\n \n case 'env':\n return Key; // Environment file icon\n \n case 'config':\n return Settings; // Config file icon\n \n // Images\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'webp':\n case 'bmp':\n case 'tiff':\n case 'ico':\n return Image; // Image icon\n \n case 'svg':\n return Zap; // SVG icon (special since it's vector)\n \n // Media\n case 'mp4':\n case 'avi':\n case 'mov':\n case 'mkv':\n return Play; // Video icon\n \n case 'mp3':\n case 'wav':\n case 'flac':\n case 'ogg':\n return Music; // Audio icon\n \n // Archives\n case 'zip':\n case 'tar':\n case 'gz':\n case '7z':\n case 'rar':\n return Archive; // Archive icon\n \n // Executables\n case 'exe':\n case 'app':\n case 'deb':\n case 'dmg':\n return Zap; // Executable icon\n \n // Development Tools\n case 'git':\n case 'gitignore':\n return GitBranch; // Git icon\n \n case 'dockerfile':\n return Package; // Docker icon\n \n case 'sql':\n return Database; // Database icon\n \n case 'log':\n return FileText; // Log file icon\n \n // Default file icon (handled by TreeNodeList)\n default:\n return 'file'; // Use default File icon\n }\n }\n} ","/**\n * SimpleTreeProvider - Straightforward implementation for static tree data\n * \n * This provider is designed for simple use cases where you have static\n * tree data that doesn't require complex loading, error simulation, or\n * dynamic generation. It's perfect for:\n * - Static file trees\n * - Simple navigation trees\n * - Documentation structures\n * - Basic hierarchical data display\n */\n\nimport { makeAutoObservable } from 'mobx';\nimport type { TreeProvider, TreeSelectionInfo } from './TreeProvider';\nimport type { TreeNodeData, TreeLoadResult, TreeLoadOptions, TreeContextMenuItem, TreeSelectionTheme } from '../types/TreeTypes';\nimport { DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\n\nexport interface SimpleTreeProviderOptions {\n /** Whether to enable multi-select functionality */\n enableMultiSelect?: boolean;\n /** Whether to enable drag and drop */\n enableDragDrop?: boolean;\n /** Static tree data to display */\n data?: TreeNodeData[];\n /** Custom context menu items */\n contextMenuItems?: TreeContextMenuItem[];\n /** Callback when nodes are selected */\n onSelectionChange?: (selectionInfo: TreeSelectionInfo) => void;\n /** Callback when context menu actions are triggered */\n onContextMenuAction?: (actionId: string, nodes: TreeNodeData[]) => void;\n}\n\nexport class SimpleTreeProvider implements TreeProvider {\n // Provider metadata (required)\n readonly id = 'simple-tree-provider';\n readonly name = 'Simple Tree Provider';\n readonly version = '1.0.0';\n \n // Configuration (required)\n isMultiSelectEnabled = true;\n readonly isDragDropEnabled = false;\n readonly isVirtualizationEnabled = false;\n readonly isTableViewEnabled = false;\n useCheckboxSelection = false;\n readonly allowPartialSelection = true;\n readonly config = {};\n\n // Observable selection theme\n selectionTheme: TreeSelectionTheme = {\n ...DEFAULT_SELECTION_THEME,\n colorScheme: 'primary',\n intensity: 'prominent',\n focusStyle: 'ring',\n animated: true,\n persistSelection: true\n };\n\n // Data\n private nodes: TreeNodeData[] = [];\n private contextMenuItems: TreeContextMenuItem[] = [];\n\n // Callbacks (optional)\n onSelectionChange?: (selectionInfo: TreeSelectionInfo) => void;\n onNodeExpansion?: (node: TreeNodeData, isExpanded: boolean) => void;\n onNodeFocus?: (node: TreeNodeData | null) => void;\n onContextMenuAction?: (actionId: string, nodes: TreeNodeData[]) => void;\n\n constructor(options: SimpleTreeProviderOptions = {}) {\n this.nodes = options.data ?? this.createDefaultData();\n this.contextMenuItems = options.contextMenuItems ?? this.createDefaultContextMenu();\n this.onSelectionChange = options.onSelectionChange;\n this.onContextMenuAction = options.onContextMenuAction;\n makeAutoObservable(this, {\n id: false,\n name: false,\n version: false,\n isDragDropEnabled: false,\n isVirtualizationEnabled: false,\n isTableViewEnabled: false,\n config: false,\n // Make isMultiSelectEnabled and useCheckboxSelection observable\n // isMultiSelectEnabled: true (default - observable)\n // useCheckboxSelection: true (default - observable)\n });\n }\n \n /**\n * Load root nodes\n */\n async loadNodes(options?: TreeLoadOptions): Promise<TreeLoadResult> {\n // Simple provider returns static data immediately\n return {\n nodes: this.nodes,\n hasMore: false,\n totalCount: this.nodes.length\n };\n }\n \n /**\n * Load children for a specific node\n */\n async loadChildren(node: TreeNodeData, options?: TreeLoadOptions): Promise<TreeLoadResult> {\n // Children are already loaded in the static data structure\n const children = node.children || [];\n \n return {\n nodes: children,\n hasMore: false,\n totalCount: children.length\n };\n }\n \n /**\n * Refresh/reload nodes\n */\n async refresh(path?: string): Promise<TreeLoadResult> {\n // For static provider, refresh just returns current data\n if (path) {\n // Find specific node to refresh\n const node = this.findNodeByPath(path);\n if (node) {\n return this.loadChildren(node);\n }\n }\n \n // Refresh all data\n return this.loadNodes();\n }\n \n /**\n * Get context menu for a single node\n */\n getNodeContextMenu(node: TreeNodeData): TreeContextMenuItem[] {\n return this.contextMenuItems.filter(item => {\n // Show different items based on node type\n if (item.id === 'expand' || item.id === 'collapse') {\n return node.hasChildren || (node.children && node.children.length > 0);\n }\n if (item.id === 'open') {\n return node.type === 'file';\n }\n return true; // Show other items for all nodes\n });\n }\n \n /**\n * Get context menu for multiple selected nodes\n */\n getMultiNodeContextMenu(nodes: TreeNodeData[]): TreeContextMenuItem[] {\n return this.contextMenuItems.filter(item => {\n // Only show actions that work on multiple items\n return ['delete', 'copy', 'cut', 'properties'].includes(item.id);\n });\n }\n\n /**\n * Get selection theme configuration\n */\n getSelectionTheme(): TreeSelectionTheme {\n return this.selectionTheme;\n }\n \n /**\n * Update the static data\n */\n setData(data: TreeNodeData[]): void {\n this.nodes = data;\n }\n \n /**\n * Get current data\n */\n getData(): TreeNodeData[] {\n return this.nodes;\n }\n \n /**\n * Add a new node to the tree\n */\n addNode(parentPath: string | null, newNode: TreeNodeData): boolean {\n if (parentPath === null) {\n // Add to root\n this.nodes.push(newNode);\n return true;\n }\n \n // Find parent and add to its children\n const parent = this.findNodeByPath(parentPath);\n if (parent) {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(newNode);\n parent.hasChildren = true;\n return true;\n }\n \n return false;\n }\n \n /**\n * Remove a node from the tree\n */\n removeNode(nodePath: string): boolean {\n // Try to remove from root level\n const rootIndex = this.nodes.findIndex(node => node.path === nodePath);\n if (rootIndex >= 0) {\n this.nodes.splice(rootIndex, 1);\n return true;\n }\n \n // Find and remove from children\n return this.removeNodeFromChildren(this.nodes, nodePath);\n }\n \n /**\n * Find a node by its path\n */\n findNodeByPath(path: string): TreeNodeData | null {\n const searchNodes = (nodes: TreeNodeData[]): TreeNodeData | null => {\n for (const node of nodes) {\n if (node.path === path) {\n return node;\n }\n if (node.children) {\n const found = searchNodes(node.children);\n if (found) return found;\n }\n }\n return null;\n };\n \n return searchNodes(this.nodes);\n }\n \n /**\n * Create default sample data\n */\n private createDefaultData(): TreeNodeData[] {\n return [\n {\n id: 'documents',\n name: 'Documents',\n path: '/documents',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'reports',\n name: 'Reports',\n path: '/documents/reports',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'quarterly-report',\n name: 'Quarterly Report.pdf',\n path: '/documents/reports/quarterly-report.pdf',\n type: 'file',\n size: 1024000,\n lastModified: new Date('2024-01-15')\n },\n {\n id: 'annual-report',\n name: 'Annual Report.pdf',\n path: '/documents/reports/annual-report.pdf',\n type: 'file',\n size: 2048000,\n lastModified: new Date('2024-01-10')\n }\n ]\n },\n {\n id: 'presentations',\n name: 'Presentations',\n path: '/documents/presentations',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'product-demo',\n name: 'Product Demo.pptx',\n path: '/documents/presentations/product-demo.pptx',\n type: 'file',\n size: 5120000,\n lastModified: new Date('2024-01-20')\n }\n ]\n },\n {\n id: 'readme',\n name: 'README.md',\n path: '/documents/readme.md',\n type: 'file',\n size: 2048,\n lastModified: new Date('2024-01-25')\n }\n ]\n },\n {\n id: 'projects',\n name: 'Projects',\n path: '/projects',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'web-app',\n name: 'Web Application',\n path: '/projects/web-app',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'src',\n name: 'src',\n path: '/projects/web-app/src',\n type: 'directory',\n hasChildren: true,\n children: [\n {\n id: 'app-ts',\n name: 'app.ts',\n path: '/projects/web-app/src/app.ts',\n type: 'file',\n size: 4096,\n lastModified: new Date('2024-01-24')\n },\n {\n id: 'components',\n name: 'components',\n path: '/projects/web-app/src/components',\n type: 'directory',\n hasChildren: false,\n children: []\n }\n ]\n },\n {\n id: 'package-json',\n name: 'package.json',\n path: '/projects/web-app/package.json',\n type: 'file',\n size: 1024,\n lastModified: new Date('2024-01-23')\n }\n ]\n }\n ]\n },\n {\n id: 'downloads',\n name: 'Downloads',\n path: '/downloads',\n type: 'directory',\n hasChildren: false,\n children: []\n }\n ];\n }\n \n /**\n * Create default context menu items\n */\n private createDefaultContextMenu(): TreeContextMenuItem[] {\n return [\n {\n id: 'open',\n label: 'Open',\n icon: 'file-text',\n handler: (node) => this.onContextMenuAction?.('open', [node])\n },\n {\n id: 'expand',\n label: 'Expand',\n icon: 'chevron-down',\n handler: (node) => this.onContextMenuAction?.('expand', [node])\n },\n {\n id: 'collapse',\n label: 'Collapse', \n icon: 'chevron-right',\n handler: (node) => this.onContextMenuAction?.('collapse', [node])\n },\n { \n id: 'separator-1',\n label: '',\n type: 'separator' \n },\n {\n id: 'copy',\n label: 'Copy',\n icon: 'copy',\n handler: (node) => this.onContextMenuAction?.('copy', [node])\n },\n {\n id: 'cut',\n label: 'Cut',\n icon: 'scissors',\n handler: (node) => this.onContextMenuAction?.('cut', [node])\n },\n {\n id: 'delete',\n label: 'Delete',\n icon: 'trash-2',\n handler: (node) => this.onContextMenuAction?.('delete', [node])\n },\n { \n id: 'separator-2',\n label: '',\n type: 'separator'\n },\n {\n id: 'properties',\n label: 'Properties',\n icon: 'info',\n handler: (node) => this.onContextMenuAction?.('properties', [node])\n }\n ];\n }\n \n /**\n * Helper method to remove node from children recursively\n */\n private removeNodeFromChildren(nodes: TreeNodeData[], targetPath: string): boolean {\n for (const node of nodes) {\n if (node.children) {\n const childIndex = node.children.findIndex(child => child.path === targetPath);\n if (childIndex >= 0) {\n node.children.splice(childIndex, 1);\n node.hasChildren = node.children.length > 0;\n return true;\n }\n \n if (this.removeNodeFromChildren(node.children, targetPath)) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Update selection theme reactively\n */\n updateSelectionTheme = (theme: Partial<TreeSelectionTheme>) => {\n this.selectionTheme = { ...this.selectionTheme, ...theme };\n };\n\n /**\n * Update multi-select setting\n */\n setMultiSelectEnabled = (enabled: boolean) => {\n this.isMultiSelectEnabled = enabled;\n };\n\n /**\n * Update checkbox selection setting\n */\n setCheckboxSelection = (enabled: boolean) => {\n this.useCheckboxSelection = enabled;\n };\n} ","interface LogContext {\n component?: string;\n nodeId?: string;\n operation?: string;\n [key: string]: any;\n}\n\ninterface LogEntry {\n timestamp: string;\n level: 'debug' | 'info' | 'warn' | 'error';\n message: string;\n context?: LogContext;\n data?: any;\n}\n\nclass TreeLogger {\n private isEnabled = true;\n private logs: LogEntry[] = [];\n private maxLogs = 1000;\n\n enable() {\n this.isEnabled = true;\n console.log('🌳 TreeComponent logging enabled');\n }\n\n disable() {\n this.isEnabled = false;\n console.log('🌳 TreeComponent logging disabled');\n }\n\n private log(level: LogEntry['level'], message: string, context?: LogContext, data?: any) {\n if (!this.isEnabled) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n context,\n data\n };\n\n // Store log entry\n this.logs.push(entry);\n if (this.logs.length > this.maxLogs) {\n this.logs.shift();\n }\n\n // Format console output\n const prefix = this.getPrefix(level);\n const contextStr = context ? this.formatContext(context) : '';\n const fullMessage = `${prefix} ${message}${contextStr}`;\n\n // Console output with appropriate level\n switch (level) {\n case 'debug':\n console.debug(fullMessage, data || '');\n break;\n case 'info':\n console.info(fullMessage, data || '');\n break;\n case 'warn':\n console.warn(fullMessage, data || '');\n break;\n case 'error':\n console.error(fullMessage, data || '');\n break;\n }\n }\n\n private getPrefix(level: LogEntry['level']): string {\n const timestamp = new Date().toLocaleTimeString();\n switch (level) {\n case 'debug': return `🔍 [${timestamp}] TreeComponent:`;\n case 'info': return `ℹ️ [${timestamp}] TreeComponent:`;\n case 'warn': return `⚠️ [${timestamp}] TreeComponent:`;\n case 'error': return `❌ [${timestamp}] TreeComponent:`;\n }\n }\n\n private formatContext(context: LogContext): string {\n const parts: string[] = [];\n \n if (context.component) parts.push(`[${context.component}]`);\n if (context.nodeId) parts.push(`(node: ${context.nodeId})`);\n if (context.operation) parts.push(`{${context.operation}}`);\n \n // Add other context properties\n Object.entries(context).forEach(([key, value]) => {\n if (!['component', 'nodeId', 'operation'].includes(key)) {\n parts.push(`${key}=${value}`);\n }\n });\n\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n }\n\n debug(message: string, context?: LogContext, data?: any) {\n this.log('debug', message, context, data);\n }\n\n info(message: string, context?: LogContext, data?: any) {\n this.log('info', message, context, data);\n }\n\n warn(message: string, context?: LogContext, data?: any) {\n this.log('warn', message, context, data);\n }\n\n error(message: string, context?: LogContext, data?: any) {\n this.log('error', message, context, data);\n }\n\n // Specialized logging methods for common TreeComponent operations\n selection(operation: string, nodeId: string, data?: any) {\n this.debug(`Selection ${operation}`, { \n component: 'Selection', \n nodeId, \n operation \n }, data);\n }\n\n expansion(operation: string, nodeId: string, data?: any) {\n this.debug(`Expansion ${operation}`, { \n component: 'Expansion', \n nodeId, \n operation \n }, data);\n }\n\n interaction(operation: string, nodeId: string, data?: any) {\n this.debug(`User interaction: ${operation}`, { \n component: 'Interaction', \n nodeId, \n operation \n }, data);\n }\n\n rendering(component: string, nodeId: string, data?: any) {\n this.debug(`Rendering`, { \n component, \n nodeId, \n operation: 'render' \n }, data);\n }\n\n cssClasses(nodeId: string, classes: string, selected: boolean, focused: boolean) {\n this.debug(`CSS classes applied`, { \n component: 'Styling', \n nodeId,\n selected: selected.toString(),\n focused: focused.toString()\n }, { classes });\n }\n\n providerCall(method: string, data?: any) {\n this.debug(`Provider method called`, { \n component: 'Provider', \n operation: method \n }, data);\n }\n\n stateChange(component: string, property: string, oldValue: any, newValue: any) {\n this.debug(`State change`, { \n component, \n operation: 'state-change',\n property \n }, { oldValue, newValue });\n }\n\n // Get logs for debugging\n getLogs(filter?: { level?: LogEntry['level'], component?: string }): LogEntry[] {\n if (!filter) return [...this.logs];\n \n return this.logs.filter(log => {\n if (filter.level && log.level !== filter.level) return false;\n if (filter.component && log.context?.component !== filter.component) return false;\n return true;\n });\n }\n\n // Clear logs\n clearLogs() {\n this.logs = [];\n console.log('🌳 TreeComponent logs cleared');\n }\n\n // Export logs for analysis\n exportLogs(): string {\n return JSON.stringify(this.logs, null, 2);\n }\n}\n\n// Global logger instance\nexport const logger = new TreeLogger();\n\n// Enable by default in development\nif (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') {\n logger.enable();\n // Make logger available globally for debugging\n (window as any).treeLogger = logger;\n}\n\nexport type { LogContext, LogEntry }; ","/**\n * TreeModel - MobX state management for Tree Component\n * \n * This class manages all tree state including nodes, selection, expansion,\n * and loading states. It follows strict MobX patterns:\n * - Uses makeAutoObservable(this, {}) \n * - Uses observable.map() for reactive collections\n * - Uses composition over inheritance\n * - All async operations use flow\n */\n\nimport { makeAutoObservable, observable, flow } from 'mobx';\nimport type { TreeProvider } from '../providers/TreeProvider';\nimport type { TreeNodeData, TreeLoadOptions } from '../types/TreeTypes';\nimport type { TreeContextMenuItem } from '../types/TreeTypes';\nimport type { CheckboxState } from '../components/TreeCheckbox';\nimport { logger } from '../utils/logger';\n\nexport class TreeModel {\n // Core Data - using observable collections\n nodes: TreeNodeData[] = [];\n nodeMap = observable.map<string, TreeNodeData>();\n \n // Loading State\n isLoading: boolean = false;\n errors = observable.map<string, Error>();\n \n // Selection State - using observable collections\n selectedNodes = observable.map<string, TreeNodeData>();\n focusedNode: string | null = null;\n \n // Checkbox Selection State - for 3-state checkboxes\n checkboxStates = observable.map<string, CheckboxState>();\n \n // Expansion State - using observable collections\n expandedNodes = observable.map<string, boolean>();\n loadingNodes = observable.map<string, boolean>();\n \n // Context menu state\n contextMenuVisible: boolean = false;\n contextMenuPosition: { x: number; y: number } = { x: 0, y: 0 };\n contextMenuItems: TreeContextMenuItem[] = [];\n contextMenuNodes: TreeNodeData[] = [];\n \n constructor(public provider: TreeProvider) {\n makeAutoObservable(this, {\n // Most defaults are correct, empty overrides object\n });\n }\n \n // =====================\n // Computed Properties\n // =====================\n \n /**\n * Whether the tree has any nodes loaded\n */\n get hasNodes(): boolean {\n return this.nodes.length > 0;\n }\n \n /**\n * Total count of nodes currently loaded\n */\n get nodeCount(): number {\n return this.nodes.length;\n }\n \n /**\n * Whether data has been loaded (regardless of success/failure)\n */\n get isLoaded(): boolean {\n return !this.isLoading && (this.hasNodes || this.errors.size > 0);\n }\n \n /**\n * Array of currently selected nodes (computed from selectedNodes map)\n */\n get selectedNodesArray(): TreeNodeData[] {\n return Array.from(this.selectedNodes.values());\n }\n \n /**\n * Whether any nodes are currently selected\n */\n get hasSelection(): boolean {\n return this.selectedNodes.size > 0;\n }\n \n /**\n * Check if a specific node is selected\n */\n isNodeSelected(nodeId: string): boolean {\n return this.selectedNodes.has(nodeId);\n }\n \n /**\n * Check if a specific node is expanded\n */\n isNodeExpanded(nodeId: string): boolean {\n return this.expandedNodes.get(nodeId) ?? false;\n }\n \n /**\n * Check if a specific node is loading\n */\n isNodeLoading(nodeId: string): boolean {\n return this.loadingNodes.get(nodeId) ?? false;\n }\n \n // =====================\n // Async Actions (using flow)\n // =====================\n \n /**\n * Load nodes from the provider\n * Uses MobX flow for proper async action handling\n */\n loadNodes = flow(function* (this: TreeModel, options?: TreeLoadOptions) {\n this.isLoading = true;\n this.errors.clear();\n \n try {\n const result = yield this.provider.loadNodes(options);\n \n // Update nodes and nodeMap\n this.nodes = result.nodes;\n \n // Update node map for fast lookups\n this.nodeMap.clear();\n result.nodes.forEach((node: TreeNodeData) => this.nodeMap.set(node.id, node));\n \n } catch (error) {\n const errorKey = 'loadNodes';\n this.errors.set(errorKey, error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.isLoading = false;\n }\n });\n \n // =====================\n // Selection Actions (placeholder implementations)\n // =====================\n \n /**\n * Select a specific node\n * @param node Node to select\n */\n selectNode(node: TreeNodeData): void {\n const previousSelection = this.selectedNodesArray.map(n => n.id);\n logger.selection('selectNode called', node.id, { \n previouslySelected: previousSelection,\n isMultiSelect: this.provider.isMultiSelectEnabled \n });\n \n // Check if provider allows multi-selection\n if (!this.provider.isMultiSelectEnabled) {\n // Clear existing selection for single-select mode\n logger.selection('clearing selection (single-select mode)', node.id);\n this.selectedNodes.clear();\n }\n \n // Add node to selection\n this.selectedNodes.set(node.id, node);\n logger.selection('node added to selection', node.id, { \n totalSelected: this.selectedNodes.size \n });\n \n // Set focused node\n const previousFocus = this.focusedNode;\n this.focusedNode = node.id;\n logger.stateChange('TreeModel', 'focusedNode', previousFocus, this.focusedNode);\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n logger.providerCall('onSelectionChange', {\n selectedCount: this.selectedNodesArray.length,\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single'\n });\n this.provider.onSelectionChange({\n selectedNodes: this.selectedNodesArray,\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single',\n trigger: 'click'\n });\n }\n }\n \n /**\n * Deselect a specific node\n * @param node Node to deselect\n */\n deselectNode(node: TreeNodeData): void {\n logger.selection('deselectNode called', node.id, { \n wasSelected: this.selectedNodes.has(node.id) \n });\n \n // Remove from selection if present\n if (this.selectedNodes.has(node.id)) {\n this.selectedNodes.delete(node.id);\n logger.selection('node removed from selection', node.id, { \n remainingSelected: this.selectedNodes.size \n });\n \n // Clear focus if this was the focused node\n if (this.focusedNode === node.id) {\n const previousFocus = this.focusedNode;\n this.focusedNode = null;\n logger.stateChange('TreeModel', 'focusedNode', previousFocus, this.focusedNode);\n }\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n logger.providerCall('onSelectionChange', {\n selectedCount: this.selectedNodesArray.length,\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single'\n });\n this.provider.onSelectionChange({\n selectedNodes: this.selectedNodesArray,\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single',\n trigger: 'click'\n });\n }\n }\n }\n \n /**\n * Clear all selected nodes\n */\n clearSelection(): void {\n // Only proceed if there are selected nodes\n if (this.selectedNodes.size > 0) {\n this.selectedNodes.clear();\n this.focusedNode = null;\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n this.provider.onSelectionChange({\n selectedNodes: [],\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: this.provider.isMultiSelectEnabled ? 'multi' : 'single',\n trigger: 'api'\n });\n }\n }\n }\n \n /**\n * Select all nodes (only if multi-select is enabled)\n */\n selectAll(): void {\n if (!this.provider.isMultiSelectEnabled) {\n return; // Not allowed in single-select mode\n }\n \n // Add all nodes to selection\n this.nodes.forEach(node => {\n this.selectedNodes.set(node.id, node);\n });\n \n // Set focus to the first node if any exist\n if (this.nodes.length > 0) {\n const firstNode = this.nodes[0];\n if (firstNode) {\n this.focusedNode = firstNode.id;\n }\n }\n \n // Notify provider of selection change (if callback exists)\n if (this.provider.onSelectionChange) {\n this.provider.onSelectionChange({\n selectedNodes: this.selectedNodesArray,\n previousSelection: [], // TODO: Track previous selection in future enhancement\n selectionType: 'multi',\n trigger: 'api'\n });\n }\n }\n \n // =====================\n // Checkbox Selection Methods\n // =====================\n \n /**\n * Get checkbox state for a specific node\n */\n getCheckboxState(nodeId: string): CheckboxState {\n return this.checkboxStates.get(nodeId) ?? 'unchecked';\n }\n \n /**\n * Handle checkbox click for a node\n */\n handleCheckboxChange(node: TreeNodeData, newState: CheckboxState): void {\n logger.interaction('handleCheckboxChange called', node.id, { \n newState, \n useCheckboxSelection: this.provider.useCheckboxSelection,\n allowPartialSelection: this.provider.allowPartialSelection,\n currentCheckboxState: this.checkboxStates.get(node.id),\n isCurrentlySelected: this.selectedNodes.has(node.id)\n });\n\n if (!this.provider.useCheckboxSelection) {\n logger.interaction('handleCheckboxChange aborted - useCheckboxSelection is false', node.id);\n return;\n }\n \n // Set the state for this node\n const previousState = this.checkboxStates.get(node.id);\n this.checkboxStates.set(node.id, newState);\n \n logger.stateChange('TreeModel', 'checkboxStates', previousState, newState);\n \n // Update selection based on checkbox state\n const wasSelected = this.selectedNodes.has(node.id);\n if (newState === 'checked') {\n this.selectedNodes.set(node.id, node);\n logger.selection('node added via checkbox', node.id, { \n wasSelected, \n nowSelected: true \n });\n } else {\n this.selectedNodes.delete(node.id);\n logger.selection('node removed via checkbox', node.id, { \n wasSelected, \n nowSelected: false \n });\n }\n \n // If partial selection is allowed, update parent/child relationships\n if (this.provider.allowPartialSelection) {\n logger.debug('Updating parent/child checkbox relationships', { \n component: 'Checkbox',\n nodeId: node.id \n });\n this.updateChildCheckboxes(node, newState);\n this.updateParentCheckboxes(node);\n }\n \n // Notify provider of selection change\n if (this.provider.onSelectionChange) {\n const selectionInfo = {\n selectedNodes: this.selectedNodesArray,\n previousSelection: [],\n selectionType: 'multi' as const,\n trigger: 'click' as const\n };\n \n logger.providerCall('onSelectionChange', {\n selectedCount: selectionInfo.selectedNodes.length,\n trigger: selectionInfo.trigger\n });\n \n this.provider.onSelectionChange(selectionInfo);\n }\n }\n \n /**\n * Update all child checkboxes when parent state changes\n */\n private updateChildCheckboxes(node: TreeNodeData, state: CheckboxState): void {\n logger.debug('updateChildCheckboxes called', { \n component: 'Checkbox',\n nodeId: node.id,\n operation: 'update-children'\n }, { \n parentState: state, \n hasChildren: !!node.children,\n childrenCount: node.children?.length || 0 \n });\n\n if (!node.children || state === 'indeterminate') {\n logger.debug('updateChildCheckboxes skipped', { \n component: 'Checkbox',\n nodeId: node.id \n }, { \n reason: !node.children ? 'no-children' : 'indeterminate-state',\n hasChildren: !!node.children,\n state \n });\n return;\n }\n \n node.children.forEach(child => {\n const previousState = this.checkboxStates.get(child.id);\n this.checkboxStates.set(child.id, state);\n \n logger.debug('updateChildCheckboxes - child updated', { \n component: 'Checkbox',\n nodeId: child.id \n }, { \n previousState, \n newState: state,\n parentNode: node.id \n });\n \n // Update selection\n if (state === 'checked') {\n this.selectedNodes.set(child.id, child);\n logger.selection('child selected via parent', child.id, { parentNode: node.id });\n } else {\n this.selectedNodes.delete(child.id);\n logger.selection('child deselected via parent', child.id, { parentNode: node.id });\n }\n \n // Recursively update grandchildren\n this.updateChildCheckboxes(child, state);\n });\n }\n \n /**\n * Update parent checkbox state based on children\n */\n private updateParentCheckboxes(node: TreeNodeData): void {\n const parent = this.findParentNode(node.id);\n \n logger.debug('updateParentCheckboxes called', { \n component: 'Checkbox',\n nodeId: node.id,\n operation: 'update-parent'\n }, { \n parentFound: !!parent,\n parentId: parent?.id \n });\n\n if (!parent || !parent.children) {\n logger.debug('updateParentCheckboxes skipped', { \n component: 'Checkbox',\n nodeId: node.id \n }, { \n reason: !parent ? 'no-parent' : 'parent-no-children' \n });\n return;\n }\n \n const childStates = parent.children.map(child => this.getCheckboxState(child.id));\n const checkedCount = childStates.filter(state => state === 'checked').length;\n const uncheckedCount = childStates.filter(state => state === 'unchecked').length;\n const indeterminateCount = childStates.filter(state => state === 'indeterminate').length;\n \n logger.debug('updateParentCheckboxes - analyzing children', { \n component: 'Checkbox',\n nodeId: parent.id \n }, { \n totalChildren: parent.children.length,\n checkedCount,\n uncheckedCount,\n indeterminateCount,\n childStates \n });\n \n let parentState: CheckboxState;\n \n if (checkedCount === parent.children.length) {\n // All children checked\n parentState = 'checked';\n } else if (checkedCount === 0 && indeterminateCount === 0) {\n // No children checked or indeterminate\n parentState = 'unchecked';\n } else {\n // Some children checked or indeterminate\n parentState = 'indeterminate';\n }\n \n const previousParentState = this.checkboxStates.get(parent.id);\n this.checkboxStates.set(parent.id, parentState);\n \n logger.debug('updateParentCheckboxes - parent state calculated', { \n component: 'Checkbox',\n nodeId: parent.id \n }, { \n previousState: previousParentState,\n newState: parentState,\n logic: checkedCount === parent.children.length ? 'all-checked' :\n (checkedCount === 0 && indeterminateCount === 0) ? 'none-checked' : 'mixed'\n });\n \n // Update selection based on parent state\n if (parentState === 'checked') {\n this.selectedNodes.set(parent.id, parent);\n logger.selection('parent selected via children', parent.id, { newState: parentState });\n } else {\n this.selectedNodes.delete(parent.id);\n logger.selection('parent deselected via children', parent.id, { newState: parentState });\n }\n \n // Recursively update grandparent\n this.updateParentCheckboxes(parent);\n }\n \n /**\n * Find parent node of a given node ID\n */\n private findParentNode(nodeId: string): TreeNodeData | null {\n const findParent = (nodes: TreeNodeData[], targetId: string, parentNode: TreeNodeData | null = null): TreeNodeData | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return parentNode;\n }\n if (node.children && node.children.length > 0) {\n const parent = findParent(node.children, targetId, node);\n if (parent) return parent;\n }\n }\n return null;\n };\n \n return findParent(this.nodes, nodeId);\n }\n \n // =====================\n // Focus Management & Navigation\n // =====================\n\n /**\n * Set focus to a specific node\n * @param nodeId ID of node to focus\n */\n setFocus(nodeId: string): void {\n if (this.nodeMap.has(nodeId)) {\n this.focusedNode = nodeId;\n }\n }\n\n /**\n * Move focus to next visible node\n */\n focusNext(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n const currentIndex = flatNodes.findIndex(node => node.id === this.focusedNode);\n \n if (currentIndex >= 0 && currentIndex < flatNodes.length - 1) {\n const nextNode = flatNodes[currentIndex + 1];\n if (nextNode) {\n this.focusedNode = nextNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to previous visible node\n */\n focusPrevious(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n const currentIndex = flatNodes.findIndex(node => node.id === this.focusedNode);\n \n if (currentIndex > 0) {\n const prevNode = flatNodes[currentIndex - 1];\n if (prevNode) {\n this.focusedNode = prevNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to first visible node\n */\n focusFirst(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n if (flatNodes.length > 0) {\n const firstNode = flatNodes[0];\n if (firstNode) {\n this.focusedNode = firstNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Move focus to last visible node\n */\n focusLast(): boolean {\n const flatNodes = this.getFlattenedVisibleNodes();\n if (flatNodes.length > 0) {\n const lastNode = flatNodes[flatNodes.length - 1];\n if (lastNode) {\n this.focusedNode = lastNode.id;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get flattened list of all currently visible nodes\n * @private\n */\n private getFlattenedVisibleNodes(): TreeNodeData[] {\n const result: TreeNodeData[] = [];\n \n const processNodes = (nodes: TreeNodeData[]) => {\n for (const node of nodes) {\n result.push(node);\n // Add children if node is expanded\n if (this.isNodeExpanded(node.id) && node.children && node.children.length > 0) {\n processNodes(node.children);\n }\n }\n };\n \n processNodes(this.nodes);\n return result;\n }\n \n // =====================\n // Expansion Actions (placeholder implementations) \n // =====================\n \n /**\n * Expand a specific node\n * @param node Node to expand\n */\n expandNode = flow(function* (this: TreeModel, node: TreeNodeData) {\n logger.expansion('expandNode called', node.id, {\n hasChildren: node.hasChildren,\n currentlyExpanded: this.isNodeExpanded(node.id),\n hasLoadedChildren: !!(node.children && node.children.length > 0)\n });\n\n // Guard: skip if node no longer exists in the tree (stale reference after rename/delete)\n if (!this.nodeMap.has(node.id)) {\n logger.expansion('expandNode skipped - node not in tree', node.id);\n return;\n }\n\n // Set expansion state\n this.expandedNodes.set(node.id, true);\n logger.expansion('expansion state set to true', node.id);\n \n // Notify provider of expansion (if callback exists)\n if (this.provider.onNodeExpansion) {\n logger.providerCall('onNodeExpansion', { nodeId: node.id, expanded: true });\n this.provider.onNodeExpansion(node, true);\n }\n \n // Load children if they haven't been loaded yet\n if (node.hasChildren && (!node.children || node.children.length === 0)) {\n logger.expansion('loading children', node.id, { hasChildren: node.hasChildren });\n this.loadingNodes.set(node.id, true);\n \n try {\n logger.providerCall('loadChildren', { nodeId: node.id });\n const result = yield this.provider.loadChildren(node);\n logger.expansion('children loaded successfully', node.id, { \n childCount: result.nodes.length \n });\n \n // Update the node with children data both in nodeMap and original node\n const existingNode = this.nodeMap.get(node.id);\n if (existingNode) {\n existingNode.children = result.nodes;\n \n // Add children to nodeMap for fast lookups\n result.nodes.forEach((child: TreeNodeData) => {\n this.nodeMap.set(child.id, child);\n });\n }\n \n // Also update the original node object to ensure reactivity\n node.children = result.nodes;\n \n // Update any references to this node in the main nodes array recursively\n const updateNodeInTree = (nodes: TreeNodeData[]): void => {\n for (const treeNode of nodes) {\n if (treeNode.id === node.id) {\n treeNode.children = result.nodes;\n }\n if (treeNode.children) {\n updateNodeInTree(treeNode.children);\n }\n }\n };\n \n updateNodeInTree(this.nodes);\n \n // IMPORTANT: Apply parent's checkbox state to newly loaded children\n if (this.provider.allowPartialSelection && this.provider.useCheckboxSelection) {\n const parentCheckboxState = this.getCheckboxState(node.id);\n \n logger.debug('Applying parent checkbox state to newly loaded children', { \n component: 'Checkbox',\n nodeId: node.id,\n operation: 'children-loaded-inheritance'\n }, { \n parentState: parentCheckboxState,\n childrenCount: result.nodes.length,\n childIds: result.nodes.map((child: TreeNodeData) => child.id)\n });\n \n if (parentCheckboxState === 'checked' || parentCheckboxState === 'unchecked') {\n // Apply parent's state to all newly loaded children\n result.nodes.forEach((child: TreeNodeData) => {\n const previousChildState = this.checkboxStates.get(child.id);\n this.checkboxStates.set(child.id, parentCheckboxState);\n \n logger.debug('Child checkbox state inherited from parent', { \n component: 'Checkbox',\n nodeId: child.id \n }, { \n parentNode: node.id,\n parentState: parentCheckboxState,\n previousChildState,\n newChildState: parentCheckboxState\n });\n \n // Update selection state accordingly\n if (parentCheckboxState === 'checked') {\n this.selectedNodes.set(child.id, child);\n logger.selection('child auto-selected via parent inheritance', child.id, { \n parentNode: node.id \n });\n } else {\n this.selectedNodes.delete(child.id);\n logger.selection('child auto-deselected via parent inheritance', child.id, { \n parentNode: node.id \n });\n }\n \n // Recursively apply to grandchildren if they exist\n if (child.children && child.children.length > 0) {\n this.updateChildCheckboxes(child, parentCheckboxState);\n }\n });\n }\n }\n \n } catch (error) {\n const errorKey = `loadChildren-${node.id}`;\n this.errors.set(errorKey, error instanceof Error ? error : new Error(String(error)));\n \n // Collapse node on error\n this.expandedNodes.set(node.id, false);\n } finally {\n this.loadingNodes.delete(node.id);\n }\n }\n });\n \n /**\n * Collapse a specific node\n * @param node Node to collapse\n */\n collapseNode(node: TreeNodeData): void {\n logger.expansion('collapseNode called', node.id, { \n currentlyExpanded: this.isNodeExpanded(node.id) \n });\n \n // Set collapsed state\n this.expandedNodes.set(node.id, false);\n logger.expansion('expansion state set to false', node.id);\n \n // Notify provider of collapse (if callback exists)\n if (this.provider.onNodeExpansion) {\n logger.providerCall('onNodeExpansion', { nodeId: node.id, expanded: false });\n this.provider.onNodeExpansion(node, false);\n }\n }\n \n /**\n * Toggle expansion state of a specific node\n * @param node Node to toggle\n */\n toggleExpansion(node: TreeNodeData): void {\n if (this.isNodeExpanded(node.id)) {\n this.collapseNode(node);\n } else {\n this.expandNode(node);\n }\n }\n\n // =====================\n // Context Menu Actions\n // =====================\n\n /**\n * Show context menu for a specific node\n * @param node Target node\n * @param event Mouse event\n */\n showContextMenu(node: TreeNodeData, event: MouseEvent): void {\n // Get context menu items from provider\n const menuItems = this.provider.getNodeContextMenu?.(node) || [];\n \n if (menuItems.length === 0) return;\n \n // Set context menu state\n this.contextMenuVisible = true;\n this.contextMenuPosition = { x: event.clientX, y: event.clientY };\n this.contextMenuItems = menuItems;\n this.contextMenuNodes = [node];\n }\n\n /**\n * Show context menu for multiple selected nodes\n * @param nodes Selected nodes\n * @param event Mouse event\n */\n showMultiNodeContextMenu(nodes: TreeNodeData[], event: MouseEvent): void {\n // Get context menu items from provider\n const menuItems = this.provider.getMultiNodeContextMenu?.(nodes) || [];\n \n if (menuItems.length === 0) return;\n \n // Set context menu state\n this.contextMenuVisible = true;\n this.contextMenuPosition = { x: event.clientX, y: event.clientY };\n this.contextMenuItems = menuItems;\n this.contextMenuNodes = nodes;\n }\n\n /**\n * Hide context menu\n */\n hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuItems = [];\n this.contextMenuNodes = [];\n }\n\n /**\n * Handle context menu item click\n * @param menuItem Clicked menu item\n */\n handleContextMenuAction(menuItem: TreeContextMenuItem): void {\n // Call provider callback if available\n if (this.provider.onContextMenuAction) {\n this.provider.onContextMenuAction(menuItem.id, this.contextMenuNodes);\n }\n \n // Hide context menu\n this.hideContextMenu();\n }\n} ","/**\n * TreeCheckbox - 3-state checkbox component for tree selection\n * \n * Supports three states:\n * - unchecked (false): No children selected\n * - checked (true): All children selected \n * - indeterminate (mixed): Some children selected\n */\n\nimport React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Check, Minus } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { logger } from '../utils/logger';\n\nexport type CheckboxState = 'unchecked' | 'checked' | 'indeterminate';\n\nexport interface TreeCheckboxProps {\n /** Current checkbox state */\n state: CheckboxState;\n \n /** Callback when checkbox is clicked */\n onChange: (newState: CheckboxState) => void;\n \n /** Whether the checkbox is disabled */\n disabled?: boolean;\n \n /** Additional CSS classes */\n className?: string;\n \n /** ARIA label for accessibility */\n ariaLabel?: string;\n \n /** Size of the checkbox */\n size?: 'sm' | 'md' | 'lg';\n \n /** Node ID for logging purposes */\n nodeId?: string;\n}\n\n/**\n * TreeCheckbox Component - 3-state checkbox for tree selection\n */\nexport const TreeCheckbox = observer<TreeCheckboxProps>(({\n state,\n onChange,\n disabled = false,\n className,\n ariaLabel,\n size = 'md',\n nodeId = 'unknown'\n}) => {\n logger.rendering('TreeCheckbox', nodeId, { \n state, \n disabled, \n size,\n hasOnChange: !!onChange \n });\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation(); // Prevent node selection\n \n logger.interaction('TreeCheckbox click', nodeId, { \n currentState: state, \n disabled,\n eventType: 'click'\n });\n \n if (disabled) {\n logger.interaction('TreeCheckbox click ignored (disabled)', nodeId);\n return;\n }\n \n // Toggle logic: unchecked -> checked -> unchecked\n // Indeterminate state can only be set programmatically\n const newState = state === 'checked' ? 'unchecked' : 'checked';\n \n logger.interaction('TreeCheckbox state change', nodeId, { \n from: state, \n to: newState,\n trigger: 'click'\n });\n \n onChange(newState);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n \n logger.interaction('TreeCheckbox keydown', nodeId, { \n key: event.key,\n currentState: state \n });\n \n handleClick(event as any);\n }\n };\n\n const sizeClasses = {\n sm: 'w-3 h-3',\n md: 'w-4 h-4', \n lg: 'w-5 h-5'\n };\n\n const iconSizeClasses = {\n sm: 'w-2 h-2',\n md: 'w-3 h-3',\n lg: 'w-4 h-4'\n };\n\n const computedClasses = cn(\n 'flex items-center justify-center rounded border cursor-pointer transition-all',\n 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-1',\n sizeClasses[size],\n // Base styles\n 'border-border bg-background',\n // State-specific styles\n state === 'checked' && 'bg-primary border-primary text-primary-foreground',\n state === 'indeterminate' && 'bg-primary border-primary text-primary-foreground',\n state === 'unchecked' && 'hover:border-primary/50',\n // Disabled styles\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none',\n className\n );\n\n logger.cssClasses(`TreeCheckbox-${nodeId}`, computedClasses, state === 'checked', false);\n\n return (\n <div\n role=\"checkbox\"\n aria-checked={state === 'indeterminate' ? 'mixed' : state === 'checked'}\n aria-label={ariaLabel}\n className={computedClasses}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : 0}\n >\n {state === 'checked' && (\n <Check className={cn(iconSizeClasses[size], 'stroke-[3]')} />\n )}\n {state === 'indeterminate' && (\n <Minus className={cn(iconSizeClasses[size], 'stroke-[3]')} />\n )}\n </div>\n );\n}); ","/**\n * TreeNodeList - Recursive component for rendering tree node lists\n * \n * This component handles the recursive rendering of tree nodes and their children,\n * providing proper indentation and hierarchy visualization.\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { ChevronRight, ChevronDown, Loader2, MoreVertical } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { resolveIcon } from '../../icons/iconMap';\nimport { TreeCheckbox } from './TreeCheckbox';\nimport { getSelectionClasses, getCustomColorVariables, DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\nimport type { TreeNodeData } from '../types/TreeTypes';\nimport type { TreeModel } from '../models/TreeModel';\nimport { logger } from '../utils/logger';\nimport { useFileBrowserContext } from '../../file-browser/context/FileBrowserContext';\n\n// Inline rename input for tree nodes\nconst TreeInlineRename: React.FC<{\n currentName: string;\n onCommit: (newName: string) => void;\n onCancel: () => void;\n}> = ({ currentName, onCommit, onCancel }) => {\n const [value, setValue] = useState(currentName);\n const inputRef = useRef<HTMLInputElement>(null);\n const mountTimeRef = useRef(Date.now());\n const committedRef = useRef(false);\n\n useEffect(() => {\n mountTimeRef.current = Date.now();\n const raf = requestAnimationFrame(() => {\n const input = inputRef.current;\n if (input) {\n input.focus();\n const dotIndex = currentName.lastIndexOf('.');\n input.setSelectionRange(0, dotIndex > 0 ? dotIndex : currentName.length);\n }\n });\n return () => cancelAnimationFrame(raf);\n }, [currentName]);\n\n const commit = () => {\n if (committedRef.current) return;\n committedRef.current = true;\n const trimmed = value.trim();\n if (trimmed && trimmed !== currentName) {\n onCommit(trimmed);\n } else {\n onCancel();\n }\n };\n\n const handleBlur = () => {\n if (Date.now() - mountTimeRef.current < 200) return;\n commit();\n };\n\n return (\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') { e.preventDefault(); commit(); }\n if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n onBlur={handleBlur}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n className=\"flex-1 bg-background border border-primary rounded px-1 py-0 text-[13px] outline-none min-w-0\"\n />\n );\n};\n\nexport interface TreeNodeListProps {\n /** Tree nodes to render */\n nodes: TreeNodeData[];\n /** Tree model instance */\n treeModel: TreeModel;\n /** Current depth level (for indentation) */\n depth?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * TreeNodeList component renders a list of tree nodes with proper nesting and interaction\n */\nexport const TreeNodeList = observer<TreeNodeListProps>(({\n nodes,\n treeModel,\n depth = 0,\n className\n}) => {\n const fileBrowserCtx = useFileBrowserContext();\n\n const renderNode = (node: TreeNodeData) => {\n const isSelected = treeModel.isNodeSelected(node.id);\n const isExpanded = treeModel.isNodeExpanded(node.id);\n const isFocused = treeModel.focusedNode === node.id;\n const isLoading = treeModel.isNodeLoading(node.id);\n const isDirectory = node.type === 'directory';\n const hasChildren = node.hasChildren || (node.children && node.children.length > 0);\n const showCheckbox = treeModel.provider.useCheckboxSelection;\n const [isHovered, setIsHovered] = useState(false);\n const isRenaming = fileBrowserCtx?.renameState?.itemId === node.id && fileBrowserCtx?.renameState?.source === 'tree';\n\n // Get selection theme\n const selectionTheme = treeModel.provider.getSelectionTheme?.() || DEFAULT_SELECTION_THEME;\n\n const nodeClasses = cn(\n // Base styles\n 'group flex items-center gap-2 py-1 px-2 text-[13px] cursor-default select-none transition-colors duration-150',\n 'focus:outline-none',\n\n // Selection styling - must come before hover so selected state is visible\n isSelected\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-muted/50',\n\n // Focus styles\n isFocused && !isSelected && 'ring-1 ring-primary/50',\n );\n\n // Handle node click\n const handleNodeClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n logger.interaction('TreeNode clicked', node.id, { name: node.name });\n \n if (event.ctrlKey || event.metaKey) {\n // Multi-select with Ctrl/Cmd\n if (treeModel.provider.isMultiSelectEnabled) {\n if (isSelected) {\n treeModel.deselectNode(node);\n } else {\n treeModel.selectNode(node);\n }\n }\n } else {\n // Single select\n if (!isSelected) {\n treeModel.selectNode(node);\n }\n }\n };\n\n // Handle expand/collapse click\n const handleExpandClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n logger.interaction('TreeNode expand/collapse clicked', node.id, { name: node.name });\n \n if (hasChildren) {\n treeModel.toggleExpansion(node);\n }\n };\n\n // Handle context menu (right-click)\n const handleContextMenu = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n logger.interaction('TreeNode context menu', node.id, { name: node.name });\n \n // Don't change selection on right-click, but ensure we show menu for this node\n if (!isSelected && treeModel.selectedNodesArray.length <= 1) {\n treeModel.selectNode(node);\n }\n \n // Show context menu at cursor position\n const rect = { x: event.clientX, y: event.clientY };\n \n // Check if this node is part of a multi-selection\n const selectedNodes = treeModel.selectedNodesArray;\n if (selectedNodes.length > 1 && isSelected) {\n treeModel.showMultiNodeContextMenu(selectedNodes, event.nativeEvent);\n } else {\n treeModel.showContextMenu(node, event.nativeEvent);\n }\n };\n\n // Handle menu button click - shows context menu without changing selection\n const handleMenuButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n logger.interaction('TreeNode menu button clicked', node.id, { name: node.name });\n\n // Show context menu positioned near the button\n const rect = event.currentTarget.getBoundingClientRect();\n const fakeEvent = new MouseEvent('contextmenu', {\n clientX: rect.right - 10,\n clientY: rect.bottom,\n bubbles: true,\n cancelable: true\n });\n\n // If this node is part of a multi-selection, show multi-menu\n const selectedNodes = treeModel.selectedNodesArray;\n if (selectedNodes.length > 1 && isSelected) {\n treeModel.showMultiNodeContextMenu(selectedNodes, fakeEvent);\n } else {\n // Show menu for this specific node without changing selection\n treeModel.showContextMenu(node, fakeEvent);\n }\n };\n\n const iconSize = 'w-4 h-4';\n\n // Get custom icon from provider\n const renderIcon = () => {\n // Try to get custom icon from provider first\n const customIcon = treeModel.provider.getNodeIcon?.(node);\n if (customIcon) {\n if (typeof customIcon === 'string') {\n return resolveIcon(customIcon, iconSize);\n } else {\n const IconComponent = customIcon;\n return <IconComponent className={iconSize} />;\n }\n }\n\n // Default icons via shared icon map\n if (isDirectory) {\n return resolveIcon(isExpanded ? 'folder-open' : 'folder', iconSize);\n } else {\n return resolveIcon('file', iconSize);\n }\n };\n\n return (\n <div key={node.id} className=\"w-full\">\n {/* Node */}\n <div\n className={nodeClasses}\n style={{ paddingLeft: `${depth * 20 + 8}px` }}\n onClick={handleNodeClick}\n onContextMenu={handleContextMenu}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={isFocused ? 0 : -1}\n role=\"treeitem\"\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n aria-level={depth + 1}\n aria-label={`${node.type === 'directory' ? 'Folder' : 'File'}: ${node.name}`}\n >\n {/* Expand/Collapse Button */}\n <div className=\"flex-shrink-0 w-4 h-4\">\n {hasChildren && (\n <button\n className=\"w-4 h-4 flex items-center justify-center hover:bg-muted rounded-sm transition-colors\"\n onClick={handleExpandClick}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n >\n {isLoading ? (\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n ) : isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </div>\n\n {/* Checkbox (if enabled) */}\n {showCheckbox && (\n <TreeCheckbox\n state={treeModel.getCheckboxState(node.id)}\n onChange={(newState) => {\n logger.interaction('TreeCheckbox changed', node.id, { name: node.name, newState });\n treeModel.handleCheckboxChange(node, newState);\n }}\n nodeId={node.id}\n />\n )}\n\n {/* Icon */}\n <div className=\"flex-shrink-0 w-4 h-4\">\n {renderIcon()}\n </div>\n\n {/* Node Name */}\n {isRenaming && fileBrowserCtx ? (\n <TreeInlineRename\n currentName={fileBrowserCtx.renameState!.currentName}\n onCommit={fileBrowserCtx.onRenameCommit}\n onCancel={fileBrowserCtx.onRenameCancel}\n />\n ) : (\n <span className=\"flex-1 truncate\">\n {node.name}\n </span>\n )}\n\n {/* Menu Button - positioned on the right */}\n <button\n className={cn(\n 'flex-shrink-0 w-6 h-6 flex items-center justify-center rounded hover:bg-muted/70 transition-colors cursor-pointer',\n // Show on hover or when node is selected\n 'opacity-0 group-hover:opacity-100',\n (isSelected || isHovered) && 'opacity-100'\n )}\n onClick={handleMenuButtonClick}\n aria-label=\"Show context menu\"\n >\n <MoreVertical className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Children */}\n {isExpanded && hasChildren && node.children && (\n <TreeNodeList\n nodes={node.children}\n treeModel={treeModel}\n depth={depth + 1}\n className={className}\n />\n )}\n </div>\n );\n };\n\n return (\n <div className={cn('w-full', className)}>\n {nodes.map(renderNode)}\n </div>\n );\n});\n","import React, { useEffect, useRef } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { TreeContextMenuItem } from '../types/TreeTypes';\n\n/**\n * Props for the TreeContextMenu component\n */\nexport interface TreeContextMenuProps {\n /**\n * Menu items to display\n */\n items: TreeContextMenuItem[];\n \n /**\n * Position of the context menu\n */\n position: { x: number; y: number };\n \n /**\n * Whether the menu is visible\n */\n visible: boolean;\n \n /**\n * Callback when menu is closed\n */\n onClose: () => void;\n \n /**\n * Callback when menu item is clicked\n */\n onItemClick: (menuItem: TreeContextMenuItem) => void;\n \n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * TreeContextMenu - Context menu component for tree nodes\n * \n * Features:\n * - Renders context menu items with proper styling (no icons)\n * - Handles click outside to close\n * - Supports separators and disabled items\n * - Positioned absolutely at cursor position\n * - Keyboard navigation support\n */\nexport const TreeContextMenu = observer<TreeContextMenuProps>(({\n items,\n position,\n visible,\n onClose,\n onItemClick,\n className = ''\n}) => {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Handle click outside to close menu\n useEffect(() => {\n if (!visible) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n onClose();\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [visible, onClose]);\n\n const handleItemClick = (item: TreeContextMenuItem, event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (item.disabled) return;\n\n onItemClick(item);\n onClose();\n };\n\n if (!visible) return null;\n\n return (\n <div\n ref={menuRef}\n className={`\n bg-popover text-popover-foreground rounded-md border p-1 shadow-md min-w-[160px]\n fixed z-[100]\n ${className}\n `}\n style={{\n left: position.x,\n top: position.y,\n }}\n role=\"menu\"\n aria-label=\"Context menu\"\n >\n {items.map((item, index) => (\n <React.Fragment key={item.id}>\n <div\n className={`\n px-2 py-1.5 text-sm cursor-default hover:bg-accent hover:text-accent-foreground\n flex items-center rounded-sm transition-colors duration-150\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n onClick={(e) => handleItemClick(item, e)}\n role=\"menuitem\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n >\n <span className=\"flex-1\">{item.label}</span>\n </div>\n \n {item.separator && index < items.length - 1 && (\n <div className=\"h-px bg-border my-1\" role=\"separator\" />\n )}\n </React.Fragment>\n ))}\n </div>\n );\n});\n\nTreeContextMenu.displayName = 'TreeContextMenu';\n\nexport default TreeContextMenu; ","/**\n * Tree - Main tree component that renders nodes and manages UI states\n * \n * This component follows the observer pattern to react to TreeModel changes.\n * It handles loading states, errors, and renders the tree structure.\n */\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { TreeModel } from '../models/TreeModel';\nimport { TreeNodeList } from './TreeNodeList';\nimport { TreeContextMenu } from './TreeContextMenu';\nimport type { TreeProvider } from '../providers/TreeProvider';\nimport type { TreeLoadOptions, TreeNodeData } from '../types/TreeTypes';\n\nexport interface TreeProps {\n /** Provider that supplies tree data and operations */\n provider: TreeProvider;\n\n /** Optional pre-created TreeModel (if provided, component won't create its own) */\n model?: TreeModel;\n\n /** Optional loading options to pass to the provider */\n loadOptions?: TreeLoadOptions;\n\n /** Additional CSS classes to apply to the tree container */\n className?: string;\n}\n\n/**\n * Tree Component - Reactive tree display with loading states\n *\n * This is the main tree component that:\n * - Creates and manages TreeModel\n * - Shows loading/error states\n * - Renders tree nodes\n * - Follows MobX observer pattern for reactivity\n * - Handles keyboard navigation\n */\nexport const Tree = observer<TreeProps>(({ provider, model, loadOptions, className }) => {\n const [internalModel] = useState(() => model || new TreeModel(provider));\n const treeModel = model || internalModel;\n const treeRef = useRef<HTMLDivElement>(null);\n\n // Load data on mount and when loadOptions change (only if using internal model)\n useEffect(() => {\n if (!model) {\n treeModel.loadNodes(loadOptions);\n }\n }, [treeModel, loadOptions, model]);\n\n // Get flattened list of all visible nodes for navigation\n const getFlattenedNodes = (): TreeNodeData[] => {\n const result: TreeNodeData[] = [];\n \n const processNodes = (nodes: TreeNodeData[]) => {\n for (const node of nodes) {\n result.push(node);\n // Add children if node is expanded\n if (treeModel.isNodeExpanded(node.id) && node.children && node.children.length > 0) {\n processNodes(node.children);\n }\n }\n };\n \n processNodes(treeModel.nodes);\n return result;\n };\n\n // Navigate to node by index in flattened list\n const navigateToNode = (targetIndex: number) => {\n const flatNodes = getFlattenedNodes();\n if (targetIndex >= 0 && targetIndex < flatNodes.length) {\n const targetNode = flatNodes[targetIndex];\n if (targetNode) {\n treeModel.focusedNode = targetNode.id;\n // Also select the node (following common tree behavior)\n treeModel.selectNode(targetNode);\n }\n }\n };\n\n // Find current focused node index\n const getCurrentNodeIndex = (): number => {\n if (!treeModel.focusedNode) return -1;\n const flatNodes = getFlattenedNodes();\n return flatNodes.findIndex(node => node.id === treeModel.focusedNode);\n };\n\n // Get parent node of current focused node\n const getParentNode = (nodeId: string): TreeNodeData | null => {\n const findParent = (nodes: TreeNodeData[], targetId: string, parentNode: TreeNodeData | null = null): TreeNodeData | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return parentNode;\n }\n if (node.children && node.children.length > 0) {\n const parent = findParent(node.children, targetId, node);\n if (parent) return parent;\n }\n }\n return null;\n };\n \n return findParent(treeModel.nodes, nodeId);\n };\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n // Only handle if tree is focused or if we have a focused node\n if (!treeRef.current?.contains(document.activeElement) && !treeModel.focusedNode) {\n return;\n }\n\n const currentIndex = getCurrentNodeIndex();\n const flatNodes = getFlattenedNodes();\n const currentNode = treeModel.focusedNode ? treeModel.nodeMap.get(treeModel.focusedNode) : null;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (currentIndex < flatNodes.length - 1) {\n navigateToNode(currentIndex + 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (currentIndex > 0) {\n navigateToNode(currentIndex - 1);\n }\n break;\n\n case 'ArrowRight':\n event.preventDefault();\n if (currentNode) {\n if (currentNode.hasChildren || (currentNode.children && currentNode.children.length > 0)) {\n if (!treeModel.isNodeExpanded(currentNode.id)) {\n // Expand the node\n treeModel.expandNode(currentNode);\n } else if (currentNode.children && currentNode.children.length > 0) {\n // Move to first child\n const firstChild = currentNode.children[0];\n if (firstChild) {\n treeModel.focusedNode = firstChild.id;\n treeModel.selectNode(firstChild);\n }\n }\n }\n }\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n if (currentNode) {\n if (treeModel.isNodeExpanded(currentNode.id) && (currentNode.hasChildren || (currentNode.children && currentNode.children.length > 0))) {\n // Collapse the node\n treeModel.collapseNode(currentNode);\n } else {\n // Move to parent node\n const parentNode = getParentNode(currentNode.id);\n if (parentNode) {\n treeModel.focusedNode = parentNode.id;\n treeModel.selectNode(parentNode);\n }\n }\n }\n break;\n\n case 'Home':\n event.preventDefault();\n if (flatNodes.length > 0) {\n navigateToNode(0);\n }\n break;\n\n case 'End':\n event.preventDefault();\n if (flatNodes.length > 0) {\n navigateToNode(flatNodes.length - 1);\n }\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (currentNode) {\n if (currentNode.hasChildren || (currentNode.children && currentNode.children.length > 0)) {\n treeModel.toggleExpansion(currentNode);\n }\n }\n break;\n\n case 'a':\n // Ctrl+A or Cmd+A to select all (when multi-select is enabled)\n if ((event.ctrlKey || event.metaKey) && treeModel.provider.isMultiSelectEnabled) {\n event.preventDefault();\n treeModel.selectAll();\n }\n break;\n \n case 'Escape':\n event.preventDefault();\n treeModel.clearSelection();\n treeModel.hideContextMenu();\n break;\n\n default:\n // Let other keys pass through\n break;\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [treeModel]);\n\n // Auto-focus first node if no node is focused and we have nodes\n useEffect(() => {\n if (!treeModel.focusedNode && treeModel.hasNodes && treeModel.nodes.length > 0) {\n const firstNode = treeModel.nodes[0];\n if (firstNode) {\n treeModel.focusedNode = firstNode.id;\n }\n }\n }, [treeModel.hasNodes, treeModel.nodes.length, treeModel.focusedNode]);\n \n return (\n <div \n ref={treeRef}\n className={`h-full overflow-hidden focus-within:outline-none ${className || ''}`}\n tabIndex={0}\n role=\"tree\"\n aria-label=\"File tree\"\n >\n {treeModel.isLoading && (\n <div className=\"p-4 text-center text-muted-foreground\" role=\"status\" aria-live=\"polite\">\n <div className=\"inline-flex items-center gap-2\">\n <div className=\"w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin\" />\n <span>Loading tree...</span>\n </div>\n </div>\n )}\n \n {!treeModel.isLoading && treeModel.errors.size > 0 && (\n <div className=\"p-4 text-red-600 bg-red-50 border-l-4 border-red-400\" role=\"alert\">\n {Array.from(treeModel.errors.entries()).map(([key, error]) => (\n <div key={key} className=\"flex items-start gap-2\">\n <span className=\"font-semibold\">Error:</span>\n <span>{error.message}</span>\n </div>\n ))}\n </div>\n )}\n \n {!treeModel.isLoading && treeModel.errors.size === 0 && !treeModel.hasNodes && (\n <div className=\"p-4 text-center text-muted-foreground\" role=\"status\">\n <span>No items to display</span>\n </div>\n )}\n \n {!treeModel.isLoading && treeModel.hasNodes && (\n <div className=\"h-full overflow-auto\">\n <TreeNodeList \n treeModel={treeModel}\n nodes={treeModel.nodes}\n depth={0}\n />\n </div>\n )}\n \n {/* Context Menu */}\n <TreeContextMenu\n items={treeModel.contextMenuItems}\n position={treeModel.contextMenuPosition}\n visible={treeModel.contextMenuVisible}\n onClose={() => treeModel.hideContextMenu()}\n onItemClick={(menuItem) => treeModel.handleContextMenuAction(menuItem)}\n />\n </div>\n );\n}); ","/**\n * TreeTable - Table component for displaying tree data in tabular format\n * \n * Provides a table view of tree data with:\n * - Hierarchical indentation in tree column\n * - Sortable columns\n * - Filterable columns \n * - Export functionality\n * - Expand/collapse support\n * - Selection support\n */\n\nimport React, { useMemo, useCallback, useState } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { ChevronRight, ChevronDown, ArrowUp, ArrowDown, ArrowUpDown, Download, Search } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport { getSelectionClasses, getCustomColorVariables, DEFAULT_SELECTION_THEME } from '../utils/SelectionTheme';\nimport type { TreeModel } from '../models/TreeModel';\nimport type { TreeTableColumn, TreeNodeData } from '../types/TreeTypes';\n\nexport interface TreeTableProps {\n /** The tree model managing state */\n treeModel: TreeModel;\n \n /** Table columns configuration */\n columns?: TreeTableColumn[];\n \n /** Enable animations for expand/collapse transitions */\n enableAnimations?: boolean;\n \n /** Additional CSS classes */\n className?: string;\n \n /** Whether to show export functionality */\n enableExport?: boolean;\n \n /** Whether to enable filtering */\n enableFiltering?: boolean;\n \n /** Whether to enable sorting */\n enableSorting?: boolean;\n}\n\n/**\n * TreeTable Component - Table view of tree data\n */\nexport const TreeTable = observer<TreeTableProps>(({\n treeModel,\n columns: propColumns,\n enableAnimations = true,\n className,\n enableExport = true,\n enableFiltering = false,\n enableSorting = true\n}) => {\n const [sortColumn, setSortColumn] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n const [filters, setFilters] = useState<Record<string, string>>({});\n \n // Default columns if none provided\n const defaultColumns: TreeTableColumn[] = useMemo(() => [\n {\n id: 'name',\n label: 'Name',\n dataKey: 'name',\n width: '100%',\n sortable: true,\n filterable: true,\n isTreeColumn: true\n }\n ], []);\n \n const columns = propColumns || defaultColumns;\n const isHeaderVisible = columns.length > 1 || enableFiltering || enableExport;\n \n // Flatten the tree into a list for table rendering\n const tableData = useMemo(() => {\n const flattenNode = (node: TreeNodeData, level: number = 0): Array<{ node: TreeNodeData; level: number }> => {\n const result = [{ node, level }];\n \n if (treeModel.isNodeExpanded(node.id) && node.children) {\n for (const child of node.children) {\n result.push(...flattenNode(child, level + 1));\n }\n }\n \n return result;\n };\n \n let data: Array<{ node: TreeNodeData; level: number }> = [];\n const rootNodes = treeModel.nodes;\n \n for (const node of rootNodes) {\n data.push(...flattenNode(node));\n }\n \n // Apply filters\n if (Object.values(filters).some(f => f.trim())) {\n data = data.filter(({ node }) => {\n return Object.entries(filters).every(([columnKey, filterValue]) => {\n if (!filterValue.trim()) return true;\n \n const column = columns.find(c => c.id === columnKey);\n if (!column) return true;\n \n let cellValue = '';\n if (column.renderCell) {\n // If custom renderer, use it to get the text value\n const rendered = column.renderCell((node as any)[column.dataKey], node);\n cellValue = typeof rendered === 'string' ? rendered : String(rendered || '');\n } else if (column.formatValue) {\n cellValue = column.formatValue((node as any)[column.dataKey], node);\n } else {\n cellValue = (node as any)[column.dataKey]?.toString() || '';\n }\n \n return cellValue.toLowerCase().includes(filterValue.toLowerCase());\n });\n });\n }\n \n // Apply sorting\n if (sortColumn) {\n const column = columns.find(c => c.id === sortColumn);\n if (column) {\n data.sort((a, b) => {\n let aValue = '';\n let bValue = '';\n \n if (column.formatValue) {\n aValue = column.formatValue((a.node as any)[column.dataKey], a.node);\n bValue = column.formatValue((b.node as any)[column.dataKey], b.node);\n } else {\n aValue = (a.node as any)[column.dataKey]?.toString() || '';\n bValue = (b.node as any)[column.dataKey]?.toString() || '';\n }\n \n const compareResult = aValue.localeCompare(bValue);\n return sortDirection === 'asc' ? compareResult : -compareResult;\n });\n }\n }\n \n return data;\n }, [treeModel.nodes, sortColumn, sortDirection, filters, columns, treeModel]);\n \n const handleSort = useCallback((columnKey: string) => {\n if (sortColumn === columnKey) {\n setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');\n } else {\n setSortColumn(columnKey);\n setSortDirection('asc');\n }\n }, [sortColumn]);\n \n const handleExport = useCallback(() => {\n const csvContent = [\n // Header\n columns.map(col => col.label).join(','),\n // Rows\n ...tableData.map(({ node }) => \n columns.map(col => {\n let value = '';\n if (col.formatValue) {\n value = col.formatValue((node as any)[col.dataKey], node);\n } else {\n value = (node as any)[col.dataKey]?.toString() || '';\n }\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }).join(',')\n )\n ].join('\\n');\n \n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = 'tree-data.csv';\n link.click();\n }, [tableData, columns]);\n\n const selectionTheme = treeModel.provider.getSelectionTheme?.() || DEFAULT_SELECTION_THEME;\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Header with controls */}\n {isHeaderVisible && (\n <div className=\"flex-shrink-0 p-3 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2\">\n {enableFiltering && (\n <div className=\"flex items-center gap-2\">\n <Search className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Filter:</span>\n {columns.filter(c => c.filterable).map(column => (\n <input\n key={column.id}\n type=\"text\"\n placeholder={`Filter ${column.label}`}\n value={filters[column.id] || ''}\n onChange={(e) => setFilters(prev => ({ ...prev, [column.id]: e.target.value }))}\n className=\"px-2 py-1 text-sm border rounded-md w-32\"\n />\n ))}\n </div>\n )}\n </div>\n \n {enableExport && (\n <button\n onClick={handleExport}\n className=\"flex items-center gap-2 px-3 py-1 text-sm bg-primary text-primary-foreground rounded-md hover:bg-primary/90\"\n >\n <Download className=\"w-4 h-4\" />\n Export CSV\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Table content */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"min-w-full\">\n {/* Column headers - only show if more than one column */}\n {columns.length > 1 && (\n <div className=\"sticky top-0 bg-background border-b z-10\">\n <div className=\"flex\">\n {columns.map((column) => (\n <div\n key={column.id}\n className={cn(\n 'px-2 py-2 text-sm font-medium text-muted-foreground',\n column.sortable && enableSorting && 'cursor-pointer hover:text-foreground',\n 'flex items-center gap-1'\n )}\n style={{ width: column.width }}\n onClick={() => column.sortable && enableSorting && handleSort(column.id)}\n >\n <span>{column.label}</span>\n {column.sortable && enableSorting && (\n <div className=\"ml-auto\">\n {sortColumn === column.id ? (\n sortDirection === 'asc' ? (\n <ArrowUp className=\"w-3 h-3\" />\n ) : (\n <ArrowDown className=\"w-3 h-3\" />\n )\n ) : (\n <ArrowUpDown className=\"w-3 h-3 opacity-50\" />\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Rows */}\n <div>\n {tableData.length === 0 ? (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {Object.values(filters).some(f => f.trim()) ? 'No results found for current filters' : 'No data available'}\n </p>\n </div>\n ) : (\n tableData.map(({ node, level }) => {\n const isSelected = treeModel.isNodeSelected(node.id);\n const isFocused = treeModel.focusedNode === node.id;\n const isExpanded = treeModel.isNodeExpanded(node.id);\n const hasChildren = node.hasChildren || (node.children && node.children.length > 0);\n const useCheckboxes = treeModel.provider.useCheckboxSelection;\n const customColorVars = getCustomColorVariables(selectionTheme);\n\n return (\n <div\n key={node.id}\n className={cn(\n 'flex w-full cursor-pointer group',\n getSelectionClasses(selectionTheme, isSelected, isFocused, !!useCheckboxes),\n useCheckboxes && 'select-none'\n )}\n style={customColorVars}\n onClick={(event) => {\n if (useCheckboxes) return;\n \n const isMultiSelectKeyPressed = event.ctrlKey || event.metaKey;\n \n if (treeModel.provider.isMultiSelectEnabled && isMultiSelectKeyPressed) {\n // Toggle selection for multi-select mode with Ctrl/Cmd\n if (isSelected) {\n treeModel.deselectNode(node);\n } else {\n treeModel.selectNode(node);\n }\n } else {\n // Single click without modifier\n if (treeModel.provider.isMultiSelectEnabled) {\n // In multi-select mode, single click replaces selection\n treeModel.clearSelection();\n treeModel.selectNode(node);\n } else {\n // In single-select mode, toggle selection\n if (isSelected) {\n treeModel.clearSelection();\n } else {\n treeModel.selectNode(node);\n }\n }\n }\n }}\n onDoubleClick={() => hasChildren && treeModel.toggleExpansion(node)}\n >\n {columns.map((column, columnIndex) => {\n let cellContent: React.ReactNode = '';\n \n if (column.renderCell) {\n cellContent = column.renderCell((node as any)[column.dataKey], node);\n } else if (column.formatValue) {\n cellContent = column.formatValue((node as any)[column.dataKey], node);\n } else {\n cellContent = (node as any)[column.dataKey]?.toString() || '';\n }\n\n // For tree column, add indentation and controls\n if (column.isTreeColumn) {\n return (\n <div\n key={column.id}\n className=\"flex items-center px-2 py-1 text-sm\"\n style={{ width: column.width }}\n >\n {/* Indentation */}\n <div style={{ width: level * 16 }} className=\"flex-shrink-0\" />\n\n {/* Expand/Collapse Icon */}\n <div className=\"flex-shrink-0 w-4 h-4 mr-1\">\n {hasChildren && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n treeModel.toggleExpansion(node);\n }}\n className=\"w-4 h-4 flex items-center justify-center transition-transform duration-200 hover:bg-accent/20\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </div>\n\n {/* Content */}\n <span className=\"flex-1 truncate\">{cellContent}</span>\n </div>\n );\n }\n\n // Regular column\n return (\n <div\n key={column.id}\n className=\"px-2 py-1 text-sm truncate\"\n style={{ width: column.width }}\n >\n {cellContent}\n </div>\n );\n })}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}); "],"mappings":"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"}
|