@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.
Files changed (244) hide show
  1. package/dist/ExplorerLayout-CSIJd7N4.js +105 -0
  2. package/dist/ExplorerLayout-CSIJd7N4.js.map +1 -0
  3. package/dist/FileBrowserContext-B6jixa2j.js +11 -0
  4. package/dist/FileBrowserContext-B6jixa2j.js.map +1 -0
  5. package/dist/calendar-DSlrbHoj.js +761 -0
  6. package/dist/calendar-DSlrbHoj.js.map +1 -0
  7. package/dist/calendar.d.ts +3 -0
  8. package/dist/calendar.js +3 -0
  9. package/dist/contacts-DQXTZzHc.js +539 -0
  10. package/dist/contacts-DQXTZzHc.js.map +1 -0
  11. package/dist/contacts.d.ts +3 -0
  12. package/dist/contacts.js +3 -0
  13. package/dist/file-browser-m5atC3kF.js +6755 -0
  14. package/dist/file-browser-m5atC3kF.js.map +1 -0
  15. package/dist/file-browser.d.ts +11 -0
  16. package/dist/file-browser.js +9 -0
  17. package/dist/git-B55e6LL-.js +561 -0
  18. package/dist/git-B55e6LL-.js.map +1 -0
  19. package/dist/git.d.ts +2 -0
  20. package/dist/git.js +3 -0
  21. package/dist/iconMap-V4B8P-Uh.js +206 -0
  22. package/dist/iconMap-V4B8P-Uh.js.map +1 -0
  23. package/dist/icons-CIsIOZXR.js +0 -0
  24. package/dist/icons.d.ts +2 -0
  25. package/dist/icons.js +4 -0
  26. package/dist/index-BNmNIWBL.d.ts +71 -0
  27. package/dist/index-BNmNIWBL.d.ts.map +1 -0
  28. package/dist/index-Bryv_GCG.d.ts +1481 -0
  29. package/dist/index-Bryv_GCG.d.ts.map +1 -0
  30. package/dist/index-CuQIjSXs.d.ts +134 -0
  31. package/dist/index-CuQIjSXs.d.ts.map +1 -0
  32. package/dist/index-DSu19mq0.d.ts +153 -0
  33. package/dist/index-DSu19mq0.d.ts.map +1 -0
  34. package/dist/index-DmsyeHFr.d.ts +149 -0
  35. package/dist/index-DmsyeHFr.d.ts.map +1 -0
  36. package/dist/index-DxnJ8FYM.d.ts +17 -0
  37. package/dist/index-DxnJ8FYM.d.ts.map +1 -0
  38. package/dist/index-DzfY1Tok.d.ts +32 -0
  39. package/dist/index-DzfY1Tok.d.ts.map +1 -0
  40. package/dist/index-Ml_SgiKa.d.ts +1847 -0
  41. package/dist/index-Ml_SgiKa.d.ts.map +1 -0
  42. package/dist/index-kHr9udZD.d.ts +1025 -0
  43. package/dist/index-kHr9udZD.d.ts.map +1 -0
  44. package/dist/index.d.ts +11 -0
  45. package/dist/index.js +15 -0
  46. package/dist/layout-Ca_4r8ka.js +89 -0
  47. package/dist/layout-Ca_4r8ka.js.map +1 -0
  48. package/dist/layout.d.ts +2 -0
  49. package/dist/layout.js +5 -0
  50. package/dist/list-CxfT6hix.js +6831 -0
  51. package/dist/list-CxfT6hix.js.map +1 -0
  52. package/dist/list.d.ts +2 -0
  53. package/dist/list.js +5 -0
  54. package/dist/media-DZ292aKK.js +557 -0
  55. package/dist/media-DZ292aKK.js.map +1 -0
  56. package/dist/media.d.ts +3 -0
  57. package/dist/media.js +3 -0
  58. package/dist/tree-Dd9Z0Aso.js +3351 -0
  59. package/dist/tree-Dd9Z0Aso.js.map +1 -0
  60. package/dist/tree.d.ts +2 -0
  61. package/dist/tree.js +6 -0
  62. package/dist/types-common-CB3kRek8.d.ts +26 -0
  63. package/dist/types-common-CB3kRek8.d.ts.map +1 -0
  64. package/dist/utils-B4fdKKsy.js +3 -0
  65. package/package.json +109 -0
  66. package/src/calendar/AgendaView.tsx +37 -0
  67. package/src/calendar/CalendarBrowser.tsx +90 -0
  68. package/src/calendar/CalendarModel.ts +142 -0
  69. package/src/calendar/CalendarSidebar.tsx +81 -0
  70. package/src/calendar/DayView.tsx +76 -0
  71. package/src/calendar/EventCard.tsx +51 -0
  72. package/src/calendar/MockCalendarProvider.ts +98 -0
  73. package/src/calendar/MonthView.tsx +77 -0
  74. package/src/calendar/WeekView.tsx +129 -0
  75. package/src/calendar/index.ts +18 -0
  76. package/src/calendar/types.ts +25 -0
  77. package/src/contacts/ContactAvatar.tsx +35 -0
  78. package/src/contacts/ContactBrowser.tsx +56 -0
  79. package/src/contacts/ContactCard.tsx +37 -0
  80. package/src/contacts/ContactDetail.tsx +63 -0
  81. package/src/contacts/ContactGroupSidebar.tsx +40 -0
  82. package/src/contacts/ContactList.tsx +32 -0
  83. package/src/contacts/ContactListModel.ts +120 -0
  84. package/src/contacts/MockContactProvider.ts +77 -0
  85. package/src/contacts/index.ts +17 -0
  86. package/src/contacts/types.ts +26 -0
  87. package/src/demos/CalendarBrowserDemo.tsx +15 -0
  88. package/src/demos/ContactBrowserDemo.tsx +15 -0
  89. package/src/demos/MediaBrowserDemo.tsx +15 -0
  90. package/src/file-browser/adapters/DocumentViewerAdapter.ts +371 -0
  91. package/src/file-browser/adapters/FileSystemBridge.ts +168 -0
  92. package/src/file-browser/adapters/GitBrowserAdapter.ts +546 -0
  93. package/src/file-browser/adapters/README.md +504 -0
  94. package/src/file-browser/adapters/index.ts +27 -0
  95. package/src/file-browser/adapters/types.ts +70 -0
  96. package/src/file-browser/architecture.md +645 -0
  97. package/src/file-browser/components/CreateItemDialog.tsx +71 -0
  98. package/src/file-browser/components/DeleteConfirmDialog.tsx +58 -0
  99. package/src/file-browser/components/FileBrowser.tsx +473 -0
  100. package/src/file-browser/components/FileBrowserContent.tsx +209 -0
  101. package/src/file-browser/components/FileBrowserHeader.tsx +151 -0
  102. package/src/file-browser/components/FileBrowserToolbar.tsx +145 -0
  103. package/src/file-browser/components/LeftPanel/LeftPanel.tsx +103 -0
  104. package/src/file-browser/components/LeftPanel/LeftPanelTabs.tsx +70 -0
  105. package/src/file-browser/components/LeftPanel/TreeNavigationView.tsx +256 -0
  106. package/src/file-browser/components/PreviewPane.tsx +146 -0
  107. package/src/file-browser/components/RightPanel/FilePreview.tsx +219 -0
  108. package/src/file-browser/components/RightPanel/RightPanel.tsx +186 -0
  109. package/src/file-browser/components/RightPanel/RightPanelToolbar.tsx +113 -0
  110. package/src/file-browser/components/UploadProgress.tsx +123 -0
  111. package/src/file-browser/components/ViewerHost.tsx +208 -0
  112. package/src/file-browser/components/mobile/MobileNavigation.tsx +227 -0
  113. package/src/file-browser/components/navigation/NavigationButtons.tsx +171 -0
  114. package/src/file-browser/components/shared/ErrorBoundary.tsx +116 -0
  115. package/src/file-browser/components/shared/FileBrowserItem.tsx +195 -0
  116. package/src/file-browser/components/shared/FileIcon.tsx +169 -0
  117. package/src/file-browser/components/toolbar/ViewModeToggle.tsx +200 -0
  118. package/src/file-browser/components/views/ListView/ListView.tsx +484 -0
  119. package/src/file-browser/components/views/ThumbnailView/ThumbnailView.tsx +323 -0
  120. package/src/file-browser/components/views/TreeView/TreeNode.tsx +186 -0
  121. package/src/file-browser/components/views/TreeView/TreeNodeList.tsx +191 -0
  122. package/src/file-browser/components/views/TreeView/TreeView.tsx +200 -0
  123. package/src/file-browser/components/views/TreemapView/TreemapView.tsx +339 -0
  124. package/src/file-browser/context/FileBrowserContext.tsx +13 -0
  125. package/src/file-browser/examples/BasicUsage.tsx +20 -0
  126. package/src/file-browser/index.ts +98 -0
  127. package/src/file-browser/models/FileBrowserModel.ts +623 -0
  128. package/src/file-browser/models/LeftPanelManagerModel.ts +105 -0
  129. package/src/file-browser/models/NavigationManagerModel.ts +312 -0
  130. package/src/file-browser/models/ResponsiveLayoutManagerModel.ts +437 -0
  131. package/src/file-browser/models/RightPanelManagerModel.ts +190 -0
  132. package/src/file-browser/models/SelectionManagerModel.ts +252 -0
  133. package/src/file-browser/models/ToolbarManagerModel.ts +144 -0
  134. package/src/file-browser/models/UploadModel.ts +147 -0
  135. package/src/file-browser/models/ViewModeManagerModel.ts +185 -0
  136. package/src/file-browser/models/ViewerHostModel.ts +44 -0
  137. package/src/file-browser/models/ui/ListViewUIModel.ts +265 -0
  138. package/src/file-browser/models/ui/PreviewUIModel.ts +297 -0
  139. package/src/file-browser/models/ui/ThumbnailViewUIModel.ts +254 -0
  140. package/src/file-browser/models/ui/TreeViewUIModel.ts +128 -0
  141. package/src/file-browser/models/ui/TreemapViewUIModel.ts +350 -0
  142. package/src/file-browser/providers/FileSystemListProvider.ts +552 -0
  143. package/src/file-browser/providers/FileSystemProvider.ts +401 -0
  144. package/src/file-browser/providers/FileSystemTreeProvider.ts +231 -0
  145. package/src/file-browser/providers/GitProvider.ts +337 -0
  146. package/src/file-browser/providers/GitRepositoryProvider.ts +376 -0
  147. package/src/file-browser/providers/IFileBrowserProvider.ts +56 -0
  148. package/src/file-browser/providers/MemoryProvider.ts +303 -0
  149. package/src/file-browser/providers/index.ts +4 -0
  150. package/src/file-browser/registry/ViewerRegistry.ts +551 -0
  151. package/src/file-browser/registry/types.ts +144 -0
  152. package/src/file-browser/scripts/performanceBenchmark.ts +553 -0
  153. package/src/file-browser/services/ThumbnailCacheService.ts +128 -0
  154. package/src/file-browser/tasks.md +537 -0
  155. package/src/file-browser/types/FileBrowserTypes.ts +126 -0
  156. package/src/file-browser/types/ProviderTypes.ts +155 -0
  157. package/src/file-browser/types/UITypes.ts +235 -0
  158. package/src/file-browser/types/ViewModeTypes.ts +150 -0
  159. package/src/file-browser/utils/gestures.ts +327 -0
  160. package/src/file-browser/utils/performance.ts +563 -0
  161. package/src/file-browser/viewers/ImageViewer.tsx +163 -0
  162. package/src/file-browser/viewers/ImageViewerModel.ts +79 -0
  163. package/src/file-browser/viewers/TextViewer.tsx +95 -0
  164. package/src/file-browser/viewers/UnsupportedFileViewer.tsx +57 -0
  165. package/src/file-browser/viewers/index.ts +61 -0
  166. package/src/git/BranchList.tsx +128 -0
  167. package/src/git/CommitGraph.tsx +239 -0
  168. package/src/git/CommitList.tsx +258 -0
  169. package/src/git/DiffViewer.tsx +219 -0
  170. package/src/git/index.ts +4 -0
  171. package/src/icons/iconMap.ts +146 -0
  172. package/src/icons/index.ts +9 -0
  173. package/src/index.ts +13 -0
  174. package/src/layout/README.md +307 -0
  175. package/src/layout/components/ExplorerLayout/ExplorerLayout.tsx +178 -0
  176. package/src/layout/examples/SimpleExample.tsx +60 -0
  177. package/src/layout/index.ts +6 -0
  178. package/src/lib/utils.ts +1 -0
  179. package/src/list/README.md +303 -0
  180. package/src/list/architecture.md +807 -0
  181. package/src/list/components/CalculatedGridView.tsx +252 -0
  182. package/src/list/components/DragPreview.tsx +102 -0
  183. package/src/list/components/ListContextMenu.tsx +274 -0
  184. package/src/list/components/ListItem.tsx +761 -0
  185. package/src/list/components/ListItems.tsx +919 -0
  186. package/src/list/components/MasonryView.tsx +241 -0
  187. package/src/list/components/SearchFilter.tsx +44 -0
  188. package/src/list/components/TreemapView.tsx +709 -0
  189. package/src/list/components/ViewSizeControls.tsx +205 -0
  190. package/src/list/components/ViewTypeSelector.tsx +312 -0
  191. package/src/list/components/VirtualizedDetailsView.tsx +231 -0
  192. package/src/list/components/VirtualizedGrid.tsx +164 -0
  193. package/src/list/components/VirtualizedList.tsx +154 -0
  194. package/src/list/components/VirtualizedMasonryView.tsx +344 -0
  195. package/src/list/components/shared/EmptyState.tsx +103 -0
  196. package/src/list/components/shared/ErrorBoundary.tsx +123 -0
  197. package/src/list/components/shared/ErrorDisplay.tsx +100 -0
  198. package/src/list/components/shared/ListLoader.tsx +146 -0
  199. package/src/list/components/shared/LoadingIndicator.tsx +80 -0
  200. package/src/list/index.ts +92 -0
  201. package/src/list/models/ListItemsModel.ts +1301 -0
  202. package/src/list/models/TreemapModel.ts +204 -0
  203. package/src/list/providers/ListItemsProvider.ts +313 -0
  204. package/src/list/providers/TestListProvider.ts +604 -0
  205. package/src/list/tasks.md +937 -0
  206. package/src/list/types/ListTypes.ts +178 -0
  207. package/src/list/utils/BenchmarkLogger.ts +243 -0
  208. package/src/list/utils/DragDropManager.ts +320 -0
  209. package/src/list/utils/GridLayoutCalculator.ts +290 -0
  210. package/src/list/utils/ListAccessibility.ts +367 -0
  211. package/src/list/utils/ListKeyboard.ts +414 -0
  212. package/src/list/utils/MasonryLayoutCalculator.ts +302 -0
  213. package/src/list/utils/MasonryLayoutEngine.ts +401 -0
  214. package/src/list/utils/__tests__/MasonryLayoutEngine.test.ts +157 -0
  215. package/src/list/utils/__tests__/VirtualizedMasonryView.test.tsx +251 -0
  216. package/src/media/AlbumSidebar.tsx +48 -0
  217. package/src/media/MediaBrowser.tsx +92 -0
  218. package/src/media/MediaBrowserModel.ts +138 -0
  219. package/src/media/MediaGrid.tsx +50 -0
  220. package/src/media/MediaList.tsx +49 -0
  221. package/src/media/MediaPreview.tsx +63 -0
  222. package/src/media/MediaTimeline.tsx +38 -0
  223. package/src/media/MockMediaProvider.ts +70 -0
  224. package/src/media/index.ts +18 -0
  225. package/src/media/types.ts +21 -0
  226. package/src/styles/variables.css +60 -0
  227. package/src/tree/DEVELOPMENT_SUMMARY.md +170 -0
  228. package/src/tree/__tests__/TreeModel.test.ts +16 -0
  229. package/src/tree/architecture.md +530 -0
  230. package/src/tree/components/Tree.tsx +283 -0
  231. package/src/tree/components/TreeCheckbox.tsx +147 -0
  232. package/src/tree/components/TreeContextMenu.tsx +139 -0
  233. package/src/tree/components/TreeNodeList.tsx +329 -0
  234. package/src/tree/components/TreeTable.tsx +382 -0
  235. package/src/tree/index.ts +58 -0
  236. package/src/tree/models/TreeModel.ts +839 -0
  237. package/src/tree/providers/SimpleTreeProvider.ts +463 -0
  238. package/src/tree/providers/TestTreeProvider.ts +946 -0
  239. package/src/tree/providers/TreeProvider.ts +308 -0
  240. package/src/tree/tasks.md +2046 -0
  241. package/src/tree/types/TreeTypes.ts +279 -0
  242. package/src/tree/utils/SelectionTheme.ts +150 -0
  243. package/src/tree/utils/logger.ts +203 -0
  244. package/src/types-common.ts +21 -0
