@anymux/ui-kit 0.1.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/ExplorerLayout-CSIJd7N4.js +105 -0
- package/dist/ExplorerLayout-CSIJd7N4.js.map +1 -0
- package/dist/FileBrowserContext-B6jixa2j.js +11 -0
- package/dist/FileBrowserContext-B6jixa2j.js.map +1 -0
- package/dist/calendar-DSlrbHoj.js +761 -0
- package/dist/calendar-DSlrbHoj.js.map +1 -0
- package/dist/calendar.d.ts +3 -0
- package/dist/calendar.js +3 -0
- package/dist/contacts-DQXTZzHc.js +539 -0
- package/dist/contacts-DQXTZzHc.js.map +1 -0
- package/dist/contacts.d.ts +3 -0
- package/dist/contacts.js +3 -0
- package/dist/file-browser-m5atC3kF.js +6755 -0
- package/dist/file-browser-m5atC3kF.js.map +1 -0
- package/dist/file-browser.d.ts +11 -0
- package/dist/file-browser.js +9 -0
- package/dist/git-B55e6LL-.js +561 -0
- package/dist/git-B55e6LL-.js.map +1 -0
- package/dist/git.d.ts +2 -0
- package/dist/git.js +3 -0
- package/dist/iconMap-V4B8P-Uh.js +206 -0
- package/dist/iconMap-V4B8P-Uh.js.map +1 -0
- package/dist/icons-CIsIOZXR.js +0 -0
- package/dist/icons.d.ts +2 -0
- package/dist/icons.js +4 -0
- package/dist/index-BNmNIWBL.d.ts +71 -0
- package/dist/index-BNmNIWBL.d.ts.map +1 -0
- package/dist/index-Bryv_GCG.d.ts +1481 -0
- package/dist/index-Bryv_GCG.d.ts.map +1 -0
- package/dist/index-CuQIjSXs.d.ts +134 -0
- package/dist/index-CuQIjSXs.d.ts.map +1 -0
- package/dist/index-DSu19mq0.d.ts +153 -0
- package/dist/index-DSu19mq0.d.ts.map +1 -0
- package/dist/index-DmsyeHFr.d.ts +149 -0
- package/dist/index-DmsyeHFr.d.ts.map +1 -0
- package/dist/index-DxnJ8FYM.d.ts +17 -0
- package/dist/index-DxnJ8FYM.d.ts.map +1 -0
- package/dist/index-DzfY1Tok.d.ts +32 -0
- package/dist/index-DzfY1Tok.d.ts.map +1 -0
- package/dist/index-Ml_SgiKa.d.ts +1847 -0
- package/dist/index-Ml_SgiKa.d.ts.map +1 -0
- package/dist/index-kHr9udZD.d.ts +1025 -0
- package/dist/index-kHr9udZD.d.ts.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +15 -0
- package/dist/layout-Ca_4r8ka.js +89 -0
- package/dist/layout-Ca_4r8ka.js.map +1 -0
- package/dist/layout.d.ts +2 -0
- package/dist/layout.js +5 -0
- package/dist/list-CxfT6hix.js +6831 -0
- package/dist/list-CxfT6hix.js.map +1 -0
- package/dist/list.d.ts +2 -0
- package/dist/list.js +5 -0
- package/dist/media-DZ292aKK.js +557 -0
- package/dist/media-DZ292aKK.js.map +1 -0
- package/dist/media.d.ts +3 -0
- package/dist/media.js +3 -0
- package/dist/tree-Dd9Z0Aso.js +3351 -0
- package/dist/tree-Dd9Z0Aso.js.map +1 -0
- package/dist/tree.d.ts +2 -0
- package/dist/tree.js +6 -0
- package/dist/types-common-CB3kRek8.d.ts +26 -0
- package/dist/types-common-CB3kRek8.d.ts.map +1 -0
- package/dist/utils-B4fdKKsy.js +3 -0
- package/package.json +109 -0
- package/src/calendar/AgendaView.tsx +37 -0
- package/src/calendar/CalendarBrowser.tsx +90 -0
- package/src/calendar/CalendarModel.ts +142 -0
- package/src/calendar/CalendarSidebar.tsx +81 -0
- package/src/calendar/DayView.tsx +76 -0
- package/src/calendar/EventCard.tsx +51 -0
- package/src/calendar/MockCalendarProvider.ts +98 -0
- package/src/calendar/MonthView.tsx +77 -0
- package/src/calendar/WeekView.tsx +129 -0
- package/src/calendar/index.ts +18 -0
- package/src/calendar/types.ts +25 -0
- package/src/contacts/ContactAvatar.tsx +35 -0
- package/src/contacts/ContactBrowser.tsx +56 -0
- package/src/contacts/ContactCard.tsx +37 -0
- package/src/contacts/ContactDetail.tsx +63 -0
- package/src/contacts/ContactGroupSidebar.tsx +40 -0
- package/src/contacts/ContactList.tsx +32 -0
- package/src/contacts/ContactListModel.ts +120 -0
- package/src/contacts/MockContactProvider.ts +77 -0
- package/src/contacts/index.ts +17 -0
- package/src/contacts/types.ts +26 -0
- package/src/demos/CalendarBrowserDemo.tsx +15 -0
- package/src/demos/ContactBrowserDemo.tsx +15 -0
- package/src/demos/MediaBrowserDemo.tsx +15 -0
- package/src/file-browser/adapters/DocumentViewerAdapter.ts +371 -0
- package/src/file-browser/adapters/FileSystemBridge.ts +168 -0
- package/src/file-browser/adapters/GitBrowserAdapter.ts +546 -0
- package/src/file-browser/adapters/README.md +504 -0
- package/src/file-browser/adapters/index.ts +27 -0
- package/src/file-browser/adapters/types.ts +70 -0
- package/src/file-browser/architecture.md +645 -0
- package/src/file-browser/components/CreateItemDialog.tsx +71 -0
- package/src/file-browser/components/DeleteConfirmDialog.tsx +58 -0
- package/src/file-browser/components/FileBrowser.tsx +473 -0
- package/src/file-browser/components/FileBrowserContent.tsx +209 -0
- package/src/file-browser/components/FileBrowserHeader.tsx +151 -0
- package/src/file-browser/components/FileBrowserToolbar.tsx +145 -0
- package/src/file-browser/components/LeftPanel/LeftPanel.tsx +103 -0
- package/src/file-browser/components/LeftPanel/LeftPanelTabs.tsx +70 -0
- package/src/file-browser/components/LeftPanel/TreeNavigationView.tsx +256 -0
- package/src/file-browser/components/PreviewPane.tsx +146 -0
- package/src/file-browser/components/RightPanel/FilePreview.tsx +219 -0
- package/src/file-browser/components/RightPanel/RightPanel.tsx +186 -0
- package/src/file-browser/components/RightPanel/RightPanelToolbar.tsx +113 -0
- package/src/file-browser/components/UploadProgress.tsx +123 -0
- package/src/file-browser/components/ViewerHost.tsx +208 -0
- package/src/file-browser/components/mobile/MobileNavigation.tsx +227 -0
- package/src/file-browser/components/navigation/NavigationButtons.tsx +171 -0
- package/src/file-browser/components/shared/ErrorBoundary.tsx +116 -0
- package/src/file-browser/components/shared/FileBrowserItem.tsx +195 -0
- package/src/file-browser/components/shared/FileIcon.tsx +169 -0
- package/src/file-browser/components/toolbar/ViewModeToggle.tsx +200 -0
- package/src/file-browser/components/views/ListView/ListView.tsx +484 -0
- package/src/file-browser/components/views/ThumbnailView/ThumbnailView.tsx +323 -0
- package/src/file-browser/components/views/TreeView/TreeNode.tsx +186 -0
- package/src/file-browser/components/views/TreeView/TreeNodeList.tsx +191 -0
- package/src/file-browser/components/views/TreeView/TreeView.tsx +200 -0
- package/src/file-browser/components/views/TreemapView/TreemapView.tsx +339 -0
- package/src/file-browser/context/FileBrowserContext.tsx +13 -0
- package/src/file-browser/examples/BasicUsage.tsx +20 -0
- package/src/file-browser/index.ts +98 -0
- package/src/file-browser/models/FileBrowserModel.ts +623 -0
- package/src/file-browser/models/LeftPanelManagerModel.ts +105 -0
- package/src/file-browser/models/NavigationManagerModel.ts +312 -0
- package/src/file-browser/models/ResponsiveLayoutManagerModel.ts +437 -0
- package/src/file-browser/models/RightPanelManagerModel.ts +190 -0
- package/src/file-browser/models/SelectionManagerModel.ts +252 -0
- package/src/file-browser/models/ToolbarManagerModel.ts +144 -0
- package/src/file-browser/models/UploadModel.ts +147 -0
- package/src/file-browser/models/ViewModeManagerModel.ts +185 -0
- package/src/file-browser/models/ViewerHostModel.ts +44 -0
- package/src/file-browser/models/ui/ListViewUIModel.ts +265 -0
- package/src/file-browser/models/ui/PreviewUIModel.ts +297 -0
- package/src/file-browser/models/ui/ThumbnailViewUIModel.ts +254 -0
- package/src/file-browser/models/ui/TreeViewUIModel.ts +128 -0
- package/src/file-browser/models/ui/TreemapViewUIModel.ts +350 -0
- package/src/file-browser/providers/FileSystemListProvider.ts +552 -0
- package/src/file-browser/providers/FileSystemProvider.ts +401 -0
- package/src/file-browser/providers/FileSystemTreeProvider.ts +231 -0
- package/src/file-browser/providers/GitProvider.ts +337 -0
- package/src/file-browser/providers/GitRepositoryProvider.ts +376 -0
- package/src/file-browser/providers/IFileBrowserProvider.ts +56 -0
- package/src/file-browser/providers/MemoryProvider.ts +303 -0
- package/src/file-browser/providers/index.ts +4 -0
- package/src/file-browser/registry/ViewerRegistry.ts +551 -0
- package/src/file-browser/registry/types.ts +144 -0
- package/src/file-browser/scripts/performanceBenchmark.ts +553 -0
- package/src/file-browser/services/ThumbnailCacheService.ts +128 -0
- package/src/file-browser/tasks.md +537 -0
- package/src/file-browser/types/FileBrowserTypes.ts +126 -0
- package/src/file-browser/types/ProviderTypes.ts +155 -0
- package/src/file-browser/types/UITypes.ts +235 -0
- package/src/file-browser/types/ViewModeTypes.ts +150 -0
- package/src/file-browser/utils/gestures.ts +327 -0
- package/src/file-browser/utils/performance.ts +563 -0
- package/src/file-browser/viewers/ImageViewer.tsx +163 -0
- package/src/file-browser/viewers/ImageViewerModel.ts +79 -0
- package/src/file-browser/viewers/TextViewer.tsx +95 -0
- package/src/file-browser/viewers/UnsupportedFileViewer.tsx +57 -0
- package/src/file-browser/viewers/index.ts +61 -0
- package/src/git/BranchList.tsx +128 -0
- package/src/git/CommitGraph.tsx +239 -0
- package/src/git/CommitList.tsx +258 -0
- package/src/git/DiffViewer.tsx +219 -0
- package/src/git/index.ts +4 -0
- package/src/icons/iconMap.ts +146 -0
- package/src/icons/index.ts +9 -0
- package/src/index.ts +13 -0
- package/src/layout/README.md +307 -0
- package/src/layout/components/ExplorerLayout/ExplorerLayout.tsx +178 -0
- package/src/layout/examples/SimpleExample.tsx +60 -0
- package/src/layout/index.ts +6 -0
- package/src/lib/utils.ts +1 -0
- package/src/list/README.md +303 -0
- package/src/list/architecture.md +807 -0
- package/src/list/components/CalculatedGridView.tsx +252 -0
- package/src/list/components/DragPreview.tsx +102 -0
- package/src/list/components/ListContextMenu.tsx +274 -0
- package/src/list/components/ListItem.tsx +761 -0
- package/src/list/components/ListItems.tsx +919 -0
- package/src/list/components/MasonryView.tsx +241 -0
- package/src/list/components/SearchFilter.tsx +44 -0
- package/src/list/components/TreemapView.tsx +709 -0
- package/src/list/components/ViewSizeControls.tsx +205 -0
- package/src/list/components/ViewTypeSelector.tsx +312 -0
- package/src/list/components/VirtualizedDetailsView.tsx +231 -0
- package/src/list/components/VirtualizedGrid.tsx +164 -0
- package/src/list/components/VirtualizedList.tsx +154 -0
- package/src/list/components/VirtualizedMasonryView.tsx +344 -0
- package/src/list/components/shared/EmptyState.tsx +103 -0
- package/src/list/components/shared/ErrorBoundary.tsx +123 -0
- package/src/list/components/shared/ErrorDisplay.tsx +100 -0
- package/src/list/components/shared/ListLoader.tsx +146 -0
- package/src/list/components/shared/LoadingIndicator.tsx +80 -0
- package/src/list/index.ts +92 -0
- package/src/list/models/ListItemsModel.ts +1301 -0
- package/src/list/models/TreemapModel.ts +204 -0
- package/src/list/providers/ListItemsProvider.ts +313 -0
- package/src/list/providers/TestListProvider.ts +604 -0
- package/src/list/tasks.md +937 -0
- package/src/list/types/ListTypes.ts +178 -0
- package/src/list/utils/BenchmarkLogger.ts +243 -0
- package/src/list/utils/DragDropManager.ts +320 -0
- package/src/list/utils/GridLayoutCalculator.ts +290 -0
- package/src/list/utils/ListAccessibility.ts +367 -0
- package/src/list/utils/ListKeyboard.ts +414 -0
- package/src/list/utils/MasonryLayoutCalculator.ts +302 -0
- package/src/list/utils/MasonryLayoutEngine.ts +401 -0
- package/src/list/utils/__tests__/MasonryLayoutEngine.test.ts +157 -0
- package/src/list/utils/__tests__/VirtualizedMasonryView.test.tsx +251 -0
- package/src/media/AlbumSidebar.tsx +48 -0
- package/src/media/MediaBrowser.tsx +92 -0
- package/src/media/MediaBrowserModel.ts +138 -0
- package/src/media/MediaGrid.tsx +50 -0
- package/src/media/MediaList.tsx +49 -0
- package/src/media/MediaPreview.tsx +63 -0
- package/src/media/MediaTimeline.tsx +38 -0
- package/src/media/MockMediaProvider.ts +70 -0
- package/src/media/index.ts +18 -0
- package/src/media/types.ts +21 -0
- package/src/styles/variables.css +60 -0
- package/src/tree/DEVELOPMENT_SUMMARY.md +170 -0
- package/src/tree/__tests__/TreeModel.test.ts +16 -0
- package/src/tree/architecture.md +530 -0
- package/src/tree/components/Tree.tsx +283 -0
- package/src/tree/components/TreeCheckbox.tsx +147 -0
- package/src/tree/components/TreeContextMenu.tsx +139 -0
- package/src/tree/components/TreeNodeList.tsx +329 -0
- package/src/tree/components/TreeTable.tsx +382 -0
- package/src/tree/index.ts +58 -0
- package/src/tree/models/TreeModel.ts +839 -0
- package/src/tree/providers/SimpleTreeProvider.ts +463 -0
- package/src/tree/providers/TestTreeProvider.ts +946 -0
- package/src/tree/providers/TreeProvider.ts +308 -0
- package/src/tree/tasks.md +2046 -0
- package/src/tree/types/TreeTypes.ts +279 -0
- package/src/tree/utils/SelectionTheme.ts +150 -0
- package/src/tree/utils/logger.ts +203 -0
- package/src/types-common.ts +21 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for TreeComponent
|
|
3
|
+
*
|
|
4
|
+
* These types define the fundamental data structures used throughout
|
|
5
|
+
* the tree component system, including node data, loading results,
|
|
6
|
+
* and configuration options.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Represents a single node in the tree structure
|
|
11
|
+
*
|
|
12
|
+
* This interface defines the core properties that every tree node must have,
|
|
13
|
+
* along with optional properties for enhanced functionality like lazy loading,
|
|
14
|
+
* custom styling, and metadata storage.
|
|
15
|
+
*/
|
|
16
|
+
export interface TreeNodeData {
|
|
17
|
+
/** Unique identifier for the node */
|
|
18
|
+
id: string;
|
|
19
|
+
|
|
20
|
+
/** Display name of the node */
|
|
21
|
+
name: string;
|
|
22
|
+
|
|
23
|
+
/** Full path or identifier for the node */
|
|
24
|
+
path: string;
|
|
25
|
+
|
|
26
|
+
/** Type of node (file, directory, custom types) */
|
|
27
|
+
type: 'file' | 'directory' | string;
|
|
28
|
+
|
|
29
|
+
/** Whether this node has children (for lazy loading) */
|
|
30
|
+
hasChildren?: boolean;
|
|
31
|
+
|
|
32
|
+
/** Child nodes (if loaded) */
|
|
33
|
+
children?: TreeNodeData[];
|
|
34
|
+
|
|
35
|
+
/** Custom metadata for the node */
|
|
36
|
+
metadata?: Record<string, any>;
|
|
37
|
+
|
|
38
|
+
/** Size in bytes (for files) */
|
|
39
|
+
size?: number;
|
|
40
|
+
|
|
41
|
+
/** Last modified date */
|
|
42
|
+
lastModified?: Date;
|
|
43
|
+
|
|
44
|
+
/** Custom icon identifier */
|
|
45
|
+
icon?: string;
|
|
46
|
+
|
|
47
|
+
/** Custom CSS class */
|
|
48
|
+
className?: string;
|
|
49
|
+
|
|
50
|
+
/** Whether the node is disabled */
|
|
51
|
+
disabled?: boolean;
|
|
52
|
+
|
|
53
|
+
/** Custom render data for this specific node */
|
|
54
|
+
renderData?: Record<string, any>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Result of loading tree nodes
|
|
59
|
+
*
|
|
60
|
+
* This interface defines what providers return when loading tree data,
|
|
61
|
+
* including the nodes themselves and metadata about the loading operation.
|
|
62
|
+
*/
|
|
63
|
+
export interface TreeLoadResult {
|
|
64
|
+
/** The loaded nodes */
|
|
65
|
+
nodes: TreeNodeData[];
|
|
66
|
+
|
|
67
|
+
/** Whether there are more nodes to load */
|
|
68
|
+
hasMore?: boolean;
|
|
69
|
+
|
|
70
|
+
/** Total count of nodes (for virtual scrolling) */
|
|
71
|
+
totalCount?: number;
|
|
72
|
+
|
|
73
|
+
/** Any loading errors */
|
|
74
|
+
error?: Error;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Configuration options for loading tree data
|
|
79
|
+
*/
|
|
80
|
+
export interface TreeLoadOptions {
|
|
81
|
+
/**
|
|
82
|
+
* Filter to apply when loading nodes
|
|
83
|
+
*/
|
|
84
|
+
filter?: string;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Whether to force reload even if data is cached
|
|
88
|
+
*/
|
|
89
|
+
forceReload?: boolean;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Maximum depth to load initially
|
|
93
|
+
*/
|
|
94
|
+
maxDepth?: number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Context menu item definition
|
|
99
|
+
*/
|
|
100
|
+
export interface TreeContextMenuItem {
|
|
101
|
+
/**
|
|
102
|
+
* Unique identifier for the menu item
|
|
103
|
+
*/
|
|
104
|
+
id: string;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Display label for the menu item
|
|
108
|
+
*/
|
|
109
|
+
label: string;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Optional icon for the menu item
|
|
113
|
+
*/
|
|
114
|
+
icon?: string;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Whether the menu item is disabled
|
|
118
|
+
*/
|
|
119
|
+
disabled?: boolean;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Whether to show a separator after this item
|
|
123
|
+
*/
|
|
124
|
+
separator?: boolean;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Type of menu item (for separators)
|
|
128
|
+
*/
|
|
129
|
+
type?: 'separator' | 'item';
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Handler function for menu item clicks
|
|
133
|
+
*/
|
|
134
|
+
handler?: (node: TreeNodeData) => void;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Submenu items (for nested menus)
|
|
138
|
+
*/
|
|
139
|
+
submenu?: TreeContextMenuItem[];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Context menu event data
|
|
144
|
+
*/
|
|
145
|
+
export interface TreeContextMenuEvent {
|
|
146
|
+
/**
|
|
147
|
+
* The menu item that was clicked
|
|
148
|
+
*/
|
|
149
|
+
menuItem: TreeContextMenuItem;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The nodes that the context menu was triggered for
|
|
153
|
+
*/
|
|
154
|
+
nodes: TreeNodeData[];
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The mouse event that triggered the menu
|
|
158
|
+
*/
|
|
159
|
+
originalEvent: MouseEvent;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Column configuration for table view display
|
|
164
|
+
*/
|
|
165
|
+
export interface TreeTableColumn {
|
|
166
|
+
/** Unique identifier for the column */
|
|
167
|
+
id: string;
|
|
168
|
+
|
|
169
|
+
/** Display label for the column header */
|
|
170
|
+
label: string;
|
|
171
|
+
|
|
172
|
+
/** Property path in TreeNodeData to display (supports dot notation) */
|
|
173
|
+
dataKey: string;
|
|
174
|
+
|
|
175
|
+
/** Column width (CSS value) */
|
|
176
|
+
width?: string;
|
|
177
|
+
|
|
178
|
+
/** Minimum width (CSS value) */
|
|
179
|
+
minWidth?: string;
|
|
180
|
+
|
|
181
|
+
/** Column alignment */
|
|
182
|
+
align?: 'left' | 'center' | 'right';
|
|
183
|
+
|
|
184
|
+
/** Whether column is sortable */
|
|
185
|
+
sortable?: boolean;
|
|
186
|
+
|
|
187
|
+
/** Whether column is filterable */
|
|
188
|
+
filterable?: boolean;
|
|
189
|
+
|
|
190
|
+
/** Whether this column displays the tree hierarchy */
|
|
191
|
+
isTreeColumn?: boolean;
|
|
192
|
+
|
|
193
|
+
/** Custom CSS classes for the column */
|
|
194
|
+
className?: string;
|
|
195
|
+
|
|
196
|
+
/** Custom cell renderer function */
|
|
197
|
+
renderCell?: (value: any, node: TreeNodeData) => React.ReactNode;
|
|
198
|
+
|
|
199
|
+
/** Custom value formatter */
|
|
200
|
+
formatValue?: (value: any, node: TreeNodeData) => string;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Sort configuration for table view
|
|
205
|
+
*/
|
|
206
|
+
export interface TreeTableSort {
|
|
207
|
+
/** Column ID to sort by */
|
|
208
|
+
columnId: string;
|
|
209
|
+
|
|
210
|
+
/** Sort direction */
|
|
211
|
+
direction: 'asc' | 'desc';
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Export configuration for table view
|
|
216
|
+
*/
|
|
217
|
+
export interface TreeTableExportOptions {
|
|
218
|
+
/** Export format */
|
|
219
|
+
format: 'csv' | 'json' | 'tsv';
|
|
220
|
+
|
|
221
|
+
/** Column IDs to include (empty = all columns) */
|
|
222
|
+
columns?: string[];
|
|
223
|
+
|
|
224
|
+
/** Whether to include hierarchy structure */
|
|
225
|
+
includeHierarchy?: boolean;
|
|
226
|
+
|
|
227
|
+
/** Whether to flatten nested data */
|
|
228
|
+
flatten?: boolean;
|
|
229
|
+
|
|
230
|
+
/** Custom filename for download */
|
|
231
|
+
filename?: string;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Selection theme color scheme
|
|
236
|
+
*/
|
|
237
|
+
export type SelectionColorScheme = 'primary' | 'secondary' | 'accent' | 'custom';
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Selection intensity levels
|
|
241
|
+
*/
|
|
242
|
+
export type SelectionIntensity = 'subtle' | 'prominent' | 'high-contrast';
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Focus indicator style
|
|
246
|
+
*/
|
|
247
|
+
export type FocusIndicatorStyle = 'ring' | 'outline' | 'border' | 'underline';
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Enhanced selection theme configuration
|
|
251
|
+
*/
|
|
252
|
+
export interface TreeSelectionTheme {
|
|
253
|
+
/** Color scheme for selection highlighting */
|
|
254
|
+
colorScheme: SelectionColorScheme;
|
|
255
|
+
|
|
256
|
+
/** Selection intensity level */
|
|
257
|
+
intensity: SelectionIntensity;
|
|
258
|
+
|
|
259
|
+
/** Focus indicator style */
|
|
260
|
+
focusStyle: FocusIndicatorStyle;
|
|
261
|
+
|
|
262
|
+
/** Custom colors when using 'custom' color scheme */
|
|
263
|
+
customColors?: {
|
|
264
|
+
/** Background color for selected items */
|
|
265
|
+
background: string;
|
|
266
|
+
|
|
267
|
+
/** Text color for selected items */
|
|
268
|
+
foreground: string;
|
|
269
|
+
|
|
270
|
+
/** Border/focus color */
|
|
271
|
+
accent: string;
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
/** Whether to animate selection changes */
|
|
275
|
+
animated?: boolean;
|
|
276
|
+
|
|
277
|
+
/** Whether to show selection even when component loses focus */
|
|
278
|
+
persistSelection?: boolean;
|
|
279
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectionTheme - Utility for theme-aware selection styling
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for generating theme-aware CSS classes
|
|
5
|
+
* for tree node selection based on the configured selection theme.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { cn } from '../../lib/utils';
|
|
9
|
+
import type { TreeSelectionTheme, SelectionColorScheme, SelectionIntensity, FocusIndicatorStyle } from '../types/TreeTypes';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Default selection theme configuration
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_SELECTION_THEME: TreeSelectionTheme = {
|
|
15
|
+
colorScheme: 'primary',
|
|
16
|
+
intensity: 'subtle',
|
|
17
|
+
focusStyle: 'ring',
|
|
18
|
+
animated: true,
|
|
19
|
+
persistSelection: true
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Generate selection background classes based on color scheme and intensity
|
|
24
|
+
*/
|
|
25
|
+
export function getSelectionBackground(colorScheme: SelectionColorScheme, intensity: SelectionIntensity): string {
|
|
26
|
+
if (colorScheme === 'custom') {
|
|
27
|
+
// Use inline styles for custom colors - return empty string for CSS classes
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const intensityMap = {
|
|
32
|
+
subtle: {
|
|
33
|
+
primary: 'bg-primary/10',
|
|
34
|
+
secondary: 'bg-secondary/10',
|
|
35
|
+
accent: 'bg-accent/20',
|
|
36
|
+
muted: 'bg-muted'
|
|
37
|
+
},
|
|
38
|
+
prominent: {
|
|
39
|
+
primary: 'bg-primary/20',
|
|
40
|
+
secondary: 'bg-secondary/20',
|
|
41
|
+
accent: 'bg-accent/40',
|
|
42
|
+
muted: 'bg-muted/60'
|
|
43
|
+
},
|
|
44
|
+
'high-contrast': {
|
|
45
|
+
primary: 'bg-primary text-primary-foreground',
|
|
46
|
+
secondary: 'bg-secondary text-secondary-foreground',
|
|
47
|
+
accent: 'bg-accent text-accent-foreground',
|
|
48
|
+
muted: 'bg-muted-foreground text-muted'
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return intensityMap[intensity]?.[colorScheme] || intensityMap.subtle.primary;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Generate hover background classes
|
|
57
|
+
*/
|
|
58
|
+
export function getHoverBackground(colorScheme: SelectionColorScheme): string {
|
|
59
|
+
if (colorScheme === 'custom') {
|
|
60
|
+
// Use inline styles for custom colors instead of CSS custom properties
|
|
61
|
+
return '';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const hoverMap = {
|
|
65
|
+
primary: 'hover:bg-primary/5',
|
|
66
|
+
secondary: 'hover:bg-secondary/5',
|
|
67
|
+
accent: 'hover:bg-accent/10',
|
|
68
|
+
muted: 'hover:bg-muted/30'
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return hoverMap[colorScheme] || hoverMap.primary;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Generate focus indicator classes based on focus style
|
|
76
|
+
*/
|
|
77
|
+
export function getFocusIndicator(focusStyle: FocusIndicatorStyle, colorScheme: SelectionColorScheme): string {
|
|
78
|
+
if (colorScheme === 'custom') {
|
|
79
|
+
return focusStyle === 'ring'
|
|
80
|
+
? 'ring-2 ring-[var(--tree-focus-ring)] ring-offset-1'
|
|
81
|
+
: 'border-l-2 border-[var(--tree-focus-border)]';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const focusMap = {
|
|
85
|
+
ring: {
|
|
86
|
+
primary: 'ring-2 ring-primary ring-offset-1',
|
|
87
|
+
secondary: 'ring-2 ring-secondary ring-offset-1',
|
|
88
|
+
accent: 'ring-2 ring-accent ring-offset-1',
|
|
89
|
+
muted: 'ring-2 ring-muted-foreground ring-offset-1'
|
|
90
|
+
},
|
|
91
|
+
outline: {
|
|
92
|
+
primary: 'outline-2 outline-primary',
|
|
93
|
+
secondary: 'outline-2 outline-secondary',
|
|
94
|
+
accent: 'outline-2 outline-accent',
|
|
95
|
+
muted: 'outline-2 outline-muted-foreground'
|
|
96
|
+
},
|
|
97
|
+
border: {
|
|
98
|
+
primary: 'border-l-2 border-primary',
|
|
99
|
+
secondary: 'border-l-2 border-secondary',
|
|
100
|
+
accent: 'border-l-2 border-accent',
|
|
101
|
+
muted: 'border-l-2 border-muted-foreground'
|
|
102
|
+
},
|
|
103
|
+
underline: {
|
|
104
|
+
primary: 'border-b-2 border-primary',
|
|
105
|
+
secondary: 'border-b-2 border-secondary',
|
|
106
|
+
accent: 'border-b-2 border-accent',
|
|
107
|
+
muted: 'border-b-2 border-muted-foreground'
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
return focusMap[focusStyle]?.[colorScheme] || focusMap.ring.primary;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Generate complete selection classes for a tree node
|
|
116
|
+
*/
|
|
117
|
+
export function getSelectionClasses(
|
|
118
|
+
theme: TreeSelectionTheme,
|
|
119
|
+
isSelected: boolean,
|
|
120
|
+
isFocused: boolean,
|
|
121
|
+
useCheckboxes: boolean = false
|
|
122
|
+
): string {
|
|
123
|
+
const baseClasses = [
|
|
124
|
+
'transition-colors',
|
|
125
|
+
theme.animated ? 'duration-150' : '',
|
|
126
|
+
getHoverBackground(theme.colorScheme)
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
if (isSelected) {
|
|
130
|
+
baseClasses.push(getSelectionBackground(theme.colorScheme, theme.intensity));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (isFocused && !useCheckboxes) {
|
|
134
|
+
baseClasses.push(getFocusIndicator(theme.focusStyle, theme.colorScheme));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return cn(baseClasses);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Generate CSS custom properties for custom color schemes
|
|
144
|
+
* NOTE: This function is now simplified since we handle custom colors with inline styles
|
|
145
|
+
*/
|
|
146
|
+
export function getCustomColorVariables(theme: TreeSelectionTheme): Record<string, string> {
|
|
147
|
+
// Return empty object since we now handle custom colors with inline styles
|
|
148
|
+
// This avoids TypeScript issues with potentially undefined color properties
|
|
149
|
+
return {};
|
|
150
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
interface LogContext {
|
|
2
|
+
component?: string;
|
|
3
|
+
nodeId?: string;
|
|
4
|
+
operation?: string;
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
interface LogEntry {
|
|
9
|
+
timestamp: string;
|
|
10
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
11
|
+
message: string;
|
|
12
|
+
context?: LogContext;
|
|
13
|
+
data?: any;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
class TreeLogger {
|
|
17
|
+
private isEnabled = true;
|
|
18
|
+
private logs: LogEntry[] = [];
|
|
19
|
+
private maxLogs = 1000;
|
|
20
|
+
|
|
21
|
+
enable() {
|
|
22
|
+
this.isEnabled = true;
|
|
23
|
+
console.log('🌳 TreeComponent logging enabled');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
disable() {
|
|
27
|
+
this.isEnabled = false;
|
|
28
|
+
console.log('🌳 TreeComponent logging disabled');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private log(level: LogEntry['level'], message: string, context?: LogContext, data?: any) {
|
|
32
|
+
if (!this.isEnabled) return;
|
|
33
|
+
|
|
34
|
+
const entry: LogEntry = {
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
level,
|
|
37
|
+
message,
|
|
38
|
+
context,
|
|
39
|
+
data
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Store log entry
|
|
43
|
+
this.logs.push(entry);
|
|
44
|
+
if (this.logs.length > this.maxLogs) {
|
|
45
|
+
this.logs.shift();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Format console output
|
|
49
|
+
const prefix = this.getPrefix(level);
|
|
50
|
+
const contextStr = context ? this.formatContext(context) : '';
|
|
51
|
+
const fullMessage = `${prefix} ${message}${contextStr}`;
|
|
52
|
+
|
|
53
|
+
// Console output with appropriate level
|
|
54
|
+
switch (level) {
|
|
55
|
+
case 'debug':
|
|
56
|
+
console.debug(fullMessage, data || '');
|
|
57
|
+
break;
|
|
58
|
+
case 'info':
|
|
59
|
+
console.info(fullMessage, data || '');
|
|
60
|
+
break;
|
|
61
|
+
case 'warn':
|
|
62
|
+
console.warn(fullMessage, data || '');
|
|
63
|
+
break;
|
|
64
|
+
case 'error':
|
|
65
|
+
console.error(fullMessage, data || '');
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private getPrefix(level: LogEntry['level']): string {
|
|
71
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
72
|
+
switch (level) {
|
|
73
|
+
case 'debug': return `🔍 [${timestamp}] TreeComponent:`;
|
|
74
|
+
case 'info': return `ℹ️ [${timestamp}] TreeComponent:`;
|
|
75
|
+
case 'warn': return `⚠️ [${timestamp}] TreeComponent:`;
|
|
76
|
+
case 'error': return `❌ [${timestamp}] TreeComponent:`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private formatContext(context: LogContext): string {
|
|
81
|
+
const parts: string[] = [];
|
|
82
|
+
|
|
83
|
+
if (context.component) parts.push(`[${context.component}]`);
|
|
84
|
+
if (context.nodeId) parts.push(`(node: ${context.nodeId})`);
|
|
85
|
+
if (context.operation) parts.push(`{${context.operation}}`);
|
|
86
|
+
|
|
87
|
+
// Add other context properties
|
|
88
|
+
Object.entries(context).forEach(([key, value]) => {
|
|
89
|
+
if (!['component', 'nodeId', 'operation'].includes(key)) {
|
|
90
|
+
parts.push(`${key}=${value}`);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return parts.length > 0 ? ` ${parts.join(' ')}` : '';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
debug(message: string, context?: LogContext, data?: any) {
|
|
98
|
+
this.log('debug', message, context, data);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
info(message: string, context?: LogContext, data?: any) {
|
|
102
|
+
this.log('info', message, context, data);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
warn(message: string, context?: LogContext, data?: any) {
|
|
106
|
+
this.log('warn', message, context, data);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
error(message: string, context?: LogContext, data?: any) {
|
|
110
|
+
this.log('error', message, context, data);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Specialized logging methods for common TreeComponent operations
|
|
114
|
+
selection(operation: string, nodeId: string, data?: any) {
|
|
115
|
+
this.debug(`Selection ${operation}`, {
|
|
116
|
+
component: 'Selection',
|
|
117
|
+
nodeId,
|
|
118
|
+
operation
|
|
119
|
+
}, data);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
expansion(operation: string, nodeId: string, data?: any) {
|
|
123
|
+
this.debug(`Expansion ${operation}`, {
|
|
124
|
+
component: 'Expansion',
|
|
125
|
+
nodeId,
|
|
126
|
+
operation
|
|
127
|
+
}, data);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
interaction(operation: string, nodeId: string, data?: any) {
|
|
131
|
+
this.debug(`User interaction: ${operation}`, {
|
|
132
|
+
component: 'Interaction',
|
|
133
|
+
nodeId,
|
|
134
|
+
operation
|
|
135
|
+
}, data);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
rendering(component: string, nodeId: string, data?: any) {
|
|
139
|
+
this.debug(`Rendering`, {
|
|
140
|
+
component,
|
|
141
|
+
nodeId,
|
|
142
|
+
operation: 'render'
|
|
143
|
+
}, data);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
cssClasses(nodeId: string, classes: string, selected: boolean, focused: boolean) {
|
|
147
|
+
this.debug(`CSS classes applied`, {
|
|
148
|
+
component: 'Styling',
|
|
149
|
+
nodeId,
|
|
150
|
+
selected: selected.toString(),
|
|
151
|
+
focused: focused.toString()
|
|
152
|
+
}, { classes });
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
providerCall(method: string, data?: any) {
|
|
156
|
+
this.debug(`Provider method called`, {
|
|
157
|
+
component: 'Provider',
|
|
158
|
+
operation: method
|
|
159
|
+
}, data);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
stateChange(component: string, property: string, oldValue: any, newValue: any) {
|
|
163
|
+
this.debug(`State change`, {
|
|
164
|
+
component,
|
|
165
|
+
operation: 'state-change',
|
|
166
|
+
property
|
|
167
|
+
}, { oldValue, newValue });
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Get logs for debugging
|
|
171
|
+
getLogs(filter?: { level?: LogEntry['level'], component?: string }): LogEntry[] {
|
|
172
|
+
if (!filter) return [...this.logs];
|
|
173
|
+
|
|
174
|
+
return this.logs.filter(log => {
|
|
175
|
+
if (filter.level && log.level !== filter.level) return false;
|
|
176
|
+
if (filter.component && log.context?.component !== filter.component) return false;
|
|
177
|
+
return true;
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Clear logs
|
|
182
|
+
clearLogs() {
|
|
183
|
+
this.logs = [];
|
|
184
|
+
console.log('🌳 TreeComponent logs cleared');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Export logs for analysis
|
|
188
|
+
exportLogs(): string {
|
|
189
|
+
return JSON.stringify(this.logs, null, 2);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Global logger instance
|
|
194
|
+
export const logger = new TreeLogger();
|
|
195
|
+
|
|
196
|
+
// Enable by default in development
|
|
197
|
+
if (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') {
|
|
198
|
+
logger.enable();
|
|
199
|
+
// Make logger available globally for debugging
|
|
200
|
+
(window as any).treeLogger = logger;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export type { LogContext, LogEntry };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ObjectType = 'media' | 'contact' | 'calendar-event';
|
|
2
|
+
|
|
3
|
+
export interface ObjectMetadata {
|
|
4
|
+
id: string;
|
|
5
|
+
type: ObjectType;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
thumbnail?: string;
|
|
9
|
+
createdAt: Date;
|
|
10
|
+
updatedAt: Date;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface IObjectProvider<T extends ObjectMetadata> {
|
|
15
|
+
listItems(): Promise<T[]>;
|
|
16
|
+
getItem(id: string): Promise<T | null>;
|
|
17
|
+
createItem(item: Omit<T, 'id' | 'createdAt' | 'updatedAt'>): Promise<T>;
|
|
18
|
+
updateItem(id: string, updates: Partial<T>): Promise<T>;
|
|
19
|
+
deleteItem(id: string): Promise<void>;
|
|
20
|
+
search(query: string): Promise<T[]>;
|
|
21
|
+
}
|