react-native-inapp-inspector 2.3.17 → 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
@@ -43,6 +43,7 @@ const AppColors_1 = require("../../styles/AppColors");
43
43
  const AppFonts_1 = require("../../styles/AppFonts");
44
44
  const TouchableScale_1 = __importDefault(require("../TouchableScale"));
45
45
  const NetworkIcons_1 = require("../NetworkIcons");
46
+ const capture_1 = require("../../capture");
46
47
  const helpers_1 = require("../../helpers");
47
48
  const toast_1 = require("../../helpers/toast");
48
49
  const i18n_1 = require("../../i18n");
@@ -50,21 +51,24 @@ const MediaPreviewModal = ({ item, visible, onClose, onDelete, onConvertToGif, }
50
51
  const { t } = (0, i18n_1.useTranslation)();
51
52
  const [isConverting, setIsConverting] = (0, react_1.useState)(false);
52
53
  const [imageError, setImageError] = (0, react_1.useState)(false);
54
+ const [isExpanded, setIsExpanded] = (0, react_1.useState)(false);
55
+ const [isPlaying, setIsPlaying] = (0, react_1.useState)(false);
56
+ const [playbackSpeed, setPlaybackSpeed] = (0, react_1.useState)('1.0x');
57
+ const [isLooping, setIsLooping] = (0, react_1.useState)(true);
58
+ const [scrubPosition, setScrubPosition] = (0, react_1.useState)(0.4);
53
59
  if (!item)
54
60
  return null;
55
- const handleShare = async () => {
61
+ const handlePlayVideo = async () => {
56
62
  try {
57
- await react_native_1.Share.share(react_native_1.Platform.OS === 'ios'
58
- ? { url: item.uri, title: item.filename }
59
- : { message: `Captured media: ${item.filename}`, url: item.uri });
63
+ setIsPlaying(true);
64
+ await capture_1.ScreenCapture.playVideo(item.uri);
60
65
  }
61
66
  catch {
62
- (0, toast_1.showToast)(t('mediaGallery.shareUnavailable'));
67
+ (0, toast_1.showToast)(t('mediaGallery.playError', 'Unable to play video'));
68
+ }
69
+ finally {
70
+ setIsPlaying(false);
63
71
  }
64
- };
65
- const handleCopyUri = () => {
66
- (0, helpers_1.copyToClipboard)(item.uri);
67
- (0, toast_1.showToast)(t('mediaGallery.uriCopied'));
68
72
  };
69
73
  const handleDelete = () => {
70
74
  react_native_1.Alert.alert(t('mediaGallery.deleteTitle'), t('mediaGallery.deleteMessage', { filename: item.filename }), [
@@ -97,6 +101,10 @@ const MediaPreviewModal = ({ item, visible, onClose, onDelete, onConvertToGif, }
97
101
  const isVideo = item.type === 'video';
98
102
  const isGif = item.type === 'gif';
99
103
  const durationSec = item.durationMs ? (item.durationMs / 1000).toFixed(1) : null;
104
+ const formattedDuration = durationSec
105
+ ? `00:${Number(durationSec) < 10 ? '0' : ''}${durationSec}`
106
+ : '00:05.0';
107
+ const hasBottomToolbar = isVideo || isGif;
100
108
  return (<react_native_1.Modal visible={visible} transparent={true} animationType="fade" onRequestClose={onClose}>
101
109
  <react_native_1.View style={previewStyles.overlay}>
102
110
 
@@ -140,15 +148,61 @@ const MediaPreviewModal = ({ item, visible, onClose, onDelete, onConvertToGif, }
140
148
  </react_native_1.Text>
141
149
  </react_native_1.View>
142
150
  </react_native_1.View>
143
- <react_native_1.TouchableOpacity onPress={onClose} style={previewStyles.closeBtn} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
144
- <NetworkIcons_1.CloseWhite size={14} color={AppColors_1.AppColors.white}/>
145
- </react_native_1.TouchableOpacity>
151
+
152
+
153
+ <react_native_1.View style={previewStyles.headerRight}>
154
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={t('mediaGallery.delete')} onPress={handleDelete} style={previewStyles.headerDeleteBtn} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
155
+ <NetworkIcons_1.TrashIcon size={14} color={AppColors_1.AppColors.red500}/>
156
+ </TouchableScale_1.default>
157
+
158
+ <react_native_1.TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={isExpanded ? t('mediaGallery.collapse', 'Exit Fullscreen') : t('mediaGallery.expand', 'Expand Fullscreen')} onPress={() => setIsExpanded(!isExpanded)} style={[
159
+ previewStyles.headerIconBtn,
160
+ isExpanded && { backgroundColor: `${AppColors_1.AppColors.sky400}30`, borderColor: `${AppColors_1.AppColors.sky400}70` },
161
+ ]} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
162
+ <NetworkIcons_1.ExpandCollapseIcon size={14} isExpanded={isExpanded} color={isExpanded ? AppColors_1.AppColors.sky400 : AppColors_1.AppColors.white}/>
163
+ </react_native_1.TouchableOpacity>
164
+
165
+ <react_native_1.TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={t('mediaGallery.minimize', 'Minimize')} onPress={onClose} style={previewStyles.headerIconBtn} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>
166
+ <NetworkIcons_1.ChevronDownIcon size={15} color={AppColors_1.AppColors.white}/>
167
+ </react_native_1.TouchableOpacity>
168
+ </react_native_1.View>
146
169
  </react_native_1.View>
147
170
 
148
171
 
149
- <react_native_1.View style={previewStyles.stage}>
150
- <react_native_1.View style={previewStyles.previewCard}>
151
- <react_native_1.Image source={{ uri: item.uri }} style={previewStyles.image} resizeMode="contain" onError={() => setImageError(true)}/>
172
+ <react_native_1.View style={[
173
+ previewStyles.stage,
174
+ isExpanded && previewStyles.stageExpanded,
175
+ !hasBottomToolbar && {
176
+ paddingBottom: react_native_1.Platform.OS === 'ios' ? 34 : 16,
177
+ },
178
+ ]}>
179
+ <react_native_1.TouchableOpacity activeOpacity={isVideo ? 0.9 : 1} onPress={isVideo ? handlePlayVideo : undefined} style={[
180
+ previewStyles.previewCard,
181
+ isExpanded && previewStyles.previewCardExpanded,
182
+ ]}>
183
+ {isVideo ? (item.thumbnailUri && !imageError ? (<>
184
+ <react_native_1.Image source={{ uri: item.thumbnailUri }} style={previewStyles.image} resizeMode="contain" onError={() => setImageError(true)}/>
185
+ <react_native_1.View style={previewStyles.videoImageOverlay}/>
186
+ </>) : (<react_native_1.View style={previewStyles.videoFallbackBackdrop}>
187
+ <react_native_1.View style={previewStyles.videoFallbackGlow}/>
188
+ <NetworkIcons_1.FilmIcon size={52} color={AppColors_1.AppColors.sky400}/>
189
+ <react_native_1.Text style={previewStyles.videoFallbackTitle}>
190
+ {t('mediaGallery.playVideo', 'Play Video')}
191
+ </react_native_1.Text>
192
+ <react_native_1.Text style={previewStyles.videoFallbackSubtitle}>
193
+ {item.width && item.height ? `${item.width} × ${item.height}` : 'HD Video'} • MP4
194
+ </react_native_1.Text>
195
+ </react_native_1.View>)) : (<react_native_1.Image source={{ uri: item.uri }} style={previewStyles.image} resizeMode="contain" onError={() => setImageError(true)}/>)}
196
+
197
+
198
+ {isVideo && (<react_native_1.View style={previewStyles.centerPlayOverlay}>
199
+ <react_native_1.View style={previewStyles.centerPlayCircle}>
200
+ <NetworkIcons_1.PlayIcon size={30} color={AppColors_1.AppColors.white}/>
201
+ </react_native_1.View>
202
+ <react_native_1.Text style={previewStyles.centerPlayText}>
203
+ {t('mediaGallery.playVideo', 'Play Video')}
204
+ </react_native_1.Text>
205
+ </react_native_1.View>)}
152
206
 
153
207
 
154
208
  {isVideo && (<react_native_1.View style={previewStyles.videoBadgeOverlay}>
@@ -167,68 +221,111 @@ const MediaPreviewModal = ({ item, visible, onClose, onDelete, onConvertToGif, }
167
221
  <react_native_1.Text style={previewStyles.playPillText}>ANIMATED GIF</react_native_1.Text>
168
222
  </react_native_1.View>
169
223
  </react_native_1.View>)}
170
- </react_native_1.View>
171
224
 
172
-
173
- <react_native_1.View style={previewStyles.metaPillRow}>
174
- {item.width && item.height ? (<react_native_1.View style={previewStyles.metaPill}>
175
- <react_native_1.Text style={previewStyles.metaPillLabel}>DIMENSIONS</react_native_1.Text>
176
- <react_native_1.Text style={previewStyles.metaPillValue}>{`${item.width} × ${item.height}`}</react_native_1.Text>
177
- </react_native_1.View>) : null}
178
- <react_native_1.View style={previewStyles.metaPill}>
179
- <react_native_1.Text style={previewStyles.metaPillLabel}>SIZE</react_native_1.Text>
180
- <react_native_1.Text style={previewStyles.metaPillValue}>{(0, helpers_1.formatBytes)(item.sizeBytes)}</react_native_1.Text>
225
+
226
+ <react_native_1.View style={previewStyles.floatingMetaBadge}>
227
+ <react_native_1.Text style={previewStyles.floatingMetaText}>
228
+ {item.width && item.height ? `${item.width} × ${item.height} • ` : ''}
229
+ {(0, helpers_1.formatBytes)(item.sizeBytes)}
230
+ {durationSec ? ` • ${durationSec}s` : ''}
231
+ </react_native_1.Text>
181
232
  </react_native_1.View>
182
- {durationSec ? (<react_native_1.View style={previewStyles.metaPill}>
183
- <react_native_1.Text style={previewStyles.metaPillLabel}>DURATION</react_native_1.Text>
184
- <react_native_1.Text style={previewStyles.metaPillValue}>{`${durationSec}s`}</react_native_1.Text>
185
- </react_native_1.View>) : null}
186
- </react_native_1.View>
233
+ </react_native_1.TouchableOpacity>
187
234
  </react_native_1.View>
188
235
 
189
236
 
190
- <react_native_1.View style={previewStyles.footer}>
191
- {isVideo && onConvertToGif && (<TouchableScale_1.default onPress={handleConvert} disabled={isConverting} style={[
192
- previewStyles.actionBtn,
193
- {
194
- backgroundColor: `${AppColors_1.AppColors.warningAmber}25`,
195
- borderColor: `${AppColors_1.AppColors.warningAmber}70`,
196
- },
197
- ]}>
198
- <NetworkIcons_1.GifIcon size={15} color={AppColors_1.AppColors.warningAmber}/>
199
- <react_native_1.Text style={[previewStyles.actionText, { color: AppColors_1.AppColors.warningAmber }]}>
200
- {isConverting ? t('mediaGallery.converting') : t('mediaGallery.convertToGif')}
237
+ {isVideo && (<react_native_1.View style={previewStyles.videoControlsPanel}>
238
+
239
+ <react_native_1.View style={previewStyles.progressSection}>
240
+ <react_native_1.Text style={previewStyles.timeLabel}>
241
+ 00:0{Math.floor(scrubPosition * (Number(durationSec) || 5))}
201
242
  </react_native_1.Text>
202
- </TouchableScale_1.default>)}
243
+ <react_native_1.TouchableOpacity activeOpacity={0.8} onPress={() => setScrubPosition(pos => (pos >= 0.9 ? 0.1 : pos + 0.3))} style={previewStyles.progressTrack}>
244
+ <react_native_1.View style={[
245
+ previewStyles.progressFill,
246
+ { width: `${Math.max(10, Math.min(100, scrubPosition * 100))}%` },
247
+ ]}/>
248
+ <react_native_1.View style={[
249
+ previewStyles.scrubberThumb,
250
+ { left: `${Math.max(8, Math.min(96, scrubPosition * 100))}%` },
251
+ ]}/>
252
+ </react_native_1.TouchableOpacity>
253
+ <react_native_1.Text style={previewStyles.timeLabel}>{formattedDuration}</react_native_1.Text>
254
+ </react_native_1.View>
203
255
 
204
- <TouchableScale_1.default onPress={handleShare} style={previewStyles.actionBtn}>
205
- <NetworkIcons_1.SendIcon size={15} color={AppColors_1.AppColors.sky400}/>
206
- <react_native_1.Text style={previewStyles.actionText}>{t('mediaGallery.share')}</react_native_1.Text>
207
- </TouchableScale_1.default>
256
+
257
+ <react_native_1.View style={previewStyles.controlsRow}>
258
+
259
+ <react_native_1.TouchableOpacity onPress={handlePlayVideo} style={previewStyles.controlActionPill}>
260
+ {isPlaying ? (<NetworkIcons_1.PauseIcon size={14} color={AppColors_1.AppColors.sky400}/>) : (<NetworkIcons_1.PlayIcon size={14} color={AppColors_1.AppColors.sky400}/>)}
261
+ <react_native_1.Text style={[previewStyles.controlActionText, { color: AppColors_1.AppColors.sky400 }]}>
262
+ {isPlaying ? t('mediaGallery.pause', 'Pause') : t('mediaGallery.play', 'Play')}
263
+ </react_native_1.Text>
264
+ </react_native_1.TouchableOpacity>
208
265
 
209
- <TouchableScale_1.default onPress={handleCopyUri} style={previewStyles.actionBtn}>
210
- <NetworkIcons_1.CopyIcon size={15} color={AppColors_1.AppColors.white}/>
211
- <react_native_1.Text style={previewStyles.actionText}>{t('mediaGallery.copyUri')}</react_native_1.Text>
212
- </TouchableScale_1.default>
266
+
267
+ <react_native_1.View style={previewStyles.speedGroup}>
268
+ {['1.0x', '1.5x', '2.0x'].map(speed => (<react_native_1.TouchableOpacity key={speed} onPress={() => setPlaybackSpeed(speed)} style={[
269
+ previewStyles.speedBtn,
270
+ playbackSpeed === speed && previewStyles.speedBtnActive,
271
+ ]}>
272
+ <react_native_1.Text style={[
273
+ previewStyles.speedText,
274
+ playbackSpeed === speed && previewStyles.speedTextActive,
275
+ ]}>
276
+ {speed}
277
+ </react_native_1.Text>
278
+ </react_native_1.TouchableOpacity>))}
279
+ </react_native_1.View>
213
280
 
214
- <TouchableScale_1.default onPress={handleDelete} style={[
215
- previewStyles.actionBtn,
216
- {
217
- backgroundColor: `${AppColors_1.AppColors.red500}25`,
218
- borderColor: `${AppColors_1.AppColors.red500}70`,
219
- },
220
- ]}>
221
- <NetworkIcons_1.TrashIcon size={15} color={AppColors_1.AppColors.red500}/>
222
- <react_native_1.Text style={[previewStyles.actionText, { color: AppColors_1.AppColors.red500 }]}>
223
- {t('mediaGallery.delete')}
224
- </react_native_1.Text>
225
- </TouchableScale_1.default>
226
- </react_native_1.View>
281
+
282
+ <react_native_1.TouchableOpacity onPress={() => setIsLooping(!isLooping)} style={[
283
+ previewStyles.loopPill,
284
+ isLooping && previewStyles.loopPillActive,
285
+ ]}>
286
+ <NetworkIcons_1.RepeatIcon size={12} color={isLooping ? AppColors_1.AppColors.sky400 : AppColors_1.AppColors.whiteAlpha60}/>
287
+ <react_native_1.Text style={[
288
+ previewStyles.loopText,
289
+ isLooping && previewStyles.loopTextActive,
290
+ ]}>
291
+ {isLooping ? 'Loop: ON' : 'Loop: OFF'}
292
+ </react_native_1.Text>
293
+ </react_native_1.TouchableOpacity>
294
+ </react_native_1.View>
295
+ </react_native_1.View>)}
296
+
297
+
298
+ {hasBottomToolbar && (<react_native_1.View style={previewStyles.footer}>
299
+ {isVideo && (<TouchableScale_1.default onPress={handlePlayVideo} style={[
300
+ previewStyles.actionBtn,
301
+ {
302
+ backgroundColor: `${AppColors_1.AppColors.sky400}25`,
303
+ borderColor: `${AppColors_1.AppColors.sky400}70`,
304
+ },
305
+ ]}>
306
+ <NetworkIcons_1.PlayIcon size={15} color={AppColors_1.AppColors.sky400}/>
307
+ <react_native_1.Text style={[previewStyles.actionText, { color: AppColors_1.AppColors.sky400, fontFamily: AppFonts_1.AppFonts.interSemiBold }]}>
308
+ {t('mediaGallery.playVideo', 'Play Video')}
309
+ </react_native_1.Text>
310
+ </TouchableScale_1.default>)}
311
+
312
+ {onConvertToGif && isVideo && (<TouchableScale_1.default onPress={handleConvert} disabled={isConverting} style={[
313
+ previewStyles.actionBtn,
314
+ {
315
+ backgroundColor: `${AppColors_1.AppColors.warningAmber}25`,
316
+ borderColor: `${AppColors_1.AppColors.warningAmber}70`,
317
+ },
318
+ ]}>
319
+ <NetworkIcons_1.GifIcon size={15} color={AppColors_1.AppColors.warningAmber}/>
320
+ <react_native_1.Text style={[previewStyles.actionText, { color: AppColors_1.AppColors.warningAmber }]}>
321
+ {isConverting ? t('mediaGallery.converting') : t('mediaGallery.convertToGif')}
322
+ </react_native_1.Text>
323
+ </TouchableScale_1.default>)}
324
+ </react_native_1.View>)}
227
325
  </react_native_1.View>
228
326
  </react_native_1.Modal>);
229
327
  };
230
328
  exports.MediaPreviewModal = MediaPreviewModal;
231
- const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = react_native_1.Dimensions.get('window');
232
329
  const previewStyles = react_native_1.StyleSheet.create({
233
330
  overlay: {
234
331
  flex: 1,
@@ -254,6 +351,11 @@ const previewStyles = react_native_1.StyleSheet.create({
254
351
  minWidth: 0,
255
352
  marginRight: 10,
256
353
  },
354
+ headerRight: {
355
+ flexDirection: 'row',
356
+ alignItems: 'center',
357
+ gap: 8,
358
+ },
257
359
  badge: {
258
360
  flexDirection: 'row',
259
361
  alignItems: 'center',
@@ -279,11 +381,23 @@ const previewStyles = react_native_1.StyleSheet.create({
279
381
  color: AppColors_1.AppColors.whiteAlpha60,
280
382
  marginTop: 1,
281
383
  },
282
- closeBtn: {
384
+ headerDeleteBtn: {
385
+ width: 32,
386
+ height: 32,
387
+ borderRadius: 16,
388
+ backgroundColor: `${AppColors_1.AppColors.red500}20`,
389
+ borderWidth: 1,
390
+ borderColor: `${AppColors_1.AppColors.red500}60`,
391
+ alignItems: 'center',
392
+ justifyContent: 'center',
393
+ },
394
+ headerIconBtn: {
283
395
  width: 32,
284
396
  height: 32,
285
397
  borderRadius: 16,
286
398
  backgroundColor: AppColors_1.AppColors.whiteAlpha12,
399
+ borderWidth: 1,
400
+ borderColor: AppColors_1.AppColors.whiteAlpha20,
287
401
  alignItems: 'center',
288
402
  justifyContent: 'center',
289
403
  },
@@ -291,13 +405,19 @@ const previewStyles = react_native_1.StyleSheet.create({
291
405
  flex: 1,
292
406
  alignItems: 'center',
293
407
  justifyContent: 'center',
294
- paddingHorizontal: 16,
295
- paddingVertical: 12,
408
+ paddingHorizontal: 10,
409
+ paddingTop: 10,
410
+ paddingBottom: 10,
411
+ },
412
+ stageExpanded: {
413
+ paddingHorizontal: 0,
414
+ paddingTop: 0,
415
+ paddingBottom: 0,
296
416
  },
297
417
  previewCard: {
298
- width: SCREEN_WIDTH - 32,
299
- height: SCREEN_HEIGHT * 0.60,
300
- borderRadius: 12,
418
+ flex: 1,
419
+ width: '100%',
420
+ borderRadius: 14,
301
421
  overflow: 'hidden',
302
422
  backgroundColor: '#05070D',
303
423
  borderWidth: 1,
@@ -306,10 +426,73 @@ const previewStyles = react_native_1.StyleSheet.create({
306
426
  justifyContent: 'center',
307
427
  position: 'relative',
308
428
  },
429
+ previewCardExpanded: {
430
+ borderRadius: 0,
431
+ borderWidth: 0,
432
+ },
309
433
  image: {
310
434
  width: '100%',
311
435
  height: '100%',
312
436
  },
437
+ videoImageOverlay: {
438
+ ...react_native_1.StyleSheet.absoluteFillObject,
439
+ backgroundColor: 'rgba(5, 7, 13, 0.25)',
440
+ },
441
+ videoFallbackBackdrop: {
442
+ flex: 1,
443
+ width: '100%',
444
+ backgroundColor: '#070C18',
445
+ alignItems: 'center',
446
+ justifyContent: 'center',
447
+ gap: 8,
448
+ },
449
+ videoFallbackGlow: {
450
+ position: 'absolute',
451
+ width: 140,
452
+ height: 140,
453
+ borderRadius: 70,
454
+ backgroundColor: `${AppColors_1.AppColors.sky400}18`,
455
+ },
456
+ videoFallbackTitle: {
457
+ fontFamily: AppFonts_1.AppFonts.interSemiBold,
458
+ fontSize: 15,
459
+ color: AppColors_1.AppColors.white,
460
+ marginTop: 8,
461
+ },
462
+ videoFallbackSubtitle: {
463
+ fontFamily: AppFonts_1.AppFonts.interRegular,
464
+ fontSize: 12,
465
+ color: AppColors_1.AppColors.whiteAlpha60,
466
+ },
467
+ centerPlayOverlay: {
468
+ position: 'absolute',
469
+ alignItems: 'center',
470
+ justifyContent: 'center',
471
+ gap: 8,
472
+ },
473
+ centerPlayCircle: {
474
+ width: 64,
475
+ height: 64,
476
+ borderRadius: 32,
477
+ backgroundColor: `${AppColors_1.AppColors.sky400}E0`,
478
+ alignItems: 'center',
479
+ justifyContent: 'center',
480
+ paddingLeft: 3,
481
+ shadowColor: AppColors_1.AppColors.sky400,
482
+ shadowOffset: { width: 0, height: 4 },
483
+ shadowOpacity: 0.5,
484
+ shadowRadius: 10,
485
+ elevation: 8,
486
+ },
487
+ centerPlayText: {
488
+ fontFamily: AppFonts_1.AppFonts.interSemiBold,
489
+ fontSize: 13,
490
+ color: AppColors_1.AppColors.white,
491
+ letterSpacing: 0.3,
492
+ textShadowColor: 'rgba(0,0,0,0.7)',
493
+ textShadowOffset: { width: 0, height: 1 },
494
+ textShadowRadius: 3,
495
+ },
313
496
  videoBadgeOverlay: {
314
497
  position: 'absolute',
315
498
  bottom: 12,
@@ -332,34 +515,139 @@ const previewStyles = react_native_1.StyleSheet.create({
332
515
  color: AppColors_1.AppColors.white,
333
516
  letterSpacing: 0.3,
334
517
  },
335
- metaPillRow: {
336
- flexDirection: 'row',
518
+ floatingMetaBadge: {
519
+ position: 'absolute',
520
+ bottom: 10,
521
+ backgroundColor: `${AppColors_1.AppColors.slate900}D9`,
522
+ paddingHorizontal: 10,
523
+ paddingVertical: 4.5,
524
+ borderRadius: 8,
525
+ borderWidth: 1,
526
+ borderColor: AppColors_1.AppColors.whiteAlpha15,
337
527
  alignItems: 'center',
338
528
  justifyContent: 'center',
529
+ },
530
+ floatingMetaText: {
531
+ fontFamily: AppFonts_1.AppFonts.interMedium,
532
+ fontSize: 10.5,
533
+ color: AppColors_1.AppColors.slate200,
534
+ letterSpacing: 0.2,
535
+ },
536
+ videoControlsPanel: {
537
+ paddingHorizontal: 16,
538
+ paddingTop: 8,
539
+ paddingBottom: 6,
540
+ backgroundColor: AppColors_1.AppColors.headerGlassDark,
541
+ borderTopWidth: 1,
542
+ borderTopColor: AppColors_1.AppColors.borderGlassLight,
339
543
  gap: 8,
340
- marginTop: 14,
341
- flexWrap: 'wrap',
342
544
  },
343
- metaPill: {
344
- backgroundColor: AppColors_1.AppColors.whiteAlpha08,
545
+ progressSection: {
546
+ flexDirection: 'row',
547
+ alignItems: 'center',
548
+ gap: 10,
549
+ },
550
+ timeLabel: {
551
+ fontFamily: AppFonts_1.AppFonts.interMedium,
552
+ fontSize: 11,
553
+ color: AppColors_1.AppColors.whiteAlpha60,
554
+ minWidth: 42,
555
+ },
556
+ progressTrack: {
557
+ flex: 1,
558
+ height: 6,
559
+ borderRadius: 3,
560
+ backgroundColor: AppColors_1.AppColors.whiteAlpha15,
561
+ justifyContent: 'center',
562
+ position: 'relative',
563
+ },
564
+ progressFill: {
565
+ height: '100%',
566
+ borderRadius: 3,
567
+ backgroundColor: AppColors_1.AppColors.sky400,
568
+ },
569
+ scrubberThumb: {
570
+ position: 'absolute',
571
+ width: 12,
572
+ height: 12,
573
+ borderRadius: 6,
574
+ backgroundColor: AppColors_1.AppColors.white,
575
+ borderWidth: 2,
576
+ borderColor: AppColors_1.AppColors.sky400,
577
+ top: -3,
578
+ marginLeft: -6,
579
+ },
580
+ controlsRow: {
581
+ flexDirection: 'row',
582
+ alignItems: 'center',
583
+ justifyContent: 'space-between',
584
+ paddingVertical: 2,
585
+ },
586
+ controlActionPill: {
587
+ flexDirection: 'row',
588
+ alignItems: 'center',
589
+ gap: 5,
345
590
  paddingHorizontal: 10,
346
591
  paddingVertical: 5,
347
- borderRadius: 8,
592
+ borderRadius: 6,
593
+ backgroundColor: `${AppColors_1.AppColors.sky400}18`,
594
+ borderWidth: 1,
595
+ borderColor: `${AppColors_1.AppColors.sky400}50`,
596
+ },
597
+ controlActionText: {
598
+ fontFamily: AppFonts_1.AppFonts.interSemiBold,
599
+ fontSize: 11.5,
600
+ },
601
+ speedGroup: {
602
+ flexDirection: 'row',
603
+ alignItems: 'center',
604
+ backgroundColor: AppColors_1.AppColors.whiteAlpha08,
605
+ borderRadius: 6,
348
606
  borderWidth: 1,
349
607
  borderColor: AppColors_1.AppColors.whiteAlpha12,
608
+ padding: 2,
609
+ gap: 2,
610
+ },
611
+ speedBtn: {
612
+ paddingHorizontal: 7,
613
+ paddingVertical: 3,
614
+ borderRadius: 4,
615
+ },
616
+ speedBtnActive: {
617
+ backgroundColor: `${AppColors_1.AppColors.sky400}30`,
618
+ },
619
+ speedText: {
620
+ fontFamily: AppFonts_1.AppFonts.interMedium,
621
+ fontSize: 10.5,
622
+ color: AppColors_1.AppColors.whiteAlpha60,
623
+ },
624
+ speedTextActive: {
625
+ color: AppColors_1.AppColors.sky400,
626
+ fontFamily: AppFonts_1.AppFonts.interBold,
627
+ },
628
+ loopPill: {
629
+ flexDirection: 'row',
350
630
  alignItems: 'center',
631
+ gap: 4,
632
+ paddingHorizontal: 8,
633
+ paddingVertical: 5,
634
+ borderRadius: 6,
635
+ backgroundColor: AppColors_1.AppColors.whiteAlpha08,
636
+ borderWidth: 1,
637
+ borderColor: AppColors_1.AppColors.whiteAlpha12,
638
+ },
639
+ loopPillActive: {
640
+ backgroundColor: `${AppColors_1.AppColors.sky400}18`,
641
+ borderColor: `${AppColors_1.AppColors.sky400}50`,
351
642
  },
352
- metaPillLabel: {
643
+ loopText: {
353
644
  fontFamily: AppFonts_1.AppFonts.interMedium,
354
- fontSize: 9,
355
- color: AppColors_1.AppColors.slate400,
356
- letterSpacing: 0.4,
645
+ fontSize: 10.5,
646
+ color: AppColors_1.AppColors.whiteAlpha60,
357
647
  },
358
- metaPillValue: {
648
+ loopTextActive: {
649
+ color: AppColors_1.AppColors.sky400,
359
650
  fontFamily: AppFonts_1.AppFonts.interSemiBold,
360
- fontSize: 11.5,
361
- color: AppColors_1.AppColors.white,
362
- marginTop: 1,
363
651
  },
364
652
  footer: {
365
653
  flexDirection: 'row',
@@ -368,8 +656,8 @@ const previewStyles = react_native_1.StyleSheet.create({
368
656
  flexWrap: 'wrap',
369
657
  gap: 8,
370
658
  paddingHorizontal: 16,
371
- paddingTop: 12,
372
- paddingBottom: react_native_1.Platform.OS === 'ios' ? 36 : 20,
659
+ paddingTop: 8,
660
+ paddingBottom: react_native_1.Platform.OS === 'ios' ? 34 : 16,
373
661
  borderTopWidth: 1,
374
662
  borderTopColor: AppColors_1.AppColors.borderGlassLight,
375
663
  backgroundColor: AppColors_1.AppColors.headerGlassDark,
@@ -378,7 +666,7 @@ const previewStyles = react_native_1.StyleSheet.create({
378
666
  flexDirection: 'row',
379
667
  alignItems: 'center',
380
668
  gap: 6,
381
- paddingHorizontal: 14,
669
+ paddingHorizontal: 16,
382
670
  paddingVertical: 9,
383
671
  borderRadius: 8,
384
672
  backgroundColor: AppColors_1.AppColors.whiteAlpha08,