@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
package/dist/list.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AccessibilityConfig, BenchmarkReport, BenchmarkResult, CalculatedGridView$1 as CalculatedGridView, DETAILS_VIEW_TYPE$1 as DETAILS_VIEW_TYPE, EmptyState$1 as EmptyState, ErrorDisplay$1 as ErrorDisplay, FocusManager$1 as FocusManager, GRID_PRESETS$1 as GRID_PRESETS, GRID_VIEW_TYPE$1 as GRID_VIEW_TYPE, GridItemLayout, GridLayoutCalculator$1 as GridLayoutCalculator, GridLayoutConfig, GridLayoutResult, InlineLoading$1 as InlineLoading, ItemAccessibilityConfig, KeyboardNavigationConfig, KeyboardNavigationOptions, LIST_VIEW_TYPE$1 as LIST_VIEW_TYPE, ListContextMenu$1 as ListContextMenu, ListContextMenuItem, ListDragDropInfo, ListError,
|
|
2
|
-
export { AccessibilityConfig, BenchmarkReport, BenchmarkResult, CalculatedGridView, DETAILS_VIEW_TYPE, EmptyState, ErrorDisplay, FocusManager, GRID_PRESETS, GRID_VIEW_TYPE, GridItemLayout, GridLayoutCalculator, GridLayoutConfig, GridLayoutResult, InlineLoading, ItemAccessibilityConfig, KeyboardNavigationConfig, KeyboardNavigationOptions, LIST_VIEW_TYPE, ListContextMenu, ListContextMenuItem, ListDragDropInfo, ListError, ListErrorBoundary, ListItem, ListItemData, ListItemProps, ListItemRenderer, ListItems, ListItemsModel, ListItemsProps, ListItemsProvider, ListKeyboardHandler, ListLoadOptions, ListLoadResult, ListLoader, ListSelectionInfo, ListViewType, LoadError, LoadingIndicator, LoadingProgress, MASONRY_HORIZONTAL_VIEW_TYPE, MASONRY_PRESETS, MASONRY_VERTICAL_VIEW_TYPE, MasonryItemData, MasonryItemLayout, MasonryLayoutCalculator, MasonryLayoutConfig, MasonryLayoutResult, MasonryView, NetworkError, NoItems, NoSearchResults, NoSelection, SearchFilter, TREEMAP_VIEW_TYPE, TestListProvider, ThumbnailSize, TreemapModel, TreemapNodeData, TreemapScanProgress, TreemapView, ViewSizeControls, ViewTypeSelector, ViewTypeSelectorProps, VirtualizationConfig, VirtualizedGrid, VirtualizedGridProps, VirtualizedList, VirtualizedListProps, announceToScreenReader, benchmark, benchmarkLogger, createGridCalculator, createLiveRegionAnnouncement, createMasonryCalculator, getItemAccessibilityProps, getListAccessibilityProps, getNextFocusIndex, useListKeyboard };
|
|
1
|
+
import { AccessibilityConfig, BenchmarkReport, BenchmarkResult, CalculatedGridView$1 as CalculatedGridView, DETAILS_VIEW_TYPE$1 as DETAILS_VIEW_TYPE, EmptyState$1 as EmptyState, ErrorBoundary$1 as ErrorBoundary, ErrorDisplay$1 as ErrorDisplay, FocusManager$1 as FocusManager, GRID_PRESETS$1 as GRID_PRESETS, GRID_VIEW_TYPE$1 as GRID_VIEW_TYPE, GridItemLayout, GridLayoutCalculator$1 as GridLayoutCalculator, GridLayoutConfig, GridLayoutResult, InlineLoading$1 as InlineLoading, ItemAccessibilityConfig, KeyboardNavigationConfig, KeyboardNavigationOptions, LIST_VIEW_TYPE$1 as LIST_VIEW_TYPE, ListContextMenu$1 as ListContextMenu, ListContextMenuItem, ListDragDropInfo, ListError, ListItem$1 as ListItem, ListItemData, ListItemProps, ListItemRenderer, ListItems$1 as ListItems, ListItemsModel$1 as ListItemsModel, ListItemsProps, ListItemsProvider, ListKeyboardHandler$1 as ListKeyboardHandler, ListLoadOptions, ListLoadResult, ListLoader$1 as ListLoader, ListSelectionInfo, ListViewType, LoadError$1 as LoadError, LoadingIndicator$1 as LoadingIndicator, LoadingProgress$1 as LoadingProgress, MASONRY_HORIZONTAL_VIEW_TYPE$1 as MASONRY_HORIZONTAL_VIEW_TYPE, MASONRY_PRESETS$1 as MASONRY_PRESETS, MASONRY_VERTICAL_VIEW_TYPE$1 as MASONRY_VERTICAL_VIEW_TYPE, MasonryItemData, MasonryItemLayout, MasonryLayoutCalculator$1 as MasonryLayoutCalculator, MasonryLayoutConfig, MasonryLayoutResult, MasonryView$1 as MasonryView, NetworkError$1 as NetworkError, NoItems$1 as NoItems, NoSearchResults$1 as NoSearchResults, NoSelection$1 as NoSelection, SearchFilter$1 as SearchFilter, TREEMAP_VIEW_TYPE$1 as TREEMAP_VIEW_TYPE, TestListProvider$1 as TestListProvider, ThumbnailSize, TreemapModel$1 as TreemapModel, TreemapNodeData, TreemapScanProgress, TreemapView$1 as TreemapView, ViewSizeControls$1 as ViewSizeControls, ViewTypeSelector$1 as ViewTypeSelector, ViewTypeSelectorProps, VirtualizationConfig, VirtualizedGrid$1 as VirtualizedGrid, VirtualizedGridProps, VirtualizedList$1 as VirtualizedList, VirtualizedListProps, announceToScreenReader$1 as announceToScreenReader, benchmark$1 as benchmark, benchmarkLogger$1 as benchmarkLogger, createGridCalculator$1 as createGridCalculator, createLiveRegionAnnouncement$1 as createLiveRegionAnnouncement, createMasonryCalculator$1 as createMasonryCalculator, getItemAccessibilityProps$1 as getItemAccessibilityProps, getListAccessibilityProps$1 as getListAccessibilityProps, getNextFocusIndex$1 as getNextFocusIndex, useListKeyboard$1 as useListKeyboard } from "./index-BP4IYXiF.js";
|
|
2
|
+
export { AccessibilityConfig, BenchmarkReport, BenchmarkResult, CalculatedGridView, DETAILS_VIEW_TYPE, EmptyState, ErrorDisplay, FocusManager, GRID_PRESETS, GRID_VIEW_TYPE, GridItemLayout, GridLayoutCalculator, GridLayoutConfig, GridLayoutResult, InlineLoading, ItemAccessibilityConfig, KeyboardNavigationConfig, KeyboardNavigationOptions, LIST_VIEW_TYPE, ListContextMenu, ListContextMenuItem, ListDragDropInfo, ListError, ErrorBoundary as ListErrorBoundary, ListItem, ListItemData, ListItemProps, ListItemRenderer, ListItems, ListItemsModel, ListItemsProps, ListItemsProvider, ListKeyboardHandler, ListLoadOptions, ListLoadResult, ListLoader, ListSelectionInfo, ListViewType, LoadError, LoadingIndicator, LoadingProgress, MASONRY_HORIZONTAL_VIEW_TYPE, MASONRY_PRESETS, MASONRY_VERTICAL_VIEW_TYPE, MasonryItemData, MasonryItemLayout, MasonryLayoutCalculator, MasonryLayoutConfig, MasonryLayoutResult, MasonryView, NetworkError, NoItems, NoSearchResults, NoSelection, SearchFilter, TREEMAP_VIEW_TYPE, TestListProvider, ThumbnailSize, TreemapModel, TreemapNodeData, TreemapScanProgress, TreemapView, ViewSizeControls, ViewTypeSelector, ViewTypeSelectorProps, VirtualizationConfig, VirtualizedGrid, VirtualizedGridProps, VirtualizedList, VirtualizedListProps, announceToScreenReader, benchmark, benchmarkLogger, createGridCalculator, createLiveRegionAnnouncement, createMasonryCalculator, getItemAccessibilityProps, getListAccessibilityProps, getNextFocusIndex, useListKeyboard };
|
package/dist/list.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import "./
|
|
1
|
+
import "./utils-B4fdKKsy.js";
|
|
2
|
+
import "./iconMap-DDpe35ek.js";
|
|
2
3
|
import "./FileBrowserContext-B6jixa2j.js";
|
|
3
|
-
import { CalculatedGridView, DETAILS_VIEW_TYPE, EmptyState, ErrorDisplay, FocusManager, GRID_PRESETS, GRID_VIEW_TYPE, GridLayoutCalculator, InlineLoading, LIST_VIEW_TYPE, ListContextMenu,
|
|
4
|
+
import { CalculatedGridView, DETAILS_VIEW_TYPE, EmptyState, ErrorBoundary, ErrorDisplay, FocusManager, GRID_PRESETS, GRID_VIEW_TYPE, GridLayoutCalculator, InlineLoading, LIST_VIEW_TYPE, ListContextMenu, ListItem, ListItems, ListItemsModel, ListKeyboardHandler, ListLoader, LoadError, LoadingIndicator, LoadingProgress, MASONRY_HORIZONTAL_VIEW_TYPE, MASONRY_PRESETS, MASONRY_VERTICAL_VIEW_TYPE, MasonryLayoutCalculator, MasonryView, NetworkError, NoItems, NoSearchResults, NoSelection, SearchFilter, TREEMAP_VIEW_TYPE, TestListProvider, TreemapModel, TreemapView, ViewSizeControls, ViewTypeSelector, VirtualizedGrid, VirtualizedList, announceToScreenReader, benchmark, benchmarkLogger, createGridCalculator, createLiveRegionAnnouncement, createMasonryCalculator, getItemAccessibilityProps, getListAccessibilityProps, getNextFocusIndex, useListKeyboard } from "./list-DAq-b6RR.js";
|
|
4
5
|
|
|
5
|
-
export { CalculatedGridView, DETAILS_VIEW_TYPE, EmptyState, ErrorDisplay, FocusManager, GRID_PRESETS, GRID_VIEW_TYPE, GridLayoutCalculator, InlineLoading, LIST_VIEW_TYPE, ListContextMenu, ListErrorBoundary, ListItem, ListItems, ListItemsModel, ListKeyboardHandler, ListLoader, LoadError, LoadingIndicator, LoadingProgress, MASONRY_HORIZONTAL_VIEW_TYPE, MASONRY_PRESETS, MASONRY_VERTICAL_VIEW_TYPE, MasonryLayoutCalculator, MasonryView, NetworkError, NoItems, NoSearchResults, NoSelection, SearchFilter, TREEMAP_VIEW_TYPE, TestListProvider, TreemapModel, TreemapView, ViewSizeControls, ViewTypeSelector, VirtualizedGrid, VirtualizedList, announceToScreenReader, benchmark, benchmarkLogger, createGridCalculator, createLiveRegionAnnouncement, createMasonryCalculator, getItemAccessibilityProps, getListAccessibilityProps, getNextFocusIndex, useListKeyboard };
|
|
6
|
+
export { CalculatedGridView, DETAILS_VIEW_TYPE, EmptyState, ErrorDisplay, FocusManager, GRID_PRESETS, GRID_VIEW_TYPE, GridLayoutCalculator, InlineLoading, LIST_VIEW_TYPE, ListContextMenu, ErrorBoundary as ListErrorBoundary, ListItem, ListItems, ListItemsModel, ListKeyboardHandler, ListLoader, LoadError, LoadingIndicator, LoadingProgress, MASONRY_HORIZONTAL_VIEW_TYPE, MASONRY_PRESETS, MASONRY_VERTICAL_VIEW_TYPE, MasonryLayoutCalculator, MasonryView, NetworkError, NoItems, NoSearchResults, NoSelection, SearchFilter, TREEMAP_VIEW_TYPE, TestListProvider, TreemapModel, TreemapView, ViewSizeControls, ViewTypeSelector, VirtualizedGrid, VirtualizedList, announceToScreenReader, benchmark, benchmarkLogger, createGridCalculator, createLiveRegionAnnouncement, createMasonryCalculator, getItemAccessibilityProps, getListAccessibilityProps, getNextFocusIndex, useListKeyboard };
|
|
@@ -132,20 +132,20 @@ var MediaBrowserModel = class {
|
|
|
132
132
|
//#region src/media/MediaGrid.tsx
|
|
133
133
|
const MediaThumbnail = ({ item, onClick, selected }) => /* @__PURE__ */ jsxs("button", {
|
|
134
134
|
onClick,
|
|
135
|
-
className: `relative aspect-square rounded-lg overflow-hidden cursor-pointer group border-2 transition-all ${selected ? "border-
|
|
135
|
+
className: `relative aspect-square rounded-lg overflow-hidden cursor-pointer group border-2 transition-all ${selected ? "border-primary ring-2 ring-ring" : "border-transparent hover:border-border"}`,
|
|
136
136
|
children: [
|
|
137
137
|
item.thumbnail || item.mediaType === "photo" ? /* @__PURE__ */ jsx("img", {
|
|
138
138
|
src: item.thumbnail ?? item.url,
|
|
139
139
|
alt: item.title,
|
|
140
140
|
className: "w-full h-full object-cover"
|
|
141
141
|
}) : /* @__PURE__ */ jsx("div", {
|
|
142
|
-
className: "w-full h-full bg-
|
|
142
|
+
className: "w-full h-full bg-muted flex items-center justify-center",
|
|
143
143
|
children: item.mediaType === "video" ? /* @__PURE__ */ jsx(Play, {
|
|
144
144
|
size: 32,
|
|
145
|
-
className: "text-
|
|
145
|
+
className: "text-muted-foreground"
|
|
146
146
|
}) : /* @__PURE__ */ jsx(Music, {
|
|
147
147
|
size: 32,
|
|
148
|
-
className: "text-
|
|
148
|
+
className: "text-muted-foreground"
|
|
149
149
|
})
|
|
150
150
|
}),
|
|
151
151
|
item.mediaType === "video" && /* @__PURE__ */ jsx("div", {
|
|
@@ -183,13 +183,13 @@ const mediaIcon = (item) => {
|
|
|
183
183
|
}
|
|
184
184
|
};
|
|
185
185
|
const MediaList = observer(({ model, className = "" }) => /* @__PURE__ */ jsx("div", {
|
|
186
|
-
className: `divide-y divide-
|
|
186
|
+
className: `divide-y divide-border ${className}`,
|
|
187
187
|
children: model.filteredItems.map((item) => /* @__PURE__ */ jsxs("button", {
|
|
188
188
|
onClick: () => model.openPreview(item),
|
|
189
|
-
className: `flex items-center gap-3 px-4 py-3 w-full text-left hover:bg-
|
|
189
|
+
className: `flex items-center gap-3 px-4 py-3 w-full text-left hover:bg-muted/50 transition-colors ${model.selectedItems.has(item.id) ? "bg-primary/10" : ""}`,
|
|
190
190
|
children: [
|
|
191
191
|
/* @__PURE__ */ jsx("div", {
|
|
192
|
-
className: "w-12 h-12 rounded-lg overflow-hidden flex-shrink-0 bg-
|
|
192
|
+
className: "w-12 h-12 rounded-lg overflow-hidden flex-shrink-0 bg-muted flex items-center justify-center",
|
|
193
193
|
children: item.thumbnail ? /* @__PURE__ */ jsx("img", {
|
|
194
194
|
src: item.thumbnail,
|
|
195
195
|
alt: item.title,
|
|
@@ -199,11 +199,11 @@ const MediaList = observer(({ model, className = "" }) => /* @__PURE__ */ jsx("d
|
|
|
199
199
|
/* @__PURE__ */ jsxs("div", {
|
|
200
200
|
className: "flex-1 min-w-0",
|
|
201
201
|
children: [/* @__PURE__ */ jsx("p", {
|
|
202
|
-
className: "text-sm font-medium text-
|
|
202
|
+
className: "text-sm font-medium text-foreground truncate",
|
|
203
203
|
title: item.title,
|
|
204
204
|
children: item.title
|
|
205
205
|
}), /* @__PURE__ */ jsxs("p", {
|
|
206
|
-
className: "text-xs text-
|
|
206
|
+
className: "text-xs text-muted-foreground",
|
|
207
207
|
children: [
|
|
208
208
|
item.mediaType,
|
|
209
209
|
" ",
|
|
@@ -231,20 +231,20 @@ const TimelineThumbnail = ({ item, onClick }) => /* @__PURE__ */ jsxs("button",
|
|
|
231
231
|
alt: item.title,
|
|
232
232
|
className: "w-full h-full object-cover"
|
|
233
233
|
}) : /* @__PURE__ */ jsx("div", {
|
|
234
|
-
className: "w-full h-full bg-
|
|
234
|
+
className: "w-full h-full bg-muted flex items-center justify-center",
|
|
235
235
|
children: item.mediaType === "video" ? /* @__PURE__ */ jsx(Play, {
|
|
236
236
|
size: 24,
|
|
237
|
-
className: "text-
|
|
237
|
+
className: "text-muted-foreground"
|
|
238
238
|
}) : /* @__PURE__ */ jsx(Music, {
|
|
239
239
|
size: 24,
|
|
240
|
-
className: "text-
|
|
240
|
+
className: "text-muted-foreground"
|
|
241
241
|
})
|
|
242
242
|
}), /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors" })]
|
|
243
243
|
});
|
|
244
244
|
const MediaTimeline = observer(({ model, className = "" }) => /* @__PURE__ */ jsx("div", {
|
|
245
245
|
className: `space-y-6 p-4 ${className}`,
|
|
246
246
|
children: Array.from(model.groupedByDate.entries()).map(([date, items]) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
247
|
-
className: "text-sm font-semibold text-
|
|
247
|
+
className: "text-sm font-semibold text-foreground mb-2 sticky top-0 bg-background/90 backdrop-blur-sm py-1",
|
|
248
248
|
children: date
|
|
249
249
|
}), /* @__PURE__ */ jsx("div", {
|
|
250
250
|
className: "grid grid-cols-4 sm:grid-cols-6 md:grid-cols-8 gap-1",
|
|
@@ -296,9 +296,9 @@ const MediaPreview = observer(({ model, className = "" }) => {
|
|
|
296
296
|
className: "max-w-full max-h-[80vh] rounded-lg"
|
|
297
297
|
}),
|
|
298
298
|
item.mediaType === "audio" && /* @__PURE__ */ jsxs("div", {
|
|
299
|
-
className: "bg-
|
|
299
|
+
className: "bg-background rounded-xl p-8 flex flex-col items-center gap-4",
|
|
300
300
|
children: [/* @__PURE__ */ jsx("div", {
|
|
301
|
-
className: "w-48 h-48 bg-
|
|
301
|
+
className: "w-48 h-48 bg-muted rounded-xl flex items-center justify-center text-6xl",
|
|
302
302
|
children: "🎵"
|
|
303
303
|
}), /* @__PURE__ */ jsx("audio", {
|
|
304
304
|
src: item.url,
|
|
@@ -342,22 +342,22 @@ const AlbumSidebar = observer(({ model, provider, className = "" }) => {
|
|
|
342
342
|
provider.getAlbums().then(setAlbums);
|
|
343
343
|
}, [provider]);
|
|
344
344
|
return /* @__PURE__ */ jsx("div", {
|
|
345
|
-
className: `w-56 border-r border-
|
|
345
|
+
className: `w-56 border-r border-border bg-muted/30 overflow-y-auto ${className}`,
|
|
346
346
|
children: /* @__PURE__ */ jsxs("div", {
|
|
347
347
|
className: "p-3",
|
|
348
348
|
children: [
|
|
349
349
|
/* @__PURE__ */ jsx("h3", {
|
|
350
|
-
className: "text-xs font-semibold text-
|
|
350
|
+
className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2",
|
|
351
351
|
children: "Albums"
|
|
352
352
|
}),
|
|
353
353
|
/* @__PURE__ */ jsxs("button", {
|
|
354
354
|
onClick: () => model.setAlbum(null),
|
|
355
|
-
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentAlbum === null ? "bg-
|
|
355
|
+
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentAlbum === null ? "bg-primary/10 text-primary" : "text-foreground hover:bg-muted"}`,
|
|
356
356
|
children: [/* @__PURE__ */ jsx(Image, { size: 16 }), /* @__PURE__ */ jsx("span", { children: "All Media" })]
|
|
357
357
|
}),
|
|
358
358
|
albums.map((album) => /* @__PURE__ */ jsxs("button", {
|
|
359
359
|
onClick: () => model.setAlbum(album),
|
|
360
|
-
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentAlbum === album ? "bg-
|
|
360
|
+
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentAlbum === album ? "bg-primary/10 text-primary" : "text-foreground hover:bg-muted"}`,
|
|
361
361
|
children: [/* @__PURE__ */ jsx(FolderOpen, { size: 16 }), /* @__PURE__ */ jsx("span", {
|
|
362
362
|
className: "truncate",
|
|
363
363
|
title: album,
|
|
@@ -376,46 +376,47 @@ const MediaBrowser = observer(({ model, provider, className = "", showSidebar =
|
|
|
376
376
|
model.loadItems();
|
|
377
377
|
}, [model]);
|
|
378
378
|
return /* @__PURE__ */ jsxs("div", {
|
|
379
|
-
className: `flex h-full bg-
|
|
379
|
+
className: `flex h-full bg-background rounded-xl border border-border overflow-hidden ${className}`,
|
|
380
380
|
children: [
|
|
381
381
|
showSidebar && /* @__PURE__ */ jsx(AlbumSidebar, {
|
|
382
382
|
model,
|
|
383
|
-
provider
|
|
383
|
+
provider,
|
|
384
|
+
className: "hidden md:block"
|
|
384
385
|
}),
|
|
385
386
|
/* @__PURE__ */ jsxs("div", {
|
|
386
387
|
className: "flex-1 flex flex-col min-w-0",
|
|
387
388
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
388
|
-
className: "flex items-center gap-2 px-
|
|
389
|
+
className: "flex items-center gap-2 px-3 py-2 border-b border-border flex-wrap sm:flex-nowrap",
|
|
389
390
|
children: [
|
|
390
391
|
/* @__PURE__ */ jsxs("div", {
|
|
391
|
-
className: "relative flex-1 max-w-xs",
|
|
392
|
+
className: "relative flex-1 min-w-[120px] sm:max-w-xs",
|
|
392
393
|
children: [/* @__PURE__ */ jsx(Search, {
|
|
393
394
|
size: 16,
|
|
394
|
-
className: "absolute left-3 top-1/2 -translate-y-1/2 text-
|
|
395
|
+
className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"
|
|
395
396
|
}), /* @__PURE__ */ jsx("input", {
|
|
396
397
|
type: "text",
|
|
397
398
|
placeholder: "Search media...",
|
|
398
399
|
value: model.searchQuery,
|
|
399
400
|
onChange: (e) => model.search(e.target.value),
|
|
400
|
-
className: "w-full pl-9 pr-3 py-1.5 text-sm border border-
|
|
401
|
+
className: "w-full pl-9 pr-3 py-1.5 text-sm border border-border rounded-lg bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring"
|
|
401
402
|
})]
|
|
402
403
|
}),
|
|
403
404
|
/* @__PURE__ */ jsx("div", {
|
|
404
|
-
className: "flex items-center border border-
|
|
405
|
+
className: "flex items-center border border-border rounded-lg overflow-hidden",
|
|
405
406
|
children: [
|
|
406
407
|
["grid", Grid3X3],
|
|
407
408
|
["list", List],
|
|
408
409
|
["timeline", Clock]
|
|
409
410
|
].map(([mode, Icon]) => /* @__PURE__ */ jsx("button", {
|
|
410
411
|
onClick: () => model.setViewMode(mode),
|
|
411
|
-
className: `p-1.5 ${model.viewMode === mode ? "bg-
|
|
412
|
+
className: `p-1.5 ${model.viewMode === mode ? "bg-primary/10 text-primary" : "text-muted-foreground hover:bg-muted"}`,
|
|
412
413
|
children: /* @__PURE__ */ jsx(Icon, { size: 16 })
|
|
413
414
|
}, mode))
|
|
414
415
|
}),
|
|
415
416
|
/* @__PURE__ */ jsxs("select", {
|
|
416
417
|
value: model.filterByType ?? "",
|
|
417
418
|
onChange: (e) => model.setFilter(e.target.value || null),
|
|
418
|
-
className: "text-sm border border-
|
|
419
|
+
className: "text-sm border border-border rounded-lg px-2 py-1.5 bg-background text-foreground",
|
|
419
420
|
children: [
|
|
420
421
|
/* @__PURE__ */ jsx("option", {
|
|
421
422
|
value: "",
|
|
@@ -442,14 +443,14 @@ const MediaBrowser = observer(({ model, provider, className = "", showSidebar =
|
|
|
442
443
|
className: "flex items-center justify-center h-64",
|
|
443
444
|
children: /* @__PURE__ */ jsx(Loader2, {
|
|
444
445
|
size: 24,
|
|
445
|
-
className: "animate-spin text-
|
|
446
|
+
className: "animate-spin text-muted-foreground"
|
|
446
447
|
})
|
|
447
448
|
}) : model.error ? /* @__PURE__ */ jsx(BrowserError, {
|
|
448
449
|
error: model.error,
|
|
449
450
|
context: "Media",
|
|
450
451
|
onRetry: () => model.loadItems()
|
|
451
452
|
}) : model.filteredItems.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
452
|
-
className: "flex items-center justify-center h-64 text-
|
|
453
|
+
className: "flex items-center justify-center h-64 text-muted-foreground text-sm",
|
|
453
454
|
children: "No media found"
|
|
454
455
|
}) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
455
456
|
model.viewMode === "grid" && /* @__PURE__ */ jsx(MediaGrid, { model }),
|
|
@@ -554,4 +555,4 @@ var MockMediaProvider = class {
|
|
|
554
555
|
|
|
555
556
|
//#endregion
|
|
556
557
|
export { AlbumSidebar, MediaBrowser, MediaBrowserModel, MediaGrid, MediaList, MediaPreview, MediaTimeline, MockMediaProvider };
|
|
557
|
-
//# sourceMappingURL=media-
|
|
558
|
+
//# sourceMappingURL=media-DuczOGsk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-DuczOGsk.js","names":["provider: IMediaProvider","err: any","id: string","mode: MediaViewMode","album: string | null","query: string","sortBy: MediaSortBy","type: MediaType | null","item: MediaItem","items: MediaItem[]","item: MediaItem","MEDIA_TYPES: MediaType[]","items: MediaItem[]","id: string","item: Omit<MediaItem, 'id' | 'createdAt' | 'updatedAt'>","created: MediaItem","updates: Partial<MediaItem>","query: string","album: string","start: Date","end: Date"],"sources":["../src/media/MediaBrowserModel.ts","../src/media/MediaGrid.tsx","../src/media/MediaList.tsx","../src/media/MediaTimeline.tsx","../src/media/MediaPreview.tsx","../src/media/AlbumSidebar.tsx","../src/media/MediaBrowser.tsx","../src/media/MockMediaProvider.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from 'mobx';\nimport type { IMediaProvider, MediaItem, MediaType } from './types';\n\nexport type MediaViewMode = 'grid' | 'list' | 'timeline';\nexport type MediaSortBy = 'date' | 'name' | 'size';\n\nexport class MediaBrowserModel {\n items: MediaItem[] = [];\n selectedItems = new Set<string>();\n viewMode: MediaViewMode = 'grid';\n currentAlbum: string | null = null;\n loading = false;\n error: string | null = null;\n searchQuery = '';\n sortBy: MediaSortBy = 'date';\n filterByType: MediaType | null = null;\n previewItem: MediaItem | null = null;\n\n constructor(private provider: IMediaProvider) {\n makeAutoObservable(this);\n }\n\n get filteredItems(): MediaItem[] {\n let result = this.items;\n if (this.searchQuery) {\n const q = this.searchQuery.toLowerCase();\n result = result.filter(i => i.title.toLowerCase().includes(q));\n }\n if (this.filterByType) {\n result = result.filter(i => i.mediaType === this.filterByType);\n }\n return this.sortItems(result);\n }\n\n get groupedByDate(): Map<string, MediaItem[]> {\n const groups = new Map<string, MediaItem[]>();\n for (const item of this.filteredItems) {\n const key = item.createdAt.toLocaleDateString();\n const group = groups.get(key) ?? [];\n group.push(item);\n groups.set(key, group);\n }\n return groups;\n }\n\n get groupedByAlbum(): Map<string, MediaItem[]> {\n const groups = new Map<string, MediaItem[]>();\n for (const item of this.filteredItems) {\n const key = item.album ?? 'Uncategorized';\n const group = groups.get(key) ?? [];\n group.push(item);\n groups.set(key, group);\n }\n return groups;\n }\n\n async loadItems() {\n this.loading = true;\n this.error = null;\n try {\n const items = this.currentAlbum\n ? await this.provider.getByAlbum(this.currentAlbum)\n : await this.provider.listItems();\n runInAction(() => { this.items = items; });\n } catch (err: any) {\n runInAction(() => { this.error = err?.message || 'Failed to load media'; });\n } finally {\n runInAction(() => { this.loading = false; });\n }\n }\n\n selectItem(id: string) {\n this.selectedItems.clear();\n this.selectedItems.add(id);\n }\n\n toggleSelect(id: string) {\n if (this.selectedItems.has(id)) {\n this.selectedItems.delete(id);\n } else {\n this.selectedItems.add(id);\n }\n }\n\n setViewMode(mode: MediaViewMode) {\n this.viewMode = mode;\n }\n\n setAlbum(album: string | null) {\n this.currentAlbum = album;\n this.loadItems();\n }\n\n async search(query: string) {\n this.searchQuery = query;\n if (query) {\n this.loading = true;\n this.error = null;\n try {\n const items = await this.provider.search(query);\n runInAction(() => { this.items = items; });\n } catch (err: any) {\n runInAction(() => { this.error = err?.message || 'Search failed'; });\n } finally {\n runInAction(() => { this.loading = false; });\n }\n } else {\n this.loadItems();\n }\n }\n\n setSort(sortBy: MediaSortBy) {\n this.sortBy = sortBy;\n }\n\n setFilter(type: MediaType | null) {\n this.filterByType = type;\n }\n\n openPreview(item: MediaItem) {\n this.previewItem = item;\n }\n\n closePreview() {\n this.previewItem = null;\n }\n\n private sortItems(items: MediaItem[]): MediaItem[] {\n return [...items].sort((a, b) => {\n switch (this.sortBy) {\n case 'date': return b.createdAt.getTime() - a.createdAt.getTime();\n case 'name': return a.title.localeCompare(b.title);\n case 'size': return (b.width ?? 0) * (b.height ?? 0) - (a.width ?? 0) * (a.height ?? 0);\n default: return 0;\n }\n });\n }\n}\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Play, Music } from 'lucide-react';\nimport type { MediaBrowserModel } from './MediaBrowserModel';\nimport type { MediaItem } from './types';\n\nexport interface MediaGridProps {\n model: MediaBrowserModel;\n className?: string;\n}\n\nconst MediaThumbnail = ({ item, onClick, selected }: { item: MediaItem; onClick: () => void; selected: boolean }) => (\n <button\n onClick={onClick}\n className={`relative aspect-square rounded-lg overflow-hidden cursor-pointer group border-2 transition-all ${\n selected ? 'border-primary ring-2 ring-ring' : 'border-transparent hover:border-border'\n }`}\n >\n {item.thumbnail || item.mediaType === 'photo' ? (\n <img\n src={item.thumbnail ?? item.url}\n alt={item.title}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-muted flex items-center justify-center\">\n {item.mediaType === 'video' ? <Play size={32} className=\"text-muted-foreground\" /> : <Music size={32} className=\"text-muted-foreground\" />}\n </div>\n )}\n {item.mediaType === 'video' && (\n <div className=\"absolute bottom-1 right-1 bg-black/70 text-white text-xs px-1.5 py-0.5 rounded\">\n {item.duration ? `${Math.floor(item.duration / 60)}:${String(item.duration % 60).padStart(2, '0')}` : 'Video'}\n </div>\n )}\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors\" />\n </button>\n);\n\nexport const MediaGrid = observer<MediaGridProps>(({ model, className = '' }) => (\n <div className={`grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 gap-1 p-2 ${className}`}>\n {model.filteredItems.map(item => (\n <MediaThumbnail\n key={item.id}\n item={item}\n selected={model.selectedItems.has(item.id)}\n onClick={() => model.openPreview(item)}\n />\n ))}\n </div>\n));\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Image, Play, Music } from 'lucide-react';\nimport type { MediaBrowserModel } from './MediaBrowserModel';\nimport type { MediaItem } from './types';\n\nexport interface MediaListProps {\n model: MediaBrowserModel;\n className?: string;\n}\n\nconst mediaIcon = (item: MediaItem) => {\n switch (item.mediaType) {\n case 'photo': return <Image size={16} className=\"text-green-500\" />;\n case 'video': return <Play size={16} className=\"text-blue-500\" />;\n case 'audio': return <Music size={16} className=\"text-purple-500\" />;\n }\n};\n\nexport const MediaList = observer<MediaListProps>(({ model, className = '' }) => (\n <div className={`divide-y divide-border ${className}`}>\n {model.filteredItems.map(item => (\n <button\n key={item.id}\n onClick={() => model.openPreview(item)}\n className={`flex items-center gap-3 px-4 py-3 w-full text-left hover:bg-muted/50 transition-colors ${\n model.selectedItems.has(item.id) ? 'bg-primary/10' : ''\n }`}\n >\n <div className=\"w-12 h-12 rounded-lg overflow-hidden flex-shrink-0 bg-muted flex items-center justify-center\">\n {item.thumbnail ? (\n <img src={item.thumbnail} alt={item.title} className=\"w-full h-full object-cover\" />\n ) : (\n mediaIcon(item)\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground truncate\" title={item.title}>{item.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {item.mediaType} {item.album && `· ${item.album}`} · {item.createdAt.toLocaleDateString()}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {mediaIcon(item)}\n </div>\n </button>\n ))}\n </div>\n));\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Play, Music } from 'lucide-react';\nimport type { MediaBrowserModel } from './MediaBrowserModel';\nimport type { MediaItem } from './types';\n\nexport interface MediaTimelineProps {\n model: MediaBrowserModel;\n className?: string;\n}\n\nconst TimelineThumbnail = ({ item, onClick }: { item: MediaItem; onClick: () => void }) => (\n <button onClick={onClick} className=\"relative aspect-square rounded-lg overflow-hidden cursor-pointer group\">\n {item.thumbnail || item.mediaType === 'photo' ? (\n <img src={item.thumbnail ?? item.url} alt={item.title} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full bg-muted flex items-center justify-center\">\n {item.mediaType === 'video' ? <Play size={24} className=\"text-muted-foreground\" /> : <Music size={24} className=\"text-muted-foreground\" />}\n </div>\n )}\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors\" />\n </button>\n);\n\nexport const MediaTimeline = observer<MediaTimelineProps>(({ model, className = '' }) => (\n <div className={`space-y-6 p-4 ${className}`}>\n {Array.from(model.groupedByDate.entries()).map(([date, items]) => (\n <div key={date}>\n <h3 className=\"text-sm font-semibold text-foreground mb-2 sticky top-0 bg-background/90 backdrop-blur-sm py-1\">{date}</h3>\n <div className=\"grid grid-cols-4 sm:grid-cols-6 md:grid-cols-8 gap-1\">\n {items.map(item => (\n <TimelineThumbnail key={item.id} item={item} onClick={() => model.openPreview(item)} />\n ))}\n </div>\n </div>\n ))}\n </div>\n));\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { X, ChevronLeft, ChevronRight, Download } from 'lucide-react';\nimport type { MediaBrowserModel } from './MediaBrowserModel';\n\nexport interface MediaPreviewProps {\n model: MediaBrowserModel;\n className?: string;\n}\n\nexport const MediaPreview = observer<MediaPreviewProps>(({ model, className = '' }) => {\n const item = model.previewItem;\n if (!item) return null;\n\n const items = model.filteredItems;\n const idx = items.findIndex(i => i.id === item.id);\n\n const goPrev = () => {\n if (idx > 0) model.openPreview(items[idx - 1]);\n };\n const goNext = () => {\n if (idx < items.length - 1) model.openPreview(items[idx + 1]);\n };\n\n return (\n <div className={`fixed inset-0 z-50 bg-black/90 flex items-center justify-center ${className}`}>\n <button onClick={() => model.closePreview()} className=\"absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10\">\n <X size={24} />\n </button>\n\n <button onClick={goPrev} disabled={idx <= 0} className=\"absolute left-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 disabled:opacity-30\">\n <ChevronLeft size={32} />\n </button>\n\n <div className=\"max-w-[90vw] max-h-[90vh] flex flex-col items-center\">\n {item.mediaType === 'photo' && (\n <img src={item.url} alt={item.title} className=\"max-w-full max-h-[80vh] object-contain rounded-lg\" />\n )}\n {item.mediaType === 'video' && (\n <video src={item.url} controls className=\"max-w-full max-h-[80vh] rounded-lg\" />\n )}\n {item.mediaType === 'audio' && (\n <div className=\"bg-background rounded-xl p-8 flex flex-col items-center gap-4\">\n <div className=\"w-48 h-48 bg-muted rounded-xl flex items-center justify-center text-6xl\">🎵</div>\n <audio src={item.url} controls className=\"w-80\" />\n </div>\n )}\n <div className=\"mt-4 text-center\">\n <p className=\"text-white font-medium\">{item.title}</p>\n <p className=\"text-white/60 text-sm\">{item.createdAt.toLocaleDateString()}</p>\n </div>\n </div>\n\n <button onClick={goNext} disabled={idx >= items.length - 1} className=\"absolute right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 disabled:opacity-30\">\n <ChevronRight size={32} />\n </button>\n\n <a href={item.url} download className=\"absolute bottom-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10\">\n <Download size={20} />\n </a>\n </div>\n );\n});\n","import React, { useEffect, useState } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { FolderOpen, Image } from 'lucide-react';\nimport type { MediaBrowserModel } from './MediaBrowserModel';\nimport type { IMediaProvider } from './types';\n\nexport interface AlbumSidebarProps {\n model: MediaBrowserModel;\n provider: IMediaProvider;\n className?: string;\n}\n\nexport const AlbumSidebar = observer<AlbumSidebarProps>(({ model, provider, className = '' }) => {\n const [albums, setAlbums] = useState<string[]>([]);\n\n useEffect(() => {\n provider.getAlbums().then(setAlbums);\n }, [provider]);\n\n return (\n <div className={`w-56 border-r border-border bg-muted/30 overflow-y-auto ${className}`}>\n <div className=\"p-3\">\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2\">Albums</h3>\n <button\n onClick={() => model.setAlbum(null)}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${\n model.currentAlbum === null ? 'bg-primary/10 text-primary' : 'text-foreground hover:bg-muted'\n }`}\n >\n <Image size={16} />\n <span>All Media</span>\n </button>\n {albums.map(album => (\n <button\n key={album}\n onClick={() => model.setAlbum(album)}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${\n model.currentAlbum === album ? 'bg-primary/10 text-primary' : 'text-foreground hover:bg-muted'\n }`}\n >\n <FolderOpen size={16} />\n <span className=\"truncate\" title={album}>{album}</span>\n </button>\n ))}\n </div>\n </div>\n );\n});\n","import React, { useEffect } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Grid3X3, List, Clock, Search, Loader2 } from 'lucide-react';\nimport { BrowserError } from '@anymux/ui/components/browser-error';\nimport type { MediaBrowserModel } from './MediaBrowserModel';\nimport type { IMediaProvider } from './types';\nimport { MediaGrid } from './MediaGrid';\nimport { MediaList } from './MediaList';\nimport { MediaTimeline } from './MediaTimeline';\nimport { MediaPreview } from './MediaPreview';\nimport { AlbumSidebar } from './AlbumSidebar';\n\nexport interface MediaBrowserProps {\n model: MediaBrowserModel;\n provider: IMediaProvider;\n className?: string;\n showSidebar?: boolean;\n}\n\nexport const MediaBrowser = observer<MediaBrowserProps>(({ model, provider, className = '', showSidebar = true }) => {\n useEffect(() => { model.loadItems(); }, [model]);\n\n return (\n <div className={`flex h-full bg-background rounded-xl border border-border overflow-hidden ${className}`}>\n {showSidebar && <AlbumSidebar model={model} provider={provider} className=\"hidden md:block\" />}\n\n <div className=\"flex-1 flex flex-col min-w-0\">\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border flex-wrap sm:flex-nowrap\">\n <div className=\"relative flex-1 min-w-[120px] sm:max-w-xs\">\n <Search size={16} className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder=\"Search media...\"\n value={model.searchQuery}\n onChange={e => model.search(e.target.value)}\n className=\"w-full pl-9 pr-3 py-1.5 text-sm border border-border rounded-lg bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n\n <div className=\"flex items-center border border-border rounded-lg overflow-hidden\">\n {([['grid', Grid3X3], ['list', List], ['timeline', Clock]] as const).map(([mode, Icon]) => (\n <button\n key={mode}\n onClick={() => model.setViewMode(mode)}\n className={`p-1.5 ${model.viewMode === mode ? 'bg-primary/10 text-primary' : 'text-muted-foreground hover:bg-muted'}`}\n >\n <Icon size={16} />\n </button>\n ))}\n </div>\n\n <select\n value={model.filterByType ?? ''}\n onChange={e => model.setFilter(e.target.value as 'photo' | 'video' | 'audio' || null)}\n className=\"text-sm border border-border rounded-lg px-2 py-1.5 bg-background text-foreground\"\n >\n <option value=\"\">All types</option>\n <option value=\"photo\">Photos</option>\n <option value=\"video\">Videos</option>\n <option value=\"audio\">Audio</option>\n </select>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {model.loading ? (\n <div className=\"flex items-center justify-center h-64\">\n <Loader2 size={24} className=\"animate-spin text-muted-foreground\" />\n </div>\n ) : model.error ? (\n <BrowserError\n error={model.error}\n context=\"Media\"\n onRetry={() => model.loadItems()}\n />\n ) : model.filteredItems.length === 0 ? (\n <div className=\"flex items-center justify-center h-64 text-muted-foreground text-sm\">No media found</div>\n ) : (\n <>\n {model.viewMode === 'grid' && <MediaGrid model={model} />}\n {model.viewMode === 'list' && <MediaList model={model} />}\n {model.viewMode === 'timeline' && <MediaTimeline model={model} />}\n </>\n )}\n </div>\n </div>\n\n <MediaPreview model={model} />\n </div>\n );\n});\n","import type { IMediaProvider, MediaItem, MediaType } from './types';\n\nconst ALBUMS = ['Vacation 2024', 'Family', 'Nature', 'City Lights', 'Concerts'];\nconst MEDIA_TYPES: MediaType[] = ['photo', 'video', 'audio'];\n\nfunction generateMediaItems(count = 60): MediaItem[] {\n const items: MediaItem[] = [];\n const now = Date.now();\n for (let i = 0; i < count; i++) {\n const mediaType = MEDIA_TYPES[i % 3];\n const date = new Date(now - i * 86400000 * Math.random() * 30);\n items.push({\n id: `media-${i}`,\n type: 'media',\n title: `${mediaType === 'photo' ? 'IMG' : mediaType === 'video' ? 'VID' : 'AUD'}_${String(i).padStart(4, '0')}`,\n mediaType,\n url: `https://picsum.photos/seed/${i}/800/600`,\n thumbnail: `https://picsum.photos/seed/${i}/200/200`,\n mimeType: mediaType === 'photo' ? 'image/jpeg' : mediaType === 'video' ? 'video/mp4' : 'audio/mpeg',\n width: mediaType !== 'audio' ? 800 + (i % 5) * 100 : undefined,\n height: mediaType !== 'audio' ? 600 + (i % 3) * 100 : undefined,\n duration: mediaType !== 'photo' ? 30 + i * 5 : undefined,\n album: ALBUMS[i % ALBUMS.length],\n artist: mediaType === 'audio' ? `Artist ${i % 10}` : undefined,\n createdAt: date,\n updatedAt: date,\n tags: [`tag${i % 5}`],\n });\n }\n return items;\n}\n\nexport class MockMediaProvider implements IMediaProvider {\n private items = generateMediaItems();\n\n async listItems() { return this.items; }\n\n async getItem(id: string) { return this.items.find(i => i.id === id) ?? null; }\n\n async createItem(item: Omit<MediaItem, 'id' | 'createdAt' | 'updatedAt'>) {\n const now = new Date();\n const created: MediaItem = { ...item, id: `media-${Date.now()}`, createdAt: now, updatedAt: now } as MediaItem;\n this.items.push(created);\n return created;\n }\n\n async updateItem(id: string, updates: Partial<MediaItem>) {\n const idx = this.items.findIndex(i => i.id === id);\n if (idx === -1) throw new Error('Not found');\n this.items[idx] = { ...this.items[idx], ...updates, updatedAt: new Date() };\n return this.items[idx];\n }\n\n async deleteItem(id: string) {\n this.items = this.items.filter(i => i.id !== id);\n }\n\n async search(query: string) {\n const q = query.toLowerCase();\n return this.items.filter(i => i.title.toLowerCase().includes(q));\n }\n\n async getAlbums() { return ALBUMS; }\n\n async getByAlbum(album: string) { return this.items.filter(i => i.album === album); }\n\n async getByDateRange(start: Date, end: Date) {\n return this.items.filter(i => i.createdAt >= start && i.createdAt <= end);\n }\n}\n"],"mappings":"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"}
|
package/dist/media.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { AlbumSidebar, MediaBrowser, MediaBrowserModel, MediaGrid, MediaList, MediaPreview, MediaTimeline, MockMediaProvider } from "./media-
|
|
1
|
+
import { AlbumSidebar, MediaBrowser, MediaBrowserModel, MediaGrid, MediaList, MediaPreview, MediaTimeline, MockMediaProvider } from "./media-DuczOGsk.js";
|
|
2
2
|
|
|
3
3
|
export { AlbumSidebar, MediaBrowser, MediaBrowserModel, MediaGrid, MediaList, MediaPreview, MediaTimeline, MockMediaProvider };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cn$1 as cn } from "./utils-B4fdKKsy.js";
|
|
2
|
-
import { resolveIcon$1 as resolveIcon } from "./iconMap-
|
|
2
|
+
import { resolveIcon$1 as resolveIcon } from "./iconMap-DDpe35ek.js";
|
|
3
3
|
import { useFileBrowserContext } from "./FileBrowserContext-B6jixa2j.js";
|
|
4
4
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
5
|
import { observer } from "mobx-react-lite";
|
|
@@ -3348,4 +3348,4 @@ const TreeTable = observer(({ treeModel, columns: propColumns, enableAnimations
|
|
|
3348
3348
|
|
|
3349
3349
|
//#endregion
|
|
3350
3350
|
export { DEFAULT_SELECTION_THEME, SimpleTreeProvider, TestTreeProvider, Tree, TreeCheckbox, TreeContextMenu, TreeModel, TreeNodeList, TreeTable, getCustomColorVariables, getSelectionClasses, logger };
|
|
3351
|
-
//# sourceMappingURL=tree-
|
|
3351
|
+
//# sourceMappingURL=tree-B9VQcKBp.js.map
|