react-native-inapp-inspector 2.3.18 → 2.3.19

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 (79) hide show
  1. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +47 -0
  2. package/dist/commonjs/capture.d.ts +2 -0
  3. package/dist/commonjs/capture.js +3 -0
  4. package/dist/commonjs/components/EmptyState.d.ts +1 -0
  5. package/dist/commonjs/components/EmptyState.js +2 -2
  6. package/dist/commonjs/components/Inspector/FabLauncher.js +494 -39
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +45 -26
  8. package/dist/commonjs/components/Inspector/MainScreen.js +4 -3
  9. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +418 -13
  10. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +376 -88
  11. package/dist/commonjs/components/Inspector/NetworkDetail.js +49 -63
  12. package/dist/commonjs/components/Inspector/SettingsPanel.js +499 -119
  13. package/dist/commonjs/components/Inspector/TabBar.js +166 -4
  14. package/dist/commonjs/components/JsonViewer.js +4 -3
  15. package/dist/commonjs/components/NetworkIcons.d.ts +4 -0
  16. package/dist/commonjs/components/NetworkIcons.js +26 -1
  17. package/dist/commonjs/components/SegmentedTabs.js +1 -0
  18. package/dist/commonjs/constants/version.d.ts +1 -1
  19. package/dist/commonjs/constants/version.js +1 -1
  20. package/dist/commonjs/i18n/locales/en.json +20 -2
  21. package/dist/commonjs/index.js +45 -30
  22. package/dist/commonjs/native/NativeInspector.d.ts +3 -0
  23. package/dist/commonjs/native/NativeInspector.js +14 -1
  24. package/dist/commonjs/native/NativeNetworkInspector.d.ts +1 -0
  25. package/dist/commonjs/styles/AppColors.js +78 -78
  26. package/dist/commonjs/types/enums.d.ts +2 -0
  27. package/dist/commonjs/types/enums.js +2 -0
  28. package/dist/commonjs/types/interfaces.d.ts +5 -0
  29. package/dist/esm/capture.d.ts +2 -0
  30. package/dist/esm/capture.js +4 -1
  31. package/dist/esm/components/EmptyState.d.ts +1 -0
  32. package/dist/esm/components/EmptyState.js +2 -2
  33. package/dist/esm/components/Inspector/FabLauncher.js +462 -40
  34. package/dist/esm/components/Inspector/InspectorHeader.js +46 -27
  35. package/dist/esm/components/Inspector/MainScreen.js +4 -3
  36. package/dist/esm/components/Inspector/MediaGalleryTab.js +419 -14
  37. package/dist/esm/components/Inspector/MediaPreviewModal.js +379 -91
  38. package/dist/esm/components/Inspector/NetworkDetail.js +49 -63
  39. package/dist/esm/components/Inspector/SettingsPanel.js +500 -120
  40. package/dist/esm/components/Inspector/TabBar.js +135 -6
  41. package/dist/esm/components/JsonViewer.js +4 -3
  42. package/dist/esm/components/NetworkIcons.d.ts +4 -0
  43. package/dist/esm/components/NetworkIcons.js +21 -0
  44. package/dist/esm/components/SegmentedTabs.js +1 -0
  45. package/dist/esm/constants/version.d.ts +1 -1
  46. package/dist/esm/constants/version.js +1 -1
  47. package/dist/esm/i18n/locales/en.json +20 -2
  48. package/dist/esm/index.js +44 -29
  49. package/dist/esm/native/NativeInspector.d.ts +3 -0
  50. package/dist/esm/native/NativeInspector.js +12 -0
  51. package/dist/esm/native/NativeNetworkInspector.d.ts +1 -0
  52. package/dist/esm/styles/AppColors.js +78 -78
  53. package/dist/esm/types/enums.d.ts +2 -0
  54. package/dist/esm/types/enums.js +2 -0
  55. package/dist/esm/types/interfaces.d.ts +5 -0
  56. package/ios/NetworkInspectorModule.mm +241 -136
  57. package/package.json +1 -1
  58. package/react-native-inapp-inspector.podspec +1 -1
  59. package/src/capture.ts +8 -0
  60. package/src/components/EmptyState.tsx +3 -1
  61. package/src/components/Inspector/FabLauncher.tsx +562 -52
  62. package/src/components/Inspector/InspectorHeader.tsx +60 -22
  63. package/src/components/Inspector/MainScreen.tsx +3 -2
  64. package/src/components/Inspector/MediaGalleryTab.tsx +502 -28
  65. package/src/components/Inspector/MediaPreviewModal.tsx +465 -117
  66. package/src/components/Inspector/NetworkDetail.tsx +80 -97
  67. package/src/components/Inspector/SettingsPanel.tsx +708 -152
  68. package/src/components/Inspector/TabBar.tsx +174 -6
  69. package/src/components/JsonViewer.tsx +4 -2
  70. package/src/components/NetworkIcons.tsx +56 -0
  71. package/src/components/SegmentedTabs.tsx +1 -0
  72. package/src/constants/version.ts +1 -1
  73. package/src/i18n/locales/en.json +20 -4
  74. package/src/index.tsx +46 -31
  75. package/src/native/NativeInspector.ts +17 -0
  76. package/src/native/NativeNetworkInspector.ts +1 -0
  77. package/src/styles/AppColors.ts +80 -80
  78. package/src/types/enums.ts +2 -0
  79. package/src/types/interfaces.ts +5 -0
