@technotoil/image-video-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/ImageVideoEditor.podspec +21 -0
  2. package/README.md +136 -0
  3. package/android/build.gradle +76 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifest.xml +13 -0
  6. package/android/src/main/java/com/technotoil/image_videoeditor/FrameGrabberModule.kt +67 -0
  7. package/android/src/main/java/com/technotoil/image_videoeditor/MediaEditorModule.kt +548 -0
  8. package/android/src/main/java/com/technotoil/image_videoeditor/MediaFileUtils.kt +29 -0
  9. package/android/src/main/java/com/technotoil/image_videoeditor/MediaLibraryModule.kt +305 -0
  10. package/android/src/main/java/com/technotoil/image_videoeditor/MediaPackage.kt +26 -0
  11. package/android/src/main/java/com/technotoil/image_videoeditor/MediaPickerModule.kt +111 -0
  12. package/android/src/main/java/com/technotoil/image_videoeditor/MediaPlayerModule.kt +34 -0
  13. package/android/src/main/java/com/technotoil/image_videoeditor/RNCameraViewManager.kt +761 -0
  14. package/android/src/main/java/com/technotoil/image_videoeditor/RNVideoPreviewManager.kt +317 -0
  15. package/ios/PrivacyInfo.xcprivacy +38 -0
  16. package/ios/RNCameraViewManager.m +420 -0
  17. package/ios/RNFrameGrabber.m +61 -0
  18. package/ios/RNMediaEditor.m +905 -0
  19. package/ios/RNMediaLibrary.m +389 -0
  20. package/ios/RNMediaPicker.m +144 -0
  21. package/ios/RNMediaPlayer.m +73 -0
  22. package/ios/RNVideoPreviewManager.m +263 -0
  23. package/ios/frames/film_vintage.png +0 -0
  24. package/ios/frames/floral_gold.png +0 -0
  25. package/ios/frames/minimal_double.png +0 -0
  26. package/ios/frames/polaroid_white.png +0 -0
  27. package/ios/frames/watercolor_floral.png +0 -0
  28. package/lib/module/assets/frames/film_vintage.png +0 -0
  29. package/lib/module/assets/frames/floral_gold.png +0 -0
  30. package/lib/module/assets/frames/minimal_double.png +0 -0
  31. package/lib/module/assets/frames/polaroid_white.png +0 -0
  32. package/lib/module/assets/frames/watercolor_floral.png +0 -0
  33. package/lib/module/components/VideoEditor.js +156 -0
  34. package/lib/module/components/VideoEditor.js.map +1 -0
  35. package/lib/module/index.js +4 -0
  36. package/lib/module/index.js.map +1 -0
  37. package/lib/module/native/CameraView.js +104 -0
  38. package/lib/module/native/CameraView.js.map +1 -0
  39. package/lib/module/native/FrameGrabber.js +13 -0
  40. package/lib/module/native/FrameGrabber.js.map +1 -0
  41. package/lib/module/native/MediaEditor.js +19 -0
  42. package/lib/module/native/MediaEditor.js.map +1 -0
  43. package/lib/module/native/MediaLibrary.js +37 -0
  44. package/lib/module/native/MediaLibrary.js.map +1 -0
  45. package/lib/module/native/MediaPicker.js +13 -0
  46. package/lib/module/native/MediaPicker.js.map +1 -0
  47. package/lib/module/native/MediaPlayer.js +13 -0
  48. package/lib/module/native/MediaPlayer.js.map +1 -0
  49. package/lib/module/native/VideoPreview.js +12 -0
  50. package/lib/module/native/VideoPreview.js.map +1 -0
  51. package/lib/module/package.json +1 -0
  52. package/lib/module/screens/CropScreen.js +1211 -0
  53. package/lib/module/screens/CropScreen.js.map +1 -0
  54. package/lib/module/screens/EditorScreen.js +5752 -0
  55. package/lib/module/screens/EditorScreen.js.map +1 -0
  56. package/lib/module/screens/ExportScreen.js +289 -0
  57. package/lib/module/screens/ExportScreen.js.map +1 -0
  58. package/lib/module/screens/GalleryScreen.js +505 -0
  59. package/lib/module/screens/GalleryScreen.js.map +1 -0
  60. package/lib/module/screens/PickScreen.js +1195 -0
  61. package/lib/module/screens/PickScreen.js.map +1 -0
  62. package/lib/module/types.js +2 -0
  63. package/lib/module/types.js.map +1 -0
  64. package/lib/typescript/src/components/VideoEditor.d.ts +13 -0
  65. package/lib/typescript/src/index.d.ts +2 -0
  66. package/lib/typescript/src/native/CameraView.d.ts +23 -0
  67. package/lib/typescript/src/native/FrameGrabber.d.ts +2 -0
  68. package/lib/typescript/src/native/MediaEditor.d.ts +3 -0
  69. package/lib/typescript/src/native/MediaLibrary.d.ts +16 -0
  70. package/lib/typescript/src/native/MediaPicker.d.ts +2 -0
  71. package/lib/typescript/src/native/MediaPlayer.d.ts +1 -0
  72. package/lib/typescript/src/native/VideoPreview.d.ts +19 -0
  73. package/lib/typescript/src/screens/CropScreen.d.ts +9 -0
  74. package/lib/typescript/src/screens/EditorScreen.d.ts +10 -0
  75. package/lib/typescript/src/screens/ExportScreen.d.ts +9 -0
  76. package/lib/typescript/src/screens/GalleryScreen.d.ts +8 -0
  77. package/lib/typescript/src/screens/PickScreen.d.ts +13 -0
  78. package/lib/typescript/src/types.d.ts +58 -0
  79. package/package.json +101 -0
  80. package/src/assets/frames/film_vintage.png +0 -0
  81. package/src/assets/frames/floral_gold.png +0 -0
  82. package/src/assets/frames/minimal_double.png +0 -0
  83. package/src/assets/frames/polaroid_white.png +0 -0
  84. package/src/assets/frames/watercolor_floral.png +0 -0
  85. package/src/components/VideoEditor.tsx +182 -0
  86. package/src/index.tsx +2 -0
  87. package/src/native/CameraView.tsx +95 -0
  88. package/src/native/FrameGrabber.ts +21 -0
  89. package/src/native/MediaEditor.ts +33 -0
  90. package/src/native/MediaLibrary.ts +69 -0
  91. package/src/native/MediaPicker.ts +17 -0
  92. package/src/native/MediaPlayer.ts +16 -0
  93. package/src/native/VideoPreview.tsx +20 -0
  94. package/src/screens/CropScreen.tsx +968 -0
  95. package/src/screens/EditorScreen.tsx +4517 -0
  96. package/src/screens/ExportScreen.tsx +282 -0
  97. package/src/screens/GalleryScreen.tsx +412 -0
  98. package/src/screens/PickScreen.tsx +1094 -0
  99. package/src/types.ts +58 -0
