@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,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
+ }