@@ -49,21 +49,26 @@ const capture_1 = require("../../capture");
49
49
  const helpers_1 = require("../../helpers");
50
50
  const toast_1 = require("../../helpers/toast");
51
51
  const i18n_1 = require("../../i18n");
52
+ const InspectorContext_1 = require("./InspectorContext");
52
53
  const MediaGalleryTab = () => {
53
54
  const { t } = (0, i18n_1.useTranslation)();
55
+ const { refreshMediaCount, switchActiveTab } = (0, InspectorContext_1.useInspector)();
54
56
  const [mediaList, setMediaList] = (0, react_1.useState)([]);
55
57
  const [refreshing, setRefreshing] = (0, react_1.useState)(false);
56
58
  const [selectedFilter, setSelectedFilter] = (0, react_1.useState)('all');
57
59
  const [selectedItem, setSelectedItem] = (0, react_1.useState)(null);
60
+ const [selectedIds, setSelectedIds] = (0, react_1.useState)(new Set());
61
+ const [viewMode, setViewMode] = (0, react_1.useState)('grid');
58
62
  const loadMedia = (0, react_1.useCallback)(async () => {
59
63
  try {
60
64
  const items = await capture_1.ScreenCapture.getMediaList();
61
65
  setMediaList(items);
66
+ refreshMediaCount?.().catch(() => { });
62
67
  }
63
68
  catch {
64
69
  setMediaList([]);
65
70
  }
66
- }, []);
71
+ }, [refreshMediaCount]);
67
72
  (0, react_1.useEffect)(() => {
68
73
  loadMedia();
69
74
  }, [loadMedia]);