@@ -0,0 +1,1195 @@
1
+ "use strict";
2
+
3
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
4
+ import { Alert, Animated, FlatList, Image, Modal, PermissionsAndroid, Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
5
+ import Ionicons from 'react-native-vector-icons/Ionicons';
6
+ import ImagePicker from 'react-native-image-crop-picker';
7
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
8
+ import { CameraView } from "../native/CameraView.js";
9
+ import { exportAsset, listAlbums, listMedia, requestMediaAccess } from "../native/MediaLibrary.js";
10
+ import { VideoPreview } from "../native/VideoPreview.js";
11
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
12
+ const TABS = ['GALLERY', 'PHOTO', 'VIDEO'];
13
+ const POST_TYPES = ['POST', 'STORY', 'REEL'];
14
+ const CameraIcon = () => /*#__PURE__*/_jsxs(View, {
15
+ style: {
16
+ width: 30,
17
+ height: 22,
18
+ borderWidth: 2,
19
+ borderColor: '#fff',
20
+ borderRadius: 4,
21
+ alignItems: 'center',
22
+ justifyContent: 'center',
23
+ position: 'relative'
24
+ },
25
+ children: [/*#__PURE__*/_jsx(View, {
26
+ style: {
27
+ width: 10,
28
+ height: 10,
29
+ borderRadius: 5,
30
+ borderWidth: 2,
31
+ borderColor: '#fff'
32
+ }
33
+ }), /*#__PURE__*/_jsx(View, {
34
+ style: {
35
+ width: 6,
36
+ height: 3,
37
+ backgroundColor: '#fff',
38
+ position: 'absolute',
39
+ top: -4,
40
+ left: 4,
41
+ borderRadius: 1
42
+ }
43
+ })]
44
+ });
45
+ function formatDuration(ms) {
46
+ if (!ms || ms <= 0) return '';
47
+ const total = Math.floor(ms / 1000);
48
+ const m = Math.floor(total / 60);
49
+ const s = total % 60;
50
+ return `${m}:${s.toString().padStart(2, '0')}`;
51
+ }
52
+ export function PickScreen({
53
+ items,
54
+ onPicked,
55
+ onNext,
56
+ headerTitle = 'New post',
57
+ customCancelIcon,
58
+ onCancelPress,
59
+ cameraModes = ['POST', 'STORY', 'REEL'],
60
+ onCameraModeChange,
61
+ defaultCameraMode
62
+ }) {
63
+ const insets = useSafeAreaInsets();
64
+ const [tab, setTab] = useState('GALLERY');
65
+ const [activeAlbum, setActiveAlbum] = useState({
66
+ id: 'all',
67
+ title: 'Recents'
68
+ });
69
+ const [showAlbumPicker, setShowAlbumPicker] = useState(false);
70
+ const [postType, setPostType] = useState('POST');
71
+ const [multiSelect, setMultiSelect] = useState(false);
72
+ const [selectedItems, setSelectedItems] = useState([]);
73
+ const [selectedMedia, setSelectedMedia] = useState(null);
74
+ const [library, setLibrary] = useState([]);
75
+ const [albums, setAlbums] = useState([]);
76
+ const [loading, setLoading] = useState(false);
77
+ const [previewUri, setPreviewUri] = useState(null);
78
+ const [cropMode, setCropMode] = useState('1:1');
79
+ const [videoPaused, setVideoPaused] = useState(false);
80
+ const scaleAnim = useRef(new Animated.Value(1)).current;
81
+ const [showCustomCamera, setShowCustomCamera] = useState(false);
82
+ const [facing, setFacing] = useState('front');
83
+ const [flashMode, setFlashMode] = useState('off');
84
+ const [isRecording, setIsRecording] = useState(false);
85
+ const isRecordingRef = useRef(false);
86
+ const cameraRef = useRef(null);
87
+ const [activeCameraMode, setActiveCameraMode] = useState(() => {
88
+ if (defaultCameraMode) {
89
+ const matched = cameraModes.find(m => m.toUpperCase() === defaultCameraMode.toUpperCase());
90
+ if (matched) return matched;
91
+ }
92
+ return cameraModes.includes('STORY') ? 'STORY' : cameraModes[0] || 'STORY';
93
+ });
94
+ useEffect(() => {
95
+ onCameraModeChange?.(activeCameraMode);
96
+ }, [activeCameraMode, onCameraModeChange]);
97
+ const handleCameraMediaCaptured = (uri, type, width, height, durationMs) => {
98
+ setShowCustomCamera(false);
99
+ const item = {
100
+ id: 'camera_' + Date.now(),
101
+ uri: uri,
102
+ type: type,
103
+ thumbnailUri: uri,
104
+ width: width,
105
+ height: height,
106
+ durationMs: durationMs
107
+ };
108
+ setLibrary(prev => [item, ...prev]);
109
+ setSelectedMedia(item);
110
+ setSelectedItems([item]);
111
+ onPicked([item]);
112
+ onNext([item]);
113
+ };
114
+ const handlePress = async () => {
115
+ if (isRecordingRef.current) {
116
+ return;
117
+ }
118
+ try {
119
+ const photo = await cameraRef.current?.capturePhoto();
120
+ if (photo) {
121
+ handleCameraMediaCaptured(photo.uri, 'image', photo.width, photo.height);
122
+ }
123
+ } catch (err) {
124
+ console.error('PickScreen: capturePhoto error:', err);
125
+ Alert.alert('Capture Error', err?.message ?? 'Failed to capture photo');
126
+ }
127
+ };
128
+ const handleLongPress = async () => {
129
+ try {
130
+ isRecordingRef.current = true;
131
+ setIsRecording(true);
132
+ await cameraRef.current?.startRecording();
133
+ } catch (err) {
134
+ isRecordingRef.current = false;
135
+ setIsRecording(false);
136
+ Alert.alert('Recording Error', err?.message ?? 'Failed to start recording');
137
+ }
138
+ };
139
+ const handlePressOut = async () => {
140
+ if (!isRecordingRef.current) return;
141
+ try {
142
+ const video = await cameraRef.current?.stopRecording();
143
+ isRecordingRef.current = false;
144
+ setIsRecording(false);
145
+ if (video) {
146
+ handleCameraMediaCaptured(video.uri, 'video', video.width, video.height, video.durationMs);
147
+ }
148
+ } catch (err) {
149
+ isRecordingRef.current = false;
150
+ setIsRecording(false);
151
+ Alert.alert('Recording Error', err?.message ?? 'Failed to stop recording');
152
+ }
153
+ };
154
+ const loadMedia = async albumId => {
155
+ try {
156
+ setLoading(true);
157
+ const assets = await listMedia({
158
+ limit: 200,
159
+ offset: 0,
160
+ type: 'all',
161
+ albumId: albumId === 'all' ? undefined : albumId
162
+ });
163
+ setLibrary(assets);
164
+ if (assets[0] && !multiSelect) {
165
+ setSelectedMedia(assets[0]);
166
+ }
167
+ } catch (err) {
168
+ Alert.alert('Library error', err?.message ?? 'Failed to load library.');
169
+ } finally {
170
+ setLoading(false);
171
+ }
172
+ };
173
+ useEffect(() => {
174
+ (async () => {
175
+ try {
176
+ const ok = await requestMediaAccess();
177
+ if (!ok) {
178
+ Alert.alert('Permission needed', 'Allow photo access to continue.');
179
+ return;
180
+ }
181
+ const fetchedAlbums = await listAlbums();
182
+ setAlbums([{
183
+ id: 'all',
184
+ title: 'Recents'
185
+ }, ...fetchedAlbums]);
186
+ loadMedia('all');
187
+ } catch (err) {
188
+ console.error('Initial load failed', err);
189
+ }
190
+ })();
191
+ }, []);
192
+ const filtered = useMemo(() => {
193
+ let list = library;
194
+ if (tab === 'PHOTO') list = library.filter(i => i.type === 'image');else if (tab === 'VIDEO') list = library.filter(i => i.type === 'video');
195
+ const cameraItem = {
196
+ id: 'camera_trigger',
197
+ uri: 'camera_trigger',
198
+ type: 'image'
199
+ };
200
+ return [cameraItem, ...list];
201
+ }, [library, tab]);
202
+ useEffect(() => {
203
+ let cancelled = false;
204
+ setVideoPaused(false);
205
+ (async () => {
206
+ if (!selectedMedia) {
207
+ setPreviewUri(null);
208
+ return;
209
+ }
210
+ if (!selectedMedia.uri.startsWith('ph://') && !selectedMedia.uri.startsWith('content://')) {
211
+ setPreviewUri(selectedMedia.uri);
212
+ return;
213
+ }
214
+ try {
215
+ const fileUri = await exportAsset(selectedMedia.id);
216
+ if (!cancelled) setPreviewUri(fileUri);
217
+ } catch {
218
+ if (!cancelled) setPreviewUri(null);
219
+ }
220
+ })();
221
+ return () => {
222
+ cancelled = true;
223
+ };
224
+ }, [selectedMedia]);
225
+ const playableUri = useMemo(() => {
226
+ if (!selectedMedia) return null;
227
+ if (previewUri && !previewUri.startsWith('ph://') && !previewUri.startsWith('content://')) return previewUri;
228
+ if (selectedMedia.uri && !selectedMedia.uri.startsWith('ph://') && !selectedMedia.uri.startsWith('content://')) return selectedMedia.uri;
229
+ return null;
230
+ }, [previewUri, selectedMedia]);
231
+ const toggleMultiSelect = () => {
232
+ setMultiSelect(v => !v);
233
+ setSelectedItems([]);
234
+ };
235
+ const handleSelectItem = item => {
236
+ setSelectedMedia(item);
237
+ if (multiSelect) {
238
+ setSelectedItems(prev => {
239
+ const exists = prev.find(i => i.id === item.id);
240
+ if (exists) return prev.filter(i => i.id !== item.id);
241
+ if (prev.length >= 10) return prev;
242
+ return [...prev, item];
243
+ });
244
+ }
245
+ Animated.sequence([Animated.timing(scaleAnim, {
246
+ toValue: 0.97,
247
+ duration: 80,
248
+ useNativeDriver: true
249
+ }), Animated.timing(scaleAnim, {
250
+ toValue: 1,
251
+ duration: 80,
252
+ useNativeDriver: true
253
+ })]).start();
254
+ };
255
+ const handleLongPressItem = item => {
256
+ if (!multiSelect) {
257
+ setMultiSelect(true);
258
+ setSelectedItems([item]);
259
+ setSelectedMedia(item);
260
+ Animated.sequence([Animated.timing(scaleAnim, {
261
+ toValue: 0.97,
262
+ duration: 80,
263
+ useNativeDriver: true
264
+ }), Animated.timing(scaleAnim, {
265
+ toValue: 1,
266
+ duration: 80,
267
+ useNativeDriver: true
268
+ })]).start();
269
+ }
270
+ };
271
+ const openImageCropPickerCamera = async type => {
272
+ try {
273
+ const result = await ImagePicker.openCamera({
274
+ mediaType: type
275
+ });
276
+ if (result) {
277
+ const item = {
278
+ id: 'camera_' + Date.now(),
279
+ uri: result.path,
280
+ type: type === 'photo' ? 'image' : 'video',
281
+ thumbnailUri: result.path,
282
+ width: result.width,
283
+ height: result.height,
284
+ durationMs: type === 'video' ? result.duration || 10000 : undefined
285
+ };
286
+ setLibrary(prev => [item, ...prev]);
287
+ setSelectedMedia(item);
288
+ setSelectedItems([item]);
289
+ onPicked([item]);
290
+ onNext([item]);
291
+ }
292
+ } catch (err) {
293
+ if (err?.message !== 'User cancelled image selection' && err?.message !== 'User cancelled image selection.') {
294
+ Alert.alert('Camera error', err?.message ?? 'Failed to open camera.');
295
+ }
296
+ }
297
+ };
298
+ const handleOpenCamera = async () => {
299
+ if (Platform.OS === 'android') {
300
+ try {
301
+ const cameraGranted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA, {
302
+ title: 'Camera Permission',
303
+ message: 'App needs access to your camera to take photos and record videos.',
304
+ buttonNeutral: 'Ask Me Later',
305
+ buttonNegative: 'Cancel',
306
+ buttonPositive: 'OK'
307
+ });
308
+ const audioGranted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.RECORD_AUDIO, {
309
+ title: 'Microphone Permission',
310
+ message: 'App needs access to your microphone to record audio for videos.',
311
+ buttonNeutral: 'Ask Me Later',
312
+ buttonNegative: 'Cancel',
313
+ buttonPositive: 'OK'
314
+ });
315
+ if (cameraGranted !== PermissionsAndroid.RESULTS.GRANTED || audioGranted !== PermissionsAndroid.RESULTS.GRANTED) {
316
+ Alert.alert('Permissions Required', 'Camera and Microphone permissions are required to use the custom camera.');
317
+ return;
318
+ }
319
+ } catch (err) {
320
+ console.warn(err);
321
+ return;
322
+ }
323
+ }
324
+ setFacing('front');
325
+ setShowCustomCamera(true);
326
+ };
327
+ const getSelectionIndex = id => {
328
+ const idx = selectedItems.findIndex(i => i.id === id);
329
+ return idx === -1 ? null : idx + 1;
330
+ };
331
+ const handleNext = () => {
332
+ const picked = multiSelect ? selectedItems : selectedMedia ? [selectedMedia] : [];
333
+ if (picked.length === 0) {
334
+ Alert.alert('Select media', 'Choose at least one item.');
335
+ return;
336
+ }
337
+ onPicked(picked);
338
+ onNext(picked);
339
+ };
340
+ const renderThumb = ({
341
+ item
342
+ }) => {
343
+ if (item.id === 'camera_trigger') {
344
+ return /*#__PURE__*/_jsx(Pressable, {
345
+ style: styles.cameraGridContainer,
346
+ onPress: handleOpenCamera,
347
+ children: /*#__PURE__*/_jsx(View, {
348
+ style: styles.cameraGridBox,
349
+ children: /*#__PURE__*/_jsx(CameraIcon, {})
350
+ })
351
+ });
352
+ }
353
+ const thumbUri = item.thumbnailUri;
354
+ const selIdx = getSelectionIndex(item.id);
355
+ const isActive = multiSelect ? !!selIdx : selectedMedia?.id === item.id;
356
+ return /*#__PURE__*/_jsxs(Pressable, {
357
+ style: styles.thumbContainer,
358
+ onPress: () => handleSelectItem(item),
359
+ onLongPress: () => handleLongPressItem(item),
360
+ children: [thumbUri ? /*#__PURE__*/_jsx(Image, {
361
+ source: {
362
+ uri: thumbUri
363
+ },
364
+ style: styles.thumb
365
+ }) : /*#__PURE__*/_jsx(View, {
366
+ style: [styles.thumb, styles.thumbFallback]
367
+ }), isActive && !multiSelect && /*#__PURE__*/_jsx(View, {
368
+ style: styles.activeOverlay
369
+ }), multiSelect && /*#__PURE__*/_jsx(View, {
370
+ style: [styles.multiOverlay, isActive && styles.multiOverlayActive],
371
+ children: isActive ? /*#__PURE__*/_jsx(View, {
372
+ style: styles.selectionBadge,
373
+ children: /*#__PURE__*/_jsx(Text, {
374
+ style: styles.selectionNumber,
375
+ children: selIdx
376
+ })
377
+ }) : /*#__PURE__*/_jsx(View, {
378
+ style: styles.emptyBadge
379
+ })
380
+ }), item.type === 'video' && /*#__PURE__*/_jsxs(_Fragment, {
381
+ children: [/*#__PURE__*/_jsx(View, {
382
+ style: styles.videoPlayBadge,
383
+ children: /*#__PURE__*/_jsx(Ionicons, {
384
+ name: "play",
385
+ size: 10,
386
+ color: "#fff"
387
+ })
388
+ }), /*#__PURE__*/_jsx(View, {
389
+ style: styles.videoBadge,
390
+ children: /*#__PURE__*/_jsx(Text, {
391
+ style: styles.videoDuration,
392
+ children: formatDuration(item.durationMs)
393
+ })
394
+ })]
395
+ })]
396
+ });
397
+ };
398
+ return /*#__PURE__*/_jsxs(View, {
399
+ style: styles.container,
400
+ children: [/*#__PURE__*/_jsxs(View, {
401
+ style: styles.header,
402
+ children: [/*#__PURE__*/_jsx(Pressable, {
403
+ onPress: () => {
404
+ if (onCancelPress) {
405
+ onCancelPress();
406
+ } else {
407
+ onNext([]);
408
+ }
409
+ },
410
+ children: customCancelIcon ? customCancelIcon : /*#__PURE__*/_jsx(Ionicons, {
411
+ name: "close",
412
+ size: 22,
413
+ color: "#fff"
414
+ })
415
+ }), /*#__PURE__*/_jsx(Text, {
416
+ style: styles.headerTitle,
417
+ children: headerTitle
418
+ }), /*#__PURE__*/_jsx(Pressable, {
419
+ style: styles.nextBtn,
420
+ onPress: handleNext,
421
+ children: /*#__PURE__*/_jsx(Text, {
422
+ style: styles.nextText,
423
+ children: "Next"
424
+ })
425
+ })]
426
+ }), /*#__PURE__*/_jsxs(Modal, {
427
+ visible: showAlbumPicker,
428
+ transparent: true,
429
+ animationType: "slide",
430
+ onRequestClose: () => setShowAlbumPicker(false),
431
+ children: [/*#__PURE__*/_jsx(Pressable, {
432
+ style: styles.albumSheetBackdrop,
433
+ onPress: () => setShowAlbumPicker(false)
434
+ }), /*#__PURE__*/_jsxs(View, {
435
+ style: styles.albumSheet,
436
+ children: [/*#__PURE__*/_jsx(View, {
437
+ style: styles.albumSheetHandle
438
+ }), /*#__PURE__*/_jsx(Text, {
439
+ style: styles.albumSheetTitle,
440
+ children: "Select Album"
441
+ }), /*#__PURE__*/_jsx(ScrollView, {
442
+ bounces: false,
443
+ children: albums.map(album => /*#__PURE__*/_jsxs(Pressable, {
444
+ style: styles.albumSheetOption,
445
+ onPress: () => {
446
+ setActiveAlbum(album);
447
+ setShowAlbumPicker(false);
448
+ loadMedia(album.id);
449
+ },
450
+ children: [/*#__PURE__*/_jsx(Text, {
451
+ style: [styles.albumSheetOptionText, activeAlbum.id === album.id && styles.albumSheetOptionActive],
452
+ children: album.title
453
+ }), activeAlbum.id === album.id && /*#__PURE__*/_jsx(Ionicons, {
454
+ name: "checkmark",
455
+ size: 20,
456
+ color: "#3b82f6"
457
+ })]
458
+ }, album.id))
459
+ })]
460
+ })]
461
+ }), /*#__PURE__*/_jsxs(Animated.View, {
462
+ style: [styles.preview, {
463
+ transform: [{
464
+ scale: scaleAnim
465
+ }]
466
+ }],
467
+ children: [selectedMedia?.type === 'video' ? /*#__PURE__*/_jsxs(Pressable, {
468
+ style: styles.previewImage,
469
+ onPress: () => setVideoPaused(v => !v),
470
+ children: [playableUri ? /*#__PURE__*/_jsx(VideoPreview, {
471
+ uri: playableUri,
472
+ paused: videoPaused,
473
+ muted: false,
474
+ style: styles.previewImage,
475
+ resizeMode: cropMode === '1:1' ? 'cover' : 'contain'
476
+ }) : /*#__PURE__*/_jsx(Image, {
477
+ source: {
478
+ uri: selectedMedia.thumbnailUri || selectedMedia.uri
479
+ },
480
+ style: styles.previewImage,
481
+ resizeMode: "cover"
482
+ }), /*#__PURE__*/_jsx(View, {
483
+ style: styles.previewOverlay,
484
+ children: /*#__PURE__*/_jsx(View, {
485
+ style: styles.playPauseCircle,
486
+ children: /*#__PURE__*/_jsx(Ionicons, {
487
+ name: videoPaused ? 'play' : 'pause',
488
+ size: 24,
489
+ color: "#fff"
490
+ })
491
+ })
492
+ })]
493
+ }) : /*#__PURE__*/_jsx(Image, {
494
+ source: {
495
+ uri: previewUri ?? selectedMedia?.uri
496
+ },
497
+ style: [styles.previewImage, cropMode === '1:1' ? styles.squareCrop : styles.originalCrop],
498
+ resizeMode: cropMode === '1:1' ? 'cover' : 'contain'
499
+ }), /*#__PURE__*/_jsx(View, {
500
+ style: styles.previewControls,
501
+ children: /*#__PURE__*/_jsx(Pressable, {
502
+ style: styles.cropToggle,
503
+ onPress: () => setCropMode(v => v === '1:1' ? 'original' : '1:1'),
504
+ children: /*#__PURE__*/_jsx(Ionicons, {
505
+ name: cropMode === '1:1' ? 'square-outline' : 'expand-outline',
506
+ size: 20,
507
+ color: "#fff"
508
+ })
509
+ })
510
+ })]
511
+ }), /*#__PURE__*/_jsxs(View, {
512
+ style: styles.albumRow,
513
+ children: [/*#__PURE__*/_jsxs(Pressable, {
514
+ style: styles.albumSelector,
515
+ onPress: () => setShowAlbumPicker(v => !v),
516
+ children: [/*#__PURE__*/_jsx(Text, {
517
+ style: styles.albumTitle,
518
+ children: activeAlbum.title
519
+ }), /*#__PURE__*/_jsx(Ionicons, {
520
+ name: "chevron-down",
521
+ size: 16,
522
+ color: "#fff",
523
+ style: {
524
+ marginLeft: 6
525
+ }
526
+ })]
527
+ }), /*#__PURE__*/_jsx(Pressable, {
528
+ style: [styles.multiSelectBtn, multiSelect && styles.multiSelectBtnActive],
529
+ onPress: toggleMultiSelect,
530
+ children: /*#__PURE__*/_jsx(Text, {
531
+ style: [styles.multiSelectText, multiSelect && styles.multiSelectTextActive],
532
+ children: multiSelect ? 'Done' : 'Select'
533
+ })
534
+ })]
535
+ }), /*#__PURE__*/_jsx(FlatList, {
536
+ data: filtered,
537
+ keyExtractor: item => item.id,
538
+ numColumns: 4,
539
+ style: styles.libraryList,
540
+ renderItem: renderThumb,
541
+ contentContainerStyle: styles.grid,
542
+ ListEmptyComponent: /*#__PURE__*/_jsx(View, {
543
+ style: styles.empty,
544
+ children: /*#__PURE__*/_jsx(Text, {
545
+ style: styles.emptyText,
546
+ children: loading ? 'Loading…' : 'No media found'
547
+ })
548
+ })
549
+ }), /*#__PURE__*/_jsx(View, {
550
+ style: styles.tabBar,
551
+ children: TABS.map(t => /*#__PURE__*/_jsx(Pressable, {
552
+ onPress: () => setTab(t),
553
+ children: /*#__PURE__*/_jsx(Text, {
554
+ style: [styles.tab, tab === t && styles.tabActive],
555
+ children: t
556
+ })
557
+ }, t))
558
+ }), /*#__PURE__*/_jsx(Modal, {
559
+ visible: showCustomCamera,
560
+ animationType: "slide",
561
+ transparent: false,
562
+ onRequestClose: () => setShowCustomCamera(false),
563
+ children: /*#__PURE__*/_jsxs(View, {
564
+ style: styles.cameraContainer,
565
+ children: [/*#__PURE__*/_jsx(CameraView, {
566
+ ref: cameraRef,
567
+ facing: facing,
568
+ flashMode: facing === 'front' ? 'off' : flashMode,
569
+ style: StyleSheet.absoluteFillObject
570
+ }), /*#__PURE__*/_jsxs(View, {
571
+ style: styles.cameraGridOverlay,
572
+ pointerEvents: "none",
573
+ children: [/*#__PURE__*/_jsxs(View, {
574
+ style: styles.gridRow,
575
+ children: [/*#__PURE__*/_jsx(View, {
576
+ style: styles.gridCell
577
+ }), /*#__PURE__*/_jsx(View, {
578
+ style: [styles.gridCell, styles.gridCellMiddleCol]
579
+ }), /*#__PURE__*/_jsx(View, {
580
+ style: styles.gridCell
581
+ })]
582
+ }), /*#__PURE__*/_jsxs(View, {
583
+ style: [styles.gridRow, styles.gridRowMiddleRow],
584
+ children: [/*#__PURE__*/_jsx(View, {
585
+ style: styles.gridCell
586
+ }), /*#__PURE__*/_jsx(View, {
587
+ style: [styles.gridCell, styles.gridCellMiddleCol]
588
+ }), /*#__PURE__*/_jsx(View, {
589
+ style: styles.gridCell
590
+ })]
591
+ }), /*#__PURE__*/_jsxs(View, {
592
+ style: styles.gridRow,
593
+ children: [/*#__PURE__*/_jsx(View, {
594
+ style: styles.gridCell
595
+ }), /*#__PURE__*/_jsx(View, {
596
+ style: [styles.gridCell, styles.gridCellMiddleCol]
597
+ }), /*#__PURE__*/_jsx(View, {
598
+ style: styles.gridCell
599
+ })]
600
+ })]
601
+ }), /*#__PURE__*/_jsxs(View, {
602
+ style: [styles.cameraHeader, {
603
+ top: Math.max(insets.top, 16)
604
+ }],
605
+ children: [/*#__PURE__*/_jsx(Pressable, {
606
+ style: styles.cameraCloseBtn,
607
+ onPress: () => setShowCustomCamera(false),
608
+ children: /*#__PURE__*/_jsx(Ionicons, {
609
+ name: "close",
610
+ size: 22,
611
+ color: "#fff"
612
+ })
613
+ }), /*#__PURE__*/_jsx(Pressable, {
614
+ style: [styles.cameraFlashContainer, facing === 'front' && {
615
+ opacity: 0.3
616
+ }],
617
+ onPress: () => setFlashMode(f => f === 'on' ? 'off' : 'on'),
618
+ disabled: facing === 'front',
619
+ children: /*#__PURE__*/_jsx(Ionicons, {
620
+ name: flashMode === 'on' && facing === 'back' ? 'flash' : 'flash-off',
621
+ size: 22,
622
+ color: flashMode === 'on' && facing === 'back' ? '#FFD700' : 'rgba(255,255,255,0.4)'
623
+ })
624
+ })]
625
+ }), /*#__PURE__*/_jsxs(View, {
626
+ style: [styles.cameraFooter, {
627
+ bottom: Math.max(insets.bottom + 60, 60)
628
+ }],
629
+ children: [/*#__PURE__*/_jsx(View, {
630
+ style: styles.cameraGalleryPreview,
631
+ children: library.length > 1 && library[1].thumbnailUri ? /*#__PURE__*/_jsx(Image, {
632
+ source: {
633
+ uri: library[1].thumbnailUri
634
+ },
635
+ style: styles.cameraGalleryThumb
636
+ }) : /*#__PURE__*/_jsx(View, {
637
+ style: styles.cameraGalleryThumbPlaceholder
638
+ })
639
+ }), /*#__PURE__*/_jsx(Pressable, {
640
+ style: [styles.captureRing, isRecording && styles.captureRingRecording],
641
+ onPress: handlePress,
642
+ onLongPress: handleLongPress,
643
+ onPressOut: handlePressOut,
644
+ delayLongPress: 200,
645
+ children: /*#__PURE__*/_jsx(View, {
646
+ style: [styles.captureButton, isRecording && styles.captureButtonRecording]
647
+ })
648
+ }), /*#__PURE__*/_jsx(Pressable, {
649
+ style: styles.flipCameraBtn,
650
+ onPress: () => setFacing(f => f === 'front' ? 'back' : 'front'),
651
+ children: /*#__PURE__*/_jsx(Ionicons, {
652
+ name: "camera-reverse-outline",
653
+ size: 26,
654
+ color: "#fff"
655
+ })
656
+ })]
657
+ }), /*#__PURE__*/_jsx(View, {
658
+ style: [styles.cameraModeBar, {
659
+ bottom: Math.max(insets.bottom + 12, 16)
660
+ }],
661
+ children: /*#__PURE__*/_jsx(ScrollView, {
662
+ horizontal: true,
663
+ showsHorizontalScrollIndicator: false,
664
+ contentContainerStyle: styles.cameraModeScrollContainer,
665
+ children: cameraModes.map(mode => {
666
+ const isActive = mode === activeCameraMode;
667
+ return /*#__PURE__*/_jsx(Pressable, {
668
+ onPress: () => setActiveCameraMode(mode),
669
+ children: /*#__PURE__*/_jsx(Text, {
670
+ style: isActive ? styles.cameraModeTextActive : styles.cameraModeTextInactive,
671
+ children: mode
672
+ })
673
+ }, mode);
674
+ })
675
+ })
676
+ })]
677
+ })
678
+ })]
679
+ });
680
+ }
681
+ const styles = StyleSheet.create({
682
+ container: {
683
+ flex: 1,
684
+ backgroundColor: '#0b0f1a'
685
+ },
686
+ header: {
687
+ flexDirection: 'row',
688
+ justifyContent: 'space-between',
689
+ alignItems: 'center',
690
+ paddingHorizontal: 16,
691
+ paddingVertical: 12,
692
+ borderBottomWidth: 0,
693
+ backgroundColor: '#0b0f1a',
694
+ zIndex: 10,
695
+ elevation: 10
696
+ },
697
+ headerTitle: {
698
+ color: '#fff',
699
+ fontWeight: '700',
700
+ fontSize: 18
701
+ },
702
+ headerCancel: {
703
+ fontSize: 20,
704
+ color: '#fff'
705
+ },
706
+ nextBtn: {
707
+ backgroundColor: '#2563eb',
708
+ paddingHorizontal: 14,
709
+ paddingVertical: 8,
710
+ borderRadius: 20
711
+ },
712
+ nextText: {
713
+ color: '#fff',
714
+ fontWeight: '700'
715
+ },
716
+ albumDropdown: {
717
+ borderBottomWidth: 1,
718
+ borderBottomColor: '#111827',
719
+ backgroundColor: '#0b0f1a'
720
+ },
721
+ albumOption: {
722
+ flexDirection: 'row',
723
+ justifyContent: 'space-between',
724
+ paddingHorizontal: 16,
725
+ paddingVertical: 10
726
+ },
727
+ albumOptionText: {
728
+ fontSize: 14,
729
+ color: '#e5e7eb'
730
+ },
731
+ albumOptionActive: {
732
+ fontWeight: '700'
733
+ },
734
+ checkmark: {
735
+ color: '#2563eb',
736
+ fontWeight: '700'
737
+ },
738
+ // Bottom sheet styles
739
+ albumSheetBackdrop: {
740
+ ...StyleSheet.absoluteFillObject,
741
+ backgroundColor: 'rgba(0,0,0,0.55)'
742
+ },
743
+ albumSheet: {
744
+ position: 'absolute',
745
+ bottom: 0,
746
+ left: 0,
747
+ right: 0,
748
+ backgroundColor: '#161b2e',
749
+ borderTopLeftRadius: 20,
750
+ borderTopRightRadius: 20,
751
+ paddingBottom: 32,
752
+ maxHeight: '60%'
753
+ },
754
+ albumSheetHandle: {
755
+ width: 40,
756
+ height: 4,
757
+ borderRadius: 2,
758
+ backgroundColor: '#3f4a6e',
759
+ alignSelf: 'center',
760
+ marginTop: 12,
761
+ marginBottom: 6
762
+ },
763
+ albumSheetTitle: {
764
+ color: '#fff',
765
+ fontSize: 16,
766
+ fontWeight: '700',
767
+ textAlign: 'center',
768
+ paddingVertical: 12,
769
+ borderBottomWidth: 1,
770
+ borderBottomColor: '#1f2a45'
771
+ },
772
+ albumSheetOption: {
773
+ flexDirection: 'row',
774
+ justifyContent: 'space-between',
775
+ alignItems: 'center',
776
+ paddingHorizontal: 20,
777
+ paddingVertical: 16,
778
+ borderBottomWidth: 1,
779
+ borderBottomColor: '#1a2240'
780
+ },
781
+ albumSheetOptionText: {
782
+ fontSize: 15,
783
+ color: '#cbd5e1'
784
+ },
785
+ albumSheetOptionActive: {
786
+ color: '#fff',
787
+ fontWeight: '700'
788
+ },
789
+ albumSheetCheckmark: {
790
+ color: '#3b82f6',
791
+ fontSize: 18,
792
+ fontWeight: '700'
793
+ },
794
+ preview: {
795
+ width: '100%',
796
+ height: 420,
797
+ backgroundColor: '#0f172a',
798
+ overflow: 'hidden'
799
+ },
800
+ previewImage: {
801
+ width: '100%',
802
+ height: '100%',
803
+ overflow: 'hidden'
804
+ },
805
+ squareCrop: {
806
+ height: '100%'
807
+ },
808
+ originalCrop: {
809
+ height: '100%'
810
+ },
811
+ previewControls: {
812
+ position: 'absolute',
813
+ left: 16,
814
+ right: 16,
815
+ bottom: 16,
816
+ flexDirection: 'row',
817
+ justifyContent: 'flex-start',
818
+ alignItems: 'center'
819
+ },
820
+ cropToggle: {
821
+ backgroundColor: 'rgba(0,0,0,0.65)',
822
+ width: 34,
823
+ height: 34,
824
+ borderRadius: 17,
825
+ alignItems: 'center',
826
+ justifyContent: 'center'
827
+ },
828
+ cropIcon: {
829
+ color: '#fff',
830
+ fontSize: 16
831
+ },
832
+ albumRow: {
833
+ flexDirection: 'row',
834
+ justifyContent: 'space-between',
835
+ alignItems: 'center',
836
+ paddingHorizontal: 16,
837
+ paddingVertical: 10
838
+ },
839
+ albumSelector: {
840
+ flexDirection: 'row',
841
+ alignItems: 'center'
842
+ },
843
+ albumTitle: {
844
+ fontSize: 16,
845
+ fontWeight: '700',
846
+ color: '#fff'
847
+ },
848
+ albumArrow: {
849
+ width: 10,
850
+ height: 10,
851
+ borderRightWidth: 2,
852
+ borderBottomWidth: 2,
853
+ borderColor: '#fff',
854
+ marginLeft: 8,
855
+ marginTop: -4,
856
+ transform: [{
857
+ rotate: '45deg'
858
+ }]
859
+ },
860
+ multiSelectBtn: {
861
+ backgroundColor: '#111827',
862
+ paddingHorizontal: 16,
863
+ paddingVertical: 8,
864
+ borderRadius: 18
865
+ },
866
+ cameraGridContainer: {
867
+ width: '25%',
868
+ aspectRatio: 1,
869
+ padding: 1
870
+ },
871
+ cameraGridBox: {
872
+ flex: 1,
873
+ backgroundColor: '#262626',
874
+ borderRadius: 8,
875
+ alignItems: 'center',
876
+ justifyContent: 'center'
877
+ },
878
+ multiSelectBtnActive: {
879
+ backgroundColor: '#2563eb'
880
+ },
881
+ multiSelectText: {
882
+ color: '#e5e7eb',
883
+ fontSize: 12,
884
+ fontWeight: '700'
885
+ },
886
+ multiSelectTextActive: {
887
+ color: '#fff'
888
+ },
889
+ postTypeBar: {
890
+ flexDirection: 'row',
891
+ justifyContent: 'space-evenly',
892
+ paddingVertical: 12,
893
+ backgroundColor: '#0b0f1a'
894
+ },
895
+ postTypeChip: {
896
+ paddingHorizontal: 28,
897
+ paddingVertical: 10,
898
+ borderRadius: 20,
899
+ backgroundColor: '#111827'
900
+ },
901
+ postTypeChipActive: {
902
+ backgroundColor: '#1d4ed8'
903
+ },
904
+ postTypeText: {
905
+ color: '#9ca3af',
906
+ fontWeight: '700',
907
+ letterSpacing: 0.4
908
+ },
909
+ postTypeTextActive: {
910
+ color: '#fff'
911
+ },
912
+ grid: {
913
+ paddingBottom: 80
914
+ },
915
+ libraryList: {
916
+ flex: 1
917
+ },
918
+ thumbContainer: {
919
+ width: '25%',
920
+ aspectRatio: 1,
921
+ padding: 1
922
+ },
923
+ thumb: {
924
+ width: '100%',
925
+ height: '100%',
926
+ borderRadius: 8
927
+ },
928
+ thumbFallback: {
929
+ backgroundColor: '#111'
930
+ },
931
+ activeOverlay: {
932
+ ...StyleSheet.absoluteFillObject,
933
+ backgroundColor: 'rgba(255,255,255,0.18)'
934
+ },
935
+ multiOverlay: {
936
+ position: 'absolute',
937
+ right: 6,
938
+ top: 6
939
+ },
940
+ multiOverlayActive: {},
941
+ selectionBadge: {
942
+ width: 22,
943
+ height: 22,
944
+ borderRadius: 11,
945
+ backgroundColor: '#2563eb',
946
+ alignItems: 'center',
947
+ justifyContent: 'center',
948
+ borderWidth: 1.5,
949
+ borderColor: '#fff'
950
+ },
951
+ selectionNumber: {
952
+ color: '#fff',
953
+ fontSize: 11,
954
+ fontWeight: '700'
955
+ },
956
+ emptyBadge: {
957
+ width: 22,
958
+ height: 22,
959
+ borderRadius: 11,
960
+ borderWidth: 1.5,
961
+ borderColor: '#fff',
962
+ backgroundColor: 'rgba(0,0,0,0.25)'
963
+ },
964
+ videoBadge: {
965
+ position: 'absolute',
966
+ right: 6,
967
+ bottom: 6,
968
+ backgroundColor: 'rgba(0,0,0,0.6)',
969
+ paddingHorizontal: 6,
970
+ paddingVertical: 2,
971
+ borderRadius: 6
972
+ },
973
+ videoDuration: {
974
+ color: '#fff',
975
+ fontSize: 10,
976
+ fontWeight: '600'
977
+ },
978
+ videoPlayBadge: {
979
+ position: 'absolute',
980
+ left: 6,
981
+ top: 6,
982
+ width: 20,
983
+ height: 20,
984
+ borderRadius: 10,
985
+ backgroundColor: 'rgba(0,0,0,0.6)',
986
+ alignItems: 'center',
987
+ justifyContent: 'center'
988
+ },
989
+ videoPlayIcon: {
990
+ color: '#fff',
991
+ fontSize: 10,
992
+ fontWeight: '700'
993
+ },
994
+ previewOverlay: {
995
+ position: 'absolute',
996
+ left: 0,
997
+ right: 0,
998
+ bottom: 14,
999
+ alignItems: 'center'
1000
+ },
1001
+ playPauseCircle: {
1002
+ width: 44,
1003
+ height: 44,
1004
+ borderRadius: 22,
1005
+ backgroundColor: 'rgba(0,0,0,0.55)',
1006
+ alignItems: 'center',
1007
+ justifyContent: 'center'
1008
+ },
1009
+ playPauseText: {
1010
+ color: '#fff',
1011
+ fontSize: 18,
1012
+ fontWeight: '700'
1013
+ },
1014
+ empty: {
1015
+ padding: 24,
1016
+ alignItems: 'center'
1017
+ },
1018
+ emptyText: {
1019
+ color: '#6b7280'
1020
+ },
1021
+ tabBar: {
1022
+ flexDirection: 'row',
1023
+ justifyContent: 'space-around',
1024
+ paddingVertical: 10,
1025
+ borderTopWidth: 1,
1026
+ borderTopColor: '#111827'
1027
+ },
1028
+ tab: {
1029
+ color: '#6b7280',
1030
+ fontWeight: '700'
1031
+ },
1032
+ tabActive: {
1033
+ color: '#fff'
1034
+ },
1035
+ cameraContainer: {
1036
+ flex: 1,
1037
+ backgroundColor: '#000'
1038
+ },
1039
+ cameraGridOverlay: {
1040
+ ...StyleSheet.absoluteFillObject,
1041
+ justifyContent: 'space-between',
1042
+ paddingVertical: 120
1043
+ },
1044
+ gridRow: {
1045
+ flex: 1,
1046
+ flexDirection: 'row'
1047
+ },
1048
+ gridRowMiddleRow: {
1049
+ borderTopWidth: 1,
1050
+ borderBottomWidth: 1,
1051
+ borderColor: 'rgba(255, 255, 255, 0.15)'
1052
+ },
1053
+ gridCell: {
1054
+ flex: 1
1055
+ },
1056
+ gridCellMiddleCol: {
1057
+ borderLeftWidth: 1,
1058
+ borderRightWidth: 1,
1059
+ borderColor: 'rgba(255, 255, 255, 0.15)'
1060
+ },
1061
+ cameraHeader: {
1062
+ position: 'absolute',
1063
+ top: 40,
1064
+ left: 0,
1065
+ right: 0,
1066
+ flexDirection: 'row',
1067
+ justifyContent: 'space-between',
1068
+ alignItems: 'center',
1069
+ paddingHorizontal: 20,
1070
+ zIndex: 10
1071
+ },
1072
+ cameraCloseBtn: {
1073
+ width: 40,
1074
+ height: 40,
1075
+ borderRadius: 20,
1076
+ backgroundColor: 'rgba(0,0,0,0.3)',
1077
+ alignItems: 'center',
1078
+ justifyContent: 'center'
1079
+ },
1080
+ cameraCloseText: {
1081
+ color: '#fff',
1082
+ fontSize: 20,
1083
+ fontWeight: '300'
1084
+ },
1085
+ cameraFlashContainer: {
1086
+ width: 40,
1087
+ height: 40,
1088
+ borderRadius: 20,
1089
+ backgroundColor: 'rgba(0,0,0,0.3)',
1090
+ alignItems: 'center',
1091
+ justifyContent: 'center'
1092
+ },
1093
+ cameraHeaderText: {
1094
+ color: '#fff',
1095
+ fontSize: 20
1096
+ },
1097
+ cameraHeaderActiveText: {
1098
+ color: '#FFD700'
1099
+ },
1100
+ cameraFooter: {
1101
+ position: 'absolute',
1102
+ bottom: 80,
1103
+ left: 0,
1104
+ right: 0,
1105
+ flexDirection: 'row',
1106
+ justifyContent: 'space-between',
1107
+ alignItems: 'center',
1108
+ paddingHorizontal: 40,
1109
+ zIndex: 10
1110
+ },
1111
+ cameraGalleryPreview: {
1112
+ width: 44,
1113
+ height: 44,
1114
+ borderRadius: 8,
1115
+ borderWidth: 2,
1116
+ borderColor: '#fff',
1117
+ overflow: 'hidden',
1118
+ backgroundColor: '#333'
1119
+ },
1120
+ cameraGalleryThumb: {
1121
+ width: '100%',
1122
+ height: '100%'
1123
+ },
1124
+ cameraGalleryThumbPlaceholder: {
1125
+ width: '100%',
1126
+ height: '100%',
1127
+ backgroundColor: '#333'
1128
+ },
1129
+ captureRing: {
1130
+ width: 84,
1131
+ height: 84,
1132
+ borderRadius: 42,
1133
+ borderWidth: 4,
1134
+ borderColor: '#fff',
1135
+ alignItems: 'center',
1136
+ justifyContent: 'center',
1137
+ backgroundColor: 'transparent'
1138
+ },
1139
+ captureRingRecording: {
1140
+ borderColor: 'rgba(255, 0, 0, 0.4)'
1141
+ },
1142
+ captureButton: {
1143
+ width: 66,
1144
+ height: 66,
1145
+ borderRadius: 33,
1146
+ backgroundColor: '#fff'
1147
+ },
1148
+ captureButtonRecording: {
1149
+ backgroundColor: '#ef4444',
1150
+ borderRadius: 8,
1151
+ width: 32,
1152
+ height: 32
1153
+ },
1154
+ flipCameraBtn: {
1155
+ width: 44,
1156
+ height: 44,
1157
+ borderRadius: 22,
1158
+ backgroundColor: 'rgba(0,0,0,0.3)',
1159
+ alignItems: 'center',
1160
+ justifyContent: 'center'
1161
+ },
1162
+ flipCameraText: {
1163
+ color: '#fff',
1164
+ fontSize: 22
1165
+ },
1166
+ cameraModeBar: {
1167
+ position: 'absolute',
1168
+ bottom: 30,
1169
+ left: 0,
1170
+ right: 0,
1171
+ flexDirection: 'row',
1172
+ zIndex: 10
1173
+ },
1174
+ cameraModeScrollContainer: {
1175
+ alignItems: 'center',
1176
+ justifyContent: 'center',
1177
+ minWidth: '100%',
1178
+ paddingHorizontal: 20
1179
+ },
1180
+ cameraModeTextActive: {
1181
+ color: '#fff',
1182
+ fontSize: 13,
1183
+ fontWeight: 'bold',
1184
+ marginHorizontal: 15,
1185
+ letterSpacing: 1.5
1186
+ },
1187
+ cameraModeTextInactive: {
1188
+ color: 'rgba(255, 255, 255, 0.5)',
1189
+ fontSize: 13,
1190
+ fontWeight: '600',
1191
+ marginHorizontal: 15,
1192
+ letterSpacing: 1.5
1193
+ }
1194
+ });
1195
+ //# sourceMappingURL=PickScreen.js.map