@@ -0,0 +1,337 @@
1
+ import { IFileBrowserProvider } from './IFileBrowserProvider';
2
+ import { FileBrowserItem, IconDefinition, PreviewData } from '../types/FileBrowserTypes';
3
+ import { LeftPanelMode } from '../models/LeftPanelManagerModel';
4
+ import { ViewModeDefinition } from '../models/RightPanelManagerModel';
5
+
6
+ // Import Git Browser types (these would be imported from the actual Git Browser app)
7
+ interface GitRepositoryModel {
8
+ path: string;
9
+ fileTree: any[];
10
+ isLoadingFiles: boolean;
11
+ getFileContent(path: string): Promise<string>;
12
+ // Add other methods as needed
13
+ }
14
+
15
+ interface GitWrapperIntegration {
16
+ path: string;
17
+ fileTree: any[];
18
+ isLoadingFiles: boolean;
19
+ getFileContent(path: string): Promise<string>;
20
+ // Add other methods as needed
21
+ }
22
+
23
+ interface GitFileTreeNode {
24
+ name: string;
25
+ path: string;
26
+ type: 'file' | 'directory';
27
+ size?: number;
28
+ children?: GitFileTreeNode[];
29
+ }
30
+
31
+ export class GitProvider implements IFileBrowserProvider {
32
+ readonly id = 'git';
33
+ readonly name = 'Git Provider';
34
+ readonly version = '1.0.0';
35
+
36
+ private repository: GitRepositoryModel | GitWrapperIntegration;
37
+
38
+ constructor(repository: GitRepositoryModel | GitWrapperIntegration) {
39
+ this.repository = repository;
40
+ }
41
+
42
+ // Core data operations
43
+ async loadItems(path: string): Promise<FileBrowserItem[]> {
44
+ try {
45
+ const normalizedPath = this.normalizePath(path);
46
+
47
+ // Wait for file tree to load if it's currently loading
48
+ if (this.repository.isLoadingFiles) {
49
+ // In a real implementation, we'd wait for the loading to complete
50
+ // For now, return empty array
51
+ return [];
52
+ }
53
+
54
+ const fileTree = this.repository.fileTree;
55
+ if (!fileTree || fileTree.length === 0) {
56
+ return [];
57
+ }
58
+
59
+ // Find the items for the current path
60
+ const items = this.getItemsForPath(normalizedPath, fileTree);
61
+
62
+ return items.map(node => this.convertGitNodeToFileBrowserItem(node));
63
+ } catch (error) {
64
+ console.error(`Failed to load Git items from ${path}:`, error);
65
+ throw new Error(`Failed to load Git repository items: ${error instanceof Error ? error.message : 'Unknown error'}`);
66
+ }
67
+ }
68
+
69
+ private getItemsForPath(path: string, fileTree: GitFileTreeNode[]): GitFileTreeNode[] {
70
+ if (path === '/' || path === '') {
71
+ return fileTree;
72
+ }
73
+
74
+ // Navigate to the specified path
75
+ const pathSegments = path.split('/').filter(segment => segment !== '');
76
+ let currentNodes = fileTree;
77
+
78
+ for (const segment of pathSegments) {
79
+ const node = currentNodes.find(n => n.name === segment && n.type === 'directory');
80
+ if (!node || !node.children) {
81
+ return [];
82
+ }
83
+ currentNodes = node.children;
84
+ }
85
+
86
+ return currentNodes;
87
+ }
88
+
89
+ private convertGitNodeToFileBrowserItem(node: GitFileTreeNode): FileBrowserItem {
90
+ return {
91
+ id: node.path,
92
+ name: node.name,
93
+ path: node.path,
94
+ type: node.type === 'directory' ? 'directory' : 'file',
95
+ size: node.size,
96
+ lastModified: new Date(), // Git doesn't provide this directly
97
+ hasChildren: node.type === 'directory' && (node.children?.length || 0) > 0,
98
+ metadata: {
99
+ gitPath: node.path,
100
+ isGitFile: true
101
+ }
102
+ };
103
+ }
104
+
105
+ // Dual-panel support
106
+ getLeftPanelModes(): LeftPanelMode[] {
107
+ return [
108
+ {
109
+ id: 'tree',
110
+ name: 'Tree',
111
+ icon: 'folder-tree',
112
+ component: {} as any, // Will be set by consumer
113
+ isAvailable: () => true
114
+ },
115
+ {
116
+ id: 'git-graph',
117
+ name: 'Git Graph',
118
+ icon: 'git-branch',
119
+ component: {} as any, // Will be set by consumer
120
+ isAvailable: () => true
121
+ }
122
+ ];
123
+ }
124
+
125
+ getRightPanelViewModes(): ViewModeDefinition[] {
126
+ return [
127
+ {
128
+ id: 'list',
129
+ name: 'List',
130
+ icon: 'list',
131
+ applicableFor: (contentType) => contentType === 'folder'
132
+ },
133
+ {
134
+ id: 'thumbnail',
135
+ name: 'Thumbnails',
136
+ icon: 'grid-3x3',
137
+ applicableFor: (contentType) => contentType === 'folder'
138
+ },
139
+ {
140
+ id: 'git-history',
141
+ name: 'History',
142
+ icon: 'history',
143
+ applicableFor: (contentType) => contentType === 'file'
144
+ },
145
+ {
146
+ id: 'git-diff',
147
+ name: 'Diff',
148
+ icon: 'git-compare',
149
+ applicableFor: (contentType) => contentType === 'file'
150
+ }
151
+ ];
152
+ }
153
+
154
+ // Path operations
155
+ normalizePath(path: string): string {
156
+ if (!path || path === '') return '/';
157
+
158
+ let normalized = path.startsWith('/') ? path : '/' + path;
159
+ if (normalized.length > 1 && normalized.endsWith('/')) {
160
+ normalized = normalized.slice(0, -1);
161
+ }
162
+
163
+ return normalized;
164
+ }
165
+
166
+ getParentPath(path: string): string | null {
167
+ const normalized = this.normalizePath(path);
168
+ if (normalized === '/') return null;
169
+
170
+ const lastSlashIndex = normalized.lastIndexOf('/');
171
+ if (lastSlashIndex === 0) return '/';
172
+
173
+ return normalized.substring(0, lastSlashIndex);
174
+ }
175
+
176
+ resolvePath(basePath: string, relativePath: string): string {
177
+ const normalizedBase = this.normalizePath(basePath);
178
+
179
+ if (normalizedBase === '/') {
180
+ return '/' + relativePath;
181
+ }
182
+
183
+ return normalizedBase + '/' + relativePath;
184
+ }
185
+
186
+ // Item customization
187
+ getItemIcon(item: FileBrowserItem): IconDefinition {
188
+ if (item.type === 'directory') {
189
+ return { type: 'lucide', name: 'folder-git-2', color: '#3b82f6' };
190
+ }
191
+
192
+ if (item.name) {
193
+ const extension = item.name.split('.').pop()?.toLowerCase();
194
+ switch (extension) {
195
+ case 'js':
196
+ case 'ts':
197
+ case 'mjs':
198
+ case 'cjs':
199
+ return { type: 'lucide', name: 'file-code', color: '#f7df1e' };
200
+ case 'jsx':
201
+ case 'tsx':
202
+ return { type: 'lucide', name: 'component', color: '#61dafb' };
203
+ case 'json':
204
+ return { type: 'lucide', name: 'braces', color: '#f7df1e' };
205
+ case 'md':
206
+ case 'markdown':
207
+ return { type: 'lucide', name: 'file-text', color: '#083fa1' };
208
+ case 'gitignore':
209
+ case 'gitattributes':
210
+ case 'gitmodules':
211
+ return { type: 'lucide', name: 'git-branch', color: '#f05032' };
212
+ case 'html':
213
+ case 'htm':
214
+ return { type: 'lucide', name: 'globe', color: '#e34c26' };
215
+ case 'css':
216
+ case 'scss':
217
+ case 'sass':
218
+ case 'less':
219
+ return { type: 'lucide', name: 'palette', color: '#1572b6' };
220
+ case 'jpg':
221
+ case 'jpeg':
222
+ case 'png':
223
+ case 'gif':
224
+ case 'webp':
225
+ case 'svg':
226
+ return { type: 'lucide', name: 'image', color: '#10b981' };
227
+ default:
228
+ return { type: 'lucide', name: 'file', color: '#6b7280' };
229
+ }
230
+ }
231
+
232
+ return { type: 'lucide', name: 'file', color: '#6b7280' };
233
+ }
234
+
235
+ getItemDisplayName(item: FileBrowserItem): string {
236
+ return item.name || 'Unknown';
237
+ }
238
+
239
+ // File preview capabilities
240
+ canPreviewFile(item: FileBrowserItem): boolean {
241
+ if (item.type !== 'file' || !item.name) return false;
242
+
243
+ const extension = item.name.split('.').pop()?.toLowerCase();
244
+ const previewableExtensions = [
245
+ 'txt', 'md', 'markdown', 'json', 'js', 'ts', 'jsx', 'tsx',
246
+ 'html', 'htm', 'css', 'scss', 'sass', 'less', 'xml', 'yaml', 'yml',
247
+ 'csv', 'log', 'ini', 'conf', 'config', 'gitignore', 'gitattributes'
248
+ ];
249
+
250
+ return previewableExtensions.includes(extension || '');
251
+ }
252
+
253
+ async getFilePreview(item: FileBrowserItem): Promise<PreviewData> {
254
+ if (!this.canPreviewFile(item)) {
255
+ throw new Error(`Cannot preview file: ${item.name}`);
256
+ }
257
+
258
+ try {
259
+ const content = await this.repository.getFileContent(item.path);
260
+
261
+ return {
262
+ type: 'text',
263
+ content: content,
264
+ metadata: {
265
+ size: item.size || 0,
266
+ lastModified: item.lastModified || new Date(),
267
+ gitPath: item.path,
268
+ encoding: 'utf8'
269
+ }
270
+ };
271
+ } catch (error) {
272
+ throw new Error(`Failed to read Git file: ${error instanceof Error ? error.message : 'Unknown error'}`);
273
+ }
274
+ }
275
+
276
+ async getItemPreview(item: FileBrowserItem): Promise<PreviewData | null> {
277
+ if (item.type !== 'file' || !this.canPreviewFile(item)) return null;
278
+
279
+ try {
280
+ return await this.getFilePreview(item);
281
+ } catch (error) {
282
+ console.warn(`Failed to preview Git file ${item.name}:`, error);
283
+ return null;
284
+ }
285
+ }
286
+
287
+ // Optional capabilities
288
+ canPerformAction(action: string, items: FileBrowserItem[]): boolean {
289
+ switch (action) {
290
+ case 'git-checkout':
291
+ case 'git-diff':
292
+ case 'git-history':
293
+ return items.length === 1;
294
+ case 'git-stage':
295
+ case 'git-unstage':
296
+ return items.length > 0;
297
+ default:
298
+ return false;
299
+ }
300
+ }
301
+
302
+ async performAction(action: string, items: FileBrowserItem[]): Promise<any> {
303
+ // Git-specific actions would be implemented here
304
+ switch (action) {
305
+ case 'git-checkout':
306
+ throw new Error('Git checkout action not implemented yet');
307
+ case 'git-diff':
308
+ throw new Error('Git diff action not implemented yet');
309
+ case 'git-history':
310
+ throw new Error('Git history action not implemented yet');
311
+ case 'git-stage':
312
+ throw new Error('Git stage action not implemented yet');
313
+ case 'git-unstage':
314
+ throw new Error('Git unstage action not implemented yet');
315
+ default:
316
+ throw new Error(`Unknown Git action: ${action}`);
317
+ }
318
+ }
319
+
320
+ // Lifecycle
321
+ async initialize(): Promise<void> {
322
+ // Validate that the repository is accessible
323
+ try {
324
+ if (!this.repository.path) {
325
+ throw new Error('Repository path is not set');
326
+ }
327
+ } catch (error) {
328
+ throw new Error(`Failed to initialize GitProvider: ${error instanceof Error ? error.message : 'Unknown error'}`);
329
+ }
330
+ }
331
+
332
+ dispose(): void {
333
+ // Clean up any resources if needed
334
+ // The Git repository models don't specify a dispose method,
335
+ // so we don't need to do anything here
336
+ }
337
+ }