@technotoil/image-video-editor 0.1.0 → 0.1.1

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