@@ -80,11 +85,57 @@ const MediaGalleryTab = () => {
80
85
  const totalStorageBytes = (0, react_1.useMemo)(() => {
81
86
  return mediaList.reduce((sum, item) => sum + (item.sizeBytes || 0), 0);
82
87
  }, [mediaList]);
88
+ const toggleSelect = (0, react_1.useCallback)((id) => {
89
+ setSelectedIds(prev => {
90
+ const next = new Set(prev);
91
+ if (next.has(id)) {
92
+ next.delete(id);
93
+ }
94
+ else {
95
+ next.add(id);
96
+ }
97
+ return next;
98
+ });
99
+ }, []);
83
100
  const handleDeleteItem = async (item) => {
84
101
  await capture_1.ScreenCapture.deleteMedia(item.uri);
102
+ setSelectedIds(prev => {
103
+ const next = new Set(prev);
104
+ next.delete(item.id);
105
+ return next;
106
+ });
85
107
  await loadMedia();
108
+ const count = await refreshMediaCount?.();
109
+ if (count === 0) {
110
+ switchActiveTab('apis');
111
+ }
86
112
  (0, toast_1.showToast)(t('mediaGallery.deleted'));
87
113
  };
114
+ const handleDeleteSelected = () => {
115
+ const count = selectedIds.size;
116
+ if (count === 0)
117
+ return;
118
+ react_native_1.Alert.alert(t('mediaGallery.deleteSelectedTitle'), t('mediaGallery.deleteSelectedMessage', { count }), [
119
+ { text: t('common.cancel'), style: 'cancel' },
120
+ {
121
+ text: t('mediaGallery.delete'),
122
+ style: 'destructive',
123
+ onPress: async () => {
124
+ const itemsToDelete = mediaList.filter(item => selectedIds.has(item.id));
125
+ for (const item of itemsToDelete) {
126
+ await capture_1.ScreenCapture.deleteMedia(item.uri);
127
+ }
128
+ setSelectedIds(new Set());
129
+ await loadMedia();
130
+ const remainingCount = await refreshMediaCount?.();
131
+ if (remainingCount === 0) {
132
+ switchActiveTab('apis');
133
+ }
134
+ (0, toast_1.showToast)(t('mediaGallery.deletedCount', { count: itemsToDelete.length }));
135
+ },
136
+ },
137
+ ]);
138
+ };
88
139
  const handleClearAll = () => {
89
140
  react_native_1.Alert.alert(t('mediaGallery.purgeTitle'), t('mediaGallery.purgeMessage', { count: mediaList.length, size: (0, helpers_1.formatBytes)(totalStorageBytes) }), [
90
141
  { text: t('common.cancel'), style: 'cancel' },
@@ -93,7 +144,10 @@ const MediaGalleryTab = () => {
93
144
  style: 'destructive',
94
145
  onPress: async () => {
95
146
  await capture_1.ScreenCapture.clearAllMedia();
147
+ setSelectedIds(new Set());
96
148
  await loadMedia();
149
+ await refreshMediaCount?.();
150
+ switchActiveTab('apis');
97
151
  (0, toast_1.showToast)(t('mediaGallery.allPurged'));
98
152
  },
99
153
  },
@@ -103,14 +157,45 @@ const MediaGalleryTab = () => {
103
157
  const gifResult = await capture_1.ScreenCapture.convertToGif(item.uri, { fps: 12, width: 480 });
104
158
  if (gifResult) {
105
159
  await loadMedia();
160
+ refreshMediaCount?.().catch(() => { });
106
161
  }
107
162
  };
108
- const renderItem = ({ item }) => {
163
+ const renderFilterIcon = (filterKey, isActive) => {
164
+ const iconColor = isActive ? AppColors_1.AppColors.sky400 : AppColors_1.AppColors.slate400;
165
+ const iconSize = 12;
166
+ switch (filterKey) {
167
+ case 'all':
168
+ return <NetworkIcons_1.ScreencastIcon size={iconSize} color={iconColor}/>;
169
+ case 'image':
170
+ return <NetworkIcons_1.ImageIcon size={iconSize} color={iconColor}/>;
171
+ case 'video':
172
+ return <NetworkIcons_1.FilmIcon size={iconSize} color={iconColor}/>;
173
+ case 'gif':
174
+ return <NetworkIcons_1.GifIcon size={iconSize} color={iconColor}/>;
175
+ }
176
+ };
177
+ const renderGridItem = ({ item }) => {
109
178
  const isVideo = item.type === 'video';
110
179
  const isGif = item.type === 'gif';
111
- return (<TouchableScale_1.default onPress={() => setSelectedItem(item)} style={galleryStyles.card}>
180
+ const thumbUri = isVideo ? item.thumbnailUri : item.uri;
181
+ const isSelected = selectedIds.has(item.id);
182
+ return (<TouchableScale_1.default onPress={() => setSelectedItem(item)} style={[galleryStyles.card, isSelected && galleryStyles.cardSelected]}>
112
183
  <react_native_1.View style={galleryStyles.thumbnailContainer}>
113
- <react_native_1.Image source={{ uri: item.uri }} style={galleryStyles.thumbnail} resizeMode="cover"/>
184
+ {thumbUri ? (<react_native_1.Image source={{ uri: thumbUri }} style={galleryStyles.thumbnail} resizeMode="cover"/>) : (<react_native_1.View style={galleryStyles.thumbnailFallback}>
185
+ {isVideo ? (<NetworkIcons_1.FilmIcon size={26} color={AppColors_1.AppColors.sky400}/>) : (<NetworkIcons_1.ImageIcon size={26} color={AppColors_1.AppColors.slate400}/>)}
186
+ </react_native_1.View>)}
187
+
188
+
189
+ <react_native_1.TouchableOpacity onPress={() => toggleSelect(item.id)} style={[
190
+ galleryStyles.checkbox,
191
+ isSelected && galleryStyles.checkboxSelected,
192
+ ]} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
193
+ {isSelected && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.white}/>}
194
+ </react_native_1.TouchableOpacity>
195
+
196
+ {isVideo && (<react_native_1.View style={galleryStyles.miniPlayCircle}>
197
+ <NetworkIcons_1.PlayIcon size={14} color={AppColors_1.AppColors.white}/>
198
+ </react_native_1.View>)}
114
199
  <react_native_1.View style={galleryStyles.typeBadge}>
115
200
  {isVideo ? (<NetworkIcons_1.FilmIcon size={11} color={AppColors_1.AppColors.sky400}/>) : isGif ? (<NetworkIcons_1.GifIcon size={11} color={AppColors_1.AppColors.warningAmber}/>) : (<NetworkIcons_1.ImageIcon size={11} color={AppColors_1.AppColors.emerald500}/>)}
116
201
  <react_native_1.Text style={galleryStyles.typeBadgeText}>
@@ -135,6 +220,59 @@ const MediaGalleryTab = () => {
135
220
  </react_native_1.View>
136
221
  </TouchableScale_1.default>);
137
222
  };
223
+ const renderListItem = ({ item }) => {
224
+ const isVideo = item.type === 'video';
225
+ const isGif = item.type === 'gif';
226
+ const thumbUri = isVideo ? item.thumbnailUri : item.uri;
227
+ const isSelected = selectedIds.has(item.id);
228
+ return (<TouchableScale_1.default onPress={() => setSelectedItem(item)} style={[galleryStyles.listRow, isSelected && galleryStyles.listRowSelected]}>
229
+
230
+ <react_native_1.TouchableOpacity onPress={() => toggleSelect(item.id)} style={[
231
+ galleryStyles.listCheckbox,
232
+ isSelected && galleryStyles.checkboxSelected,
233
+ ]} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
234
+ {isSelected && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.white}/>}
235
+ </react_native_1.TouchableOpacity>
236
+
237
+
238
+ <react_native_1.View style={galleryStyles.listThumbContainer}>
239
+ {thumbUri ? (<react_native_1.Image source={{ uri: thumbUri }} style={galleryStyles.listThumb} resizeMode="cover"/>) : (<react_native_1.View style={galleryStyles.listThumbFallback}>
240
+ {isVideo ? (<NetworkIcons_1.FilmIcon size={18} color={AppColors_1.AppColors.sky400}/>) : (<NetworkIcons_1.ImageIcon size={18} color={AppColors_1.AppColors.slate400}/>)}
241
+ </react_native_1.View>)}
242
+ {isVideo && (<react_native_1.View style={galleryStyles.listMiniPlay}>
243
+ <NetworkIcons_1.PlayIcon size={10} color={AppColors_1.AppColors.white}/>
244
+ </react_native_1.View>)}
245
+ </react_native_1.View>
246
+
247
+
248
+ <react_native_1.View style={galleryStyles.listInfo}>
249
+ <react_native_1.Text style={galleryStyles.listTitle} numberOfLines={1}>
250
+ {item.filename}
251
+ </react_native_1.Text>
252
+ <react_native_1.View style={galleryStyles.listMetaRow}>
253
+ <react_native_1.View style={galleryStyles.listBadge}>
254
+ {isVideo ? (<NetworkIcons_1.FilmIcon size={10} color={AppColors_1.AppColors.sky400}/>) : isGif ? (<NetworkIcons_1.GifIcon size={10} color={AppColors_1.AppColors.warningAmber}/>) : (<NetworkIcons_1.ImageIcon size={10} color={AppColors_1.AppColors.emerald500}/>)}
255
+ <react_native_1.Text style={galleryStyles.listBadgeText}>
256
+ {item.format.toUpperCase()}
257
+ </react_native_1.Text>
258
+ </react_native_1.View>
259
+ <react_native_1.Text style={galleryStyles.cardMeta}>
260
+ {(0, helpers_1.formatBytes)(item.sizeBytes)}
261
+ </react_native_1.Text>
262
+ <react_native_1.Text style={galleryStyles.cardMetaDot}>•</react_native_1.Text>
263
+ <react_native_1.Text style={galleryStyles.cardMeta}>
264
+ {new Date(item.timestamp).toLocaleDateString([], { month: 'short', day: 'numeric' })}{' '}
265
+ {new Date(item.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
266
+ </react_native_1.Text>
267
+ </react_native_1.View>
268
+ </react_native_1.View>
269
+
270
+
271
+ <react_native_1.TouchableOpacity onPress={() => handleDeleteItem(item)} style={galleryStyles.listDeleteBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
272
+ <NetworkIcons_1.TrashIcon size={14} color={AppColors_1.AppColors.red500}/>
273
+ </react_native_1.TouchableOpacity>
274
+ </TouchableScale_1.default>);
275
+ };
138
276
  return (<react_native_1.View style={galleryStyles.container}>
139
277
 
140
278
  <react_native_1.View style={galleryStyles.filterBar}>
@@ -152,6 +290,7 @@ const MediaGalleryTab = () => {
152
290
  galleryStyles.chip,
153
291
  isActive && galleryStyles.chipActive,
154
292
  ]}>
293
+ {renderFilterIcon(filterKey, isActive)}
155
294
  <react_native_1.Text style={[
156
295
  galleryStyles.chipText,
157
296
  isActive && galleryStyles.chipTextActive,
@@ -162,15 +301,68 @@ const MediaGalleryTab = () => {
162
301
  })}
163
302
  </react_native_1.View>
164
303
 
165
- {mediaList.length > 0 && (<react_native_1.TouchableOpacity onPress={handleClearAll} style={galleryStyles.clearBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
166
- <NetworkIcons_1.TrashIcon size={13} color={AppColors_1.AppColors.red500}/>
167
- <react_native_1.Text style={galleryStyles.clearBtnText}>{t('mediaGallery.purge', { size: (0, helpers_1.formatBytes)(totalStorageBytes) })}</react_native_1.Text>
168
- </react_native_1.TouchableOpacity>)}
304
+
305
+ <react_native_1.View style={galleryStyles.viewToggleContainer}>
306
+ <react_native_1.TouchableOpacity onPress={() => setViewMode('grid')} style={[
307
+ galleryStyles.viewToggleBtn,
308
+ viewMode === 'grid' && galleryStyles.viewToggleBtnActive,
309
+ ]}>
310
+ <NetworkIcons_1.GridIcon size={13} color={viewMode === 'grid' ? AppColors_1.AppColors.white : AppColors_1.AppColors.slate400}/>
311
+ </react_native_1.TouchableOpacity>
312
+ <react_native_1.TouchableOpacity onPress={() => setViewMode('list')} style={[
313
+ galleryStyles.viewToggleBtn,
314
+ viewMode === 'list' && galleryStyles.viewToggleBtnActive,
315
+ ]}>
316
+ <NetworkIcons_1.ListIcon size={13} color={viewMode === 'list' ? AppColors_1.AppColors.white : AppColors_1.AppColors.slate400}/>
317
+ </react_native_1.TouchableOpacity>
318
+ </react_native_1.View>
169
319
  </react_native_1.View>
170
320
 
171
321
 
172
- <react_native_1.FlatList data={filteredMedia} keyExtractor={item => item.id} renderItem={renderItem} numColumns={2} columnWrapperStyle={galleryStyles.columnWrapper} contentContainerStyle={galleryStyles.listContent} refreshControl={<react_native_1.RefreshControl refreshing={refreshing} onRefresh={onRefresh} tintColor={AppColors_1.AppColors.sky400}/>} ListEmptyComponent={<EmptyState_1.default customTitle={t('mediaGallery.noMediaTitle')} customSub={t('mediaGallery.noMediaDesc')}/>}/>
322
+ {mediaList.length > 0 && (<react_native_1.View style={galleryStyles.subBar}>
323
+ <react_native_1.View style={galleryStyles.resultCountWrapper}>
324
+ <react_native_1.Text style={[
325
+ galleryStyles.resultCountText,
326
+ selectedIds.size > 0 && galleryStyles.resultCountTextSelected,
327
+ ]}>
328
+ {selectedIds.size > 0
329
+ ? t('mediaGallery.selectedOfResults', {
330
+ selected: selectedIds.size,
331
+ total: filteredMedia.length,
332
+ defaultValue: `Selected ${selectedIds.size} of ${filteredMedia.length} results`,
333
+ })
334
+ : filteredMedia.length !== mediaList.length
335
+ ? t('mediaGallery.showingFilteredResults', {
336
+ count: filteredMedia.length,
337
+ total: mediaList.length,
338
+ defaultValue: `Showing ${filteredMedia.length} of ${mediaList.length} results`,
339
+ })
340
+ : t('mediaGallery.showingResults', {
341
+ count: filteredMedia.length,
342
+ defaultValue: `Showing ${filteredMedia.length} results`,
343
+ })}
344
+ </react_native_1.Text>
345
+ </react_native_1.View>
173
346
 
347
+ <react_native_1.View style={galleryStyles.actionsGroup}>
348
+ {selectedIds.size > 0 && (<react_native_1.TouchableOpacity onPress={handleDeleteSelected} style={galleryStyles.deleteBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
349
+ <NetworkIcons_1.TrashIcon size={13} color={AppColors_1.AppColors.red500}/>
350
+ <react_native_1.Text style={galleryStyles.deleteBtnText}>
351
+ {t('mediaGallery.deleteSelected', { count: selectedIds.size })}
352
+ </react_native_1.Text>
353
+ </react_native_1.TouchableOpacity>)}
354
+
355
+ <react_native_1.TouchableOpacity onPress={handleClearAll} style={galleryStyles.clearBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
356
+ <NetworkIcons_1.TrashIcon size={13} color={AppColors_1.AppColors.red500}/>
357
+ <react_native_1.Text style={galleryStyles.clearBtnText}>
358
+ {t('mediaGallery.purge', { size: (0, helpers_1.formatBytes)(totalStorageBytes) })}
359
+ </react_native_1.Text>
360
+ </react_native_1.TouchableOpacity>
361
+ </react_native_1.View>
362
+ </react_native_1.View>)}
363
+
364
+
365
+ <react_native_1.FlatList key={viewMode} data={filteredMedia} keyExtractor={item => item.id} renderItem={viewMode === 'grid' ? renderGridItem : renderListItem} numColumns={viewMode === 'grid' ? 2 : 1} columnWrapperStyle={viewMode === 'grid' ? galleryStyles.columnWrapper : undefined} contentContainerStyle={galleryStyles.listContent} refreshControl={<react_native_1.RefreshControl refreshing={refreshing} onRefresh={onRefresh} tintColor={AppColors_1.AppColors.sky400}/>} ListEmptyComponent={<EmptyState_1.default customTitle={t('mediaGallery.noMediaTitle')} customSub={t('mediaGallery.noMediaDesc')} showReload={false}/>}/>
174
366
 
175
367
 
176
368
  <MediaPreviewModal_1.MediaPreviewModal item={selectedItem} visible={!!selectedItem} onClose={() => setSelectedItem(null)} onDelete={handleDeleteItem} onConvertToGif={handleConvertToGif}/>
@@ -189,19 +381,22 @@ const galleryStyles = react_native_1.StyleSheet.create({
189
381
  alignItems: 'center',
190
382
  justifyContent: 'space-between',
191
383
  paddingHorizontal: 12,
192
- paddingVertical: 10,
384
+ paddingVertical: 9,
193
385
  borderBottomWidth: 1,
194
386
  borderBottomColor: AppColors_1.AppColors.borderGlassLight,
195
- flexWrap: 'wrap',
196
387
  gap: 8,
197
388
  },
198
389
  chipGroup: {
199
390
  flexDirection: 'row',
200
391
  alignItems: 'center',
201
392
  gap: 6,
393
+ flexShrink: 1,
202
394
  },
203
395
  chip: {
204
- paddingHorizontal: 9,
396
+ flexDirection: 'row',
397
+ alignItems: 'center',
398
+ gap: 4.5,
399
+ paddingHorizontal: 8,
205
400
  paddingVertical: 4.5,
206
401
  borderRadius: 6,
207
402
  backgroundColor: AppColors_1.AppColors.whiteAlpha06,
@@ -221,6 +416,71 @@ const galleryStyles = react_native_1.StyleSheet.create({
221
416
  fontFamily: AppFonts_1.AppFonts.interBold,
222
417
  color: AppColors_1.AppColors.sky400,
223
418
  },
419
+ subBar: {
420
+ flexDirection: 'row',
421
+ alignItems: 'center',
422
+ justifyContent: 'space-between',
423
+ paddingHorizontal: 12,
424
+ paddingVertical: 7,
425
+ backgroundColor: `${AppColors_1.AppColors.slate900}99`,
426
+ borderBottomWidth: 1,
427
+ borderBottomColor: AppColors_1.AppColors.borderGlassLight,
428
+ gap: 8,
429
+ },
430
+ resultCountWrapper: {
431
+ flexDirection: 'row',
432
+ alignItems: 'center',
433
+ flexShrink: 1,
434
+ },
435
+ resultCountText: {
436
+ fontFamily: AppFonts_1.AppFonts.interMedium,
437
+ fontSize: 11,
438
+ color: AppColors_1.AppColors.slate400,
439
+ },
440
+ resultCountTextSelected: {
441
+ fontFamily: AppFonts_1.AppFonts.interSemiBold,
442
+ color: AppColors_1.AppColors.sky400,
443
+ },
444
+ actionsGroup: {
445
+ flexDirection: 'row',
446
+ alignItems: 'center',
447
+ gap: 6,
448
+ },
449
+ viewToggleContainer: {
450
+ flexDirection: 'row',
451
+ alignItems: 'center',
452
+ backgroundColor: AppColors_1.AppColors.whiteAlpha06,
453
+ borderRadius: 6,
454
+ padding: 2,
455
+ borderWidth: 1,
456
+ borderColor: AppColors_1.AppColors.whiteAlpha10,
457
+ },
458
+ viewToggleBtn: {
459
+ paddingHorizontal: 7,
460
+ paddingVertical: 4,
461
+ borderRadius: 4,
462
+ alignItems: 'center',
463
+ justifyContent: 'center',
464
+ },
465
+ viewToggleBtnActive: {
466
+ backgroundColor: `${AppColors_1.AppColors.violet600}80`,
467
+ },
468
+ deleteBtn: {
469
+ flexDirection: 'row',
470
+ alignItems: 'center',
471
+ gap: 4,
472
+ paddingHorizontal: 8,
473
+ paddingVertical: 4,
474
+ borderRadius: 6,
475
+ backgroundColor: `${AppColors_1.AppColors.red500}26`,
476
+ borderWidth: 1,
477
+ borderColor: `${AppColors_1.AppColors.red500}80`,
478
+ },
479
+ deleteBtnText: {
480
+ fontFamily: AppFonts_1.AppFonts.interBold,
481
+ fontSize: 10.5,
482
+ color: AppColors_1.AppColors.red500,
483
+ },
224
484
  clearBtn: {
225
485
  flexDirection: 'row',
226
486
  alignItems: 'center',
@@ -239,7 +499,7 @@ const galleryStyles = react_native_1.StyleSheet.create({
239
499
  },
240
500
  listContent: {
241
501
  padding: 12,
242
- gap: 12,
502
+ gap: 10,
243
503
  },
244
504
  columnWrapper: {
245
505
  gap: 12,
@@ -252,6 +512,10 @@ const galleryStyles = react_native_1.StyleSheet.create({
252
512
  borderColor: AppColors_1.AppColors.borderGlassLight,
253
513
  overflow: 'hidden',
254
514
  },
515
+ cardSelected: {
516
+ borderColor: AppColors_1.AppColors.violet600,
517
+ borderWidth: 1.5,
518
+ },
255
519
  thumbnailContainer: {
256
520
  width: '100%',
257
521
  height: 110,
@@ -262,6 +526,50 @@ const galleryStyles = react_native_1.StyleSheet.create({
262
526
  width: '100%',
263
527
  height: '100%',
264
528
  },
529
+ thumbnailFallback: {
530
+ width: '100%',
531
+ height: '100%',
532
+ alignItems: 'center',
533
+ justifyContent: 'center',
534
+ backgroundColor: AppColors_1.AppColors.slate900,
535
+ },
536
+ checkbox: {
537
+ position: 'absolute',
538
+ top: 6,
539
+ left: 6,
540
+ width: 22,
541
+ height: 22,
542
+ borderRadius: 5,
543
+ borderWidth: 1.5,
544
+ borderColor: 'rgba(255, 255, 255, 0.65)',
545
+ backgroundColor: 'rgba(15, 23, 42, 0.65)',
546
+ alignItems: 'center',
547
+ justifyContent: 'center',
548
+ zIndex: 10,
549
+ },
550
+ checkboxSelected: {
551
+ backgroundColor: AppColors_1.AppColors.violet600,
552
+ borderColor: AppColors_1.AppColors.violet600,
553
+ },
554
+ miniPlayCircle: {
555
+ position: 'absolute',
556
+ top: '50%',
557
+ left: '50%',
558
+ width: 32,
559
+ height: 32,
560
+ marginTop: -16,
561
+ marginLeft: -16,
562
+ borderRadius: 16,
563
+ backgroundColor: `${AppColors_1.AppColors.sky400}D9`,
564
+ alignItems: 'center',
565
+ justifyContent: 'center',
566
+ paddingLeft: 2,
567
+ shadowColor: '#000',
568
+ shadowOffset: { width: 0, height: 2 },
569
+ shadowOpacity: 0.4,
570
+ shadowRadius: 4,
571
+ elevation: 4,
572
+ },
265
573
  typeBadge: {
266
574
  position: 'absolute',
267
575
  top: 6,
@@ -304,4 +612,101 @@ const galleryStyles = react_native_1.StyleSheet.create({
304
612
  fontSize: 10,
305
613
  color: AppColors_1.AppColors.whiteAlpha30,
306
614
  },
615
+ listRow: {
616
+ flexDirection: 'row',
617
+ alignItems: 'center',
618
+ backgroundColor: AppColors_1.AppColors.slate800,
619
+ borderRadius: 8,
620
+ borderWidth: 1,
621
+ borderColor: AppColors_1.AppColors.borderGlassLight,
622
+ padding: 8,
623
+ gap: 10,
624
+ },
625
+ listRowSelected: {
626
+ borderColor: AppColors_1.AppColors.violet600,
627
+ borderWidth: 1.5,
628
+ backgroundColor: `${AppColors_1.AppColors.violet600}14`,
629
+ },
630
+ listCheckbox: {
631
+ width: 20,
632
+ height: 20,
633
+ borderRadius: 4,
634
+ borderWidth: 1.5,
635
+ borderColor: 'rgba(255, 255, 255, 0.65)',
636
+ backgroundColor: 'rgba(15, 23, 42, 0.65)',
637
+ alignItems: 'center',
638
+ justifyContent: 'center',
639
+ },
640
+ listThumbContainer: {
641
+ width: 46,
642
+ height: 46,
643
+ borderRadius: 6,
644
+ backgroundColor: AppColors_1.AppColors.slate850,
645
+ overflow: 'hidden',
646
+ position: 'relative',
647
+ },
648
+ listThumb: {
649
+ width: '100%',
650
+ height: '100%',
651
+ },
652
+ listThumbFallback: {
653
+ width: '100%',
654
+ height: '100%',
655
+ alignItems: 'center',
656
+ justifyContent: 'center',
657
+ backgroundColor: AppColors_1.AppColors.slate900,
658
+ },
659
+ listMiniPlay: {
660
+ position: 'absolute',
661
+ top: '50%',
662
+ left: '50%',
663
+ width: 20,
664
+ height: 20,
665
+ marginTop: -10,
666
+ marginLeft: -10,
667
+ borderRadius: 10,
668
+ backgroundColor: `${AppColors_1.AppColors.sky400}D9`,
669
+ alignItems: 'center',
670
+ justifyContent: 'center',
671
+ paddingLeft: 1,
672
+ },
673
+ listInfo: {
674
+ flex: 1,
675
+ gap: 4,
676
+ minWidth: 0,
677
+ },
678
+ listTitle: {
679
+ fontFamily: AppFonts_1.AppFonts.interMedium,
680
+ fontSize: 12,
681
+ color: AppColors_1.AppColors.white,
682
+ },
683
+ listMetaRow: {
684
+ flexDirection: 'row',
685
+ alignItems: 'center',
686
+ gap: 6,
687
+ flexWrap: 'wrap',
688
+ },
689
+ listBadge: {
690
+ flexDirection: 'row',
691
+ alignItems: 'center',
692
+ gap: 3,
693
+ backgroundColor: AppColors_1.AppColors.badgeGlassDark,
694
+ paddingHorizontal: 4,
695
+ paddingVertical: 1.5,
696
+ borderRadius: 4,
697
+ borderWidth: 1,
698
+ borderColor: AppColors_1.AppColors.borderGlassMedium,
699
+ },
700
+ listBadgeText: {
701
+ fontFamily: AppFonts_1.AppFonts.interBold,
702
+ fontSize: 8.5,
703
+ color: AppColors_1.AppColors.slate200,
704
+ },
705
+ listDeleteBtn: {
706
+ padding: 6,
707
+ borderRadius: 6,
708
+ backgroundColor: `${AppColors_1.AppColors.red500}14`,
709
+ borderWidth: 1,
710
+ borderColor: `${AppColors_1.AppColors.red500}33`,
711
+ },
307
712
  });