@oxyhq/services 22.6.2 → 22.6.4

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 (47) hide show
  1. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +99 -77
  2. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  3. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +33 -40
  4. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  5. package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js +92 -88
  6. package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
  7. package/lib/commonjs/ui/screens/FileManagementScreen.js +175 -360
  8. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  9. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +9 -2
  10. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  11. package/lib/module/ui/components/fileManagement/FileViewer.js +100 -78
  12. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  13. package/lib/module/ui/components/fileManagement/UploadPreview.js +34 -41
  14. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  15. package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js +94 -90
  16. package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
  17. package/lib/module/ui/screens/FileManagementScreen.js +177 -363
  18. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  19. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +9 -2
  20. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  21. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  22. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  23. package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts +0 -1
  24. package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  25. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  27. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  28. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  29. package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts +0 -1
  30. package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  31. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  32. package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/ui/components/fileManagement/FileViewer.tsx +82 -68
  35. package/src/ui/components/fileManagement/UploadPreview.tsx +34 -29
  36. package/src/ui/components/photogrid/JustifiedPhotoGrid.tsx +14 -13
  37. package/src/ui/screens/FileManagementScreen.tsx +135 -354
  38. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +6 -2
  39. package/lib/commonjs/ui/components/fileManagement/styles.js +0 -832
  40. package/lib/commonjs/ui/components/fileManagement/styles.js.map +0 -1
  41. package/lib/module/ui/components/fileManagement/styles.js +0 -828
  42. package/lib/module/ui/components/fileManagement/styles.js.map +0 -1
  43. package/lib/typescript/commonjs/ui/components/fileManagement/styles.d.ts +0 -825
  44. package/lib/typescript/commonjs/ui/components/fileManagement/styles.d.ts.map +0 -1
  45. package/lib/typescript/module/ui/components/fileManagement/styles.d.ts +0 -825
  46. package/lib/typescript/module/ui/components/fileManagement/styles.d.ts.map +0 -1
  47. package/src/ui/components/fileManagement/styles.ts +0 -823
@@ -21,7 +21,6 @@ var _useResolvedFileUrls = require("../hooks/useResolvedFileUrls.js");
21
21
  var _FileViewer = require("../components/fileManagement/FileViewer.js");
22
22
  var _FileDetailsModal = require("../components/fileManagement/FileDetailsModal.js");
23
23
  var _UploadPreview = require("../components/fileManagement/UploadPreview.js");
24
- var _styles = require("../components/fileManagement/styles.js");
25
24
  var _shared = require("./fileManagement/shared.js");
26
25
  var _useFileUploadState = require("./fileManagement/hooks/useFileUploadState.js");
27
26
  var _PhotoPickerSection = _interopRequireDefault(require("./fileManagement/PhotoPickerSection.js"));
@@ -30,6 +29,31 @@ var _UploadBar = _interopRequireDefault(require("./fileManagement/UploadBar.js")
30
29
  var _jsxRuntime = require("react/jsx-runtime");
31
30
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
31
  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); }
32
+ // Genuinely-inline-only styles: `viewModeButton` is spread into an Animated.View
33
+ // style array (interpolated backgroundColor), and the photo tiles are
34
+ // `expo-image` (no className remap). Everything else uses NativeWind classNames.
35
+ const screenStyles = _reactNative.StyleSheet.create({
36
+ viewModeButton: {
37
+ paddingHorizontal: 10,
38
+ paddingVertical: 6,
39
+ borderRadius: 999,
40
+ minWidth: 36,
41
+ alignItems: 'center',
42
+ justifyContent: 'center',
43
+ marginHorizontal: 1
44
+ },
45
+ photoImage: {
46
+ width: '100%',
47
+ height: '100%',
48
+ borderRadius: 8
49
+ },
50
+ justifiedPhotoImage: {
51
+ width: '100%',
52
+ height: '100%',
53
+ borderRadius: 6
54
+ }
55
+ });
56
+
33
57
  // Animated button component for smooth transitions
34
58
  const AnimatedButton = ({
35
59
  isSelected,
@@ -81,8 +105,7 @@ const FileManagementScreen = ({
81
105
  goBack,
82
106
  navigate,
83
107
  userId,
84
- containerWidth = 400,
85
- // Fallback for when not provided by the router
108
+ containerWidth,
86
109
  selectMode = false,
87
110
  multiSelect = false,
88
111
  onSelect,
@@ -113,8 +136,12 @@ const FileManagementScreen = ({
113
136
  const visibilityChangeDialog = (0, _bloom.useDialogControl)();
114
137
  const [pendingDeleteFile, setPendingDeleteFile] = (0, _react.useState)(null);
115
138
  const files = (0, _fileStore.useFiles)();
116
- // Ensure containerWidth is a number (TypeScript guard)
117
- const safeContainerWidth = typeof containerWidth === 'number' ? containerWidth : 400;
139
+ const {
140
+ width: windowWidth
141
+ } = (0, _reactNative.useWindowDimensions)();
142
+ // Prefer an explicit sheet width from the router; fall back to the window
143
+ // so photo grids never size against a hardcoded 400px default.
144
+ const safeContainerWidth = typeof containerWidth === 'number' && containerWidth > 0 ? containerWidth : windowWidth;
118
145
  const uploading = (0, _fileStore.useUploading)();
119
146
  const uploadProgress = (0, _fileStore.useUploadAggregateProgress)();
120
147
  const deleting = (0, _fileStore.useDeleting)();
@@ -743,60 +770,11 @@ const FileManagementScreen = ({
743
770
  setSelectedFile(file);
744
771
  fileDetailsControl.open();
745
772
  };
746
- const renderSimplePhotoItem = (0, _react.useCallback)((photo, index) => {
747
- const downloadUrl = thumbSourceFor(photo);
748
-
749
- // Calculate photo item width based on actual container size from bottom sheet
750
- let itemsPerRow = 3; // Default for mobile
751
- if (safeContainerWidth > 768) itemsPerRow = 4; // Desktop/tablet
752
- else if (safeContainerWidth > 480) itemsPerRow = 3; // Large mobile
753
-
754
- // Account for the photoScrollContainer padding (16px on each side = 32px total)
755
- const scrollContainerPadding = 32; // Total horizontal padding from photoScrollContainer
756
- const gaps = (itemsPerRow - 1) * 4; // Gap between items (4px)
757
- const availableWidth = safeContainerWidth - scrollContainerPadding;
758
- const itemWidth = (availableWidth - gaps) / itemsPerRow;
759
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
760
- style: [_styles.fileManagementStyles.simplePhotoItem, {
761
- width: itemWidth,
762
- height: itemWidth,
763
- marginRight: (index + 1) % itemsPerRow === 0 ? 0 : 4,
764
- ...(selectMode && selectedIds.has(photo.id) ? {
765
- borderWidth: 2,
766
- borderColor: colors.primary
767
- } : {})
768
- }],
769
- onPress: () => handleFileOpen(photo),
770
- activeOpacity: 0.8,
771
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
772
- style: _styles.fileManagementStyles.simplePhotoContainer,
773
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
774
- source: {
775
- uri: downloadUrl
776
- },
777
- style: _styles.fileManagementStyles.simplePhotoImage,
778
- contentFit: "cover",
779
- transition: 120,
780
- cachePolicy: "memory-disk",
781
- onError: () => {
782
- // Photo failed to load, will show placeholder
783
- },
784
- accessibilityLabel: photo.filename
785
- }), selectMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
786
- style: _styles.fileManagementStyles.selectionBadge,
787
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
788
- name: selectedIds.has(photo.id) ? 'checkmark-circle' : 'ellipse-outline',
789
- size: 20,
790
- color: selectedIds.has(photo.id) ? colors.primary : colors.text
791
- })
792
- })]
793
- })
794
- }, photo.id);
795
- }, [thumbSourceFor, safeContainerWidth, selectMode, selectedIds, colors.primary, colors.text]);
796
773
  const renderJustifiedPhotoItem = (0, _react.useCallback)((photo, width, height, isLast) => {
797
774
  const downloadUrl = thumbSourceFor(photo);
798
775
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
799
- style: [_styles.fileManagementStyles.justifiedPhotoItem, {
776
+ className: "rounded-[6px] overflow-hidden relative",
777
+ style: {
800
778
  width,
801
779
  height,
802
780
  ...(selectMode && selectedIds.has(photo.id) ? {
@@ -806,16 +784,16 @@ const FileManagementScreen = ({
806
784
  ...(selectMode && multiSelect && selectedIds.size > 0 && !selectedIds.has(photo.id) ? {
807
785
  opacity: 0.4
808
786
  } : {})
809
- }],
787
+ },
810
788
  onPress: () => handleFileOpen(photo),
811
789
  activeOpacity: 0.8,
812
790
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
813
- style: _styles.fileManagementStyles.justifiedPhotoContainer,
791
+ className: "w-full h-full relative rounded-[6px] overflow-hidden",
814
792
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
815
793
  source: {
816
794
  uri: downloadUrl
817
795
  },
818
- style: _styles.fileManagementStyles.justifiedPhotoImage,
796
+ style: screenStyles.justifiedPhotoImage,
819
797
  contentFit: "cover",
820
798
  transition: 120,
821
799
  cachePolicy: "memory-disk",
@@ -824,7 +802,10 @@ const FileManagementScreen = ({
824
802
  },
825
803
  accessibilityLabel: photo.filename
826
804
  }), selectMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
827
- style: _styles.fileManagementStyles.selectionBadge,
805
+ className: "absolute top-[4px] right-[4px] rounded-[12px] p-[2px]",
806
+ style: {
807
+ backgroundColor: 'rgba(0,0,0,0.4)'
808
+ },
828
809
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
829
810
  name: selectedIds.has(photo.id) ? 'checkmark-circle' : 'ellipse-outline',
830
811
  size: 20,
@@ -845,160 +826,6 @@ const FileManagementScreen = ({
845
826
  }
846
827
  // eslint-disable-next-line react-hooks/exhaustive-deps
847
828
  }, [targetUserId]);
848
- const renderFileItem = file => {
849
- const isImage = file.contentType.startsWith('image/');
850
- const isPDF = file.contentType.includes('pdf');
851
- const isVideo = file.contentType.startsWith('video/');
852
- const isAudio = file.contentType.startsWith('audio/');
853
- const hasPreview = isImage || isPDF || isVideo;
854
- const borderColor = colors.border;
855
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
856
- style: [_styles.fileManagementStyles.fileItem, {
857
- backgroundColor: colors.backgroundSecondary,
858
- borderColor
859
- }, selectMode && selectedIds.has(file.id) && {
860
- borderColor: colors.primary,
861
- borderWidth: 2
862
- }],
863
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
864
- style: _styles.fileManagementStyles.fileContent,
865
- onPress: () => handleFileOpen(file),
866
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
867
- style: _styles.fileManagementStyles.filePreviewContainer,
868
- children: hasPreview ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
869
- style: _styles.fileManagementStyles.filePreview,
870
- children: [isImage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
871
- source: {
872
- uri: thumbSourceFor(file)
873
- },
874
- style: _styles.fileManagementStyles.previewImage,
875
- contentFit: "cover",
876
- transition: 120,
877
- cachePolicy: "memory-disk",
878
- onError: () => {
879
- // Image preview failed to load
880
- },
881
- accessibilityLabel: file.filename
882
- }), isPDF && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
883
- style: _styles.fileManagementStyles.pdfPreview,
884
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
885
- name: "document",
886
- size: 32,
887
- color: colors.primary
888
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
889
- style: [_styles.fileManagementStyles.pdfLabel, {
890
- color: colors.primary
891
- }],
892
- children: "PDF"
893
- })]
894
- }), isVideo && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
895
- style: _styles.fileManagementStyles.videoPreviewWrapper,
896
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
897
- source: {
898
- uri: thumbSourceFor(file)
899
- },
900
- style: _styles.fileManagementStyles.videoPosterImage,
901
- contentFit: "cover",
902
- transition: 120,
903
- cachePolicy: "memory-disk",
904
- onError: _ => {
905
- // If thumbnail not available, we still show icon overlay
906
- },
907
- accessibilityLabel: `${file.filename} video thumbnail`
908
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
909
- style: _styles.fileManagementStyles.videoOverlay,
910
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
911
- name: "play",
912
- size: 24,
913
- color: "#FFFFFF"
914
- })
915
- })]
916
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
917
- style: [_styles.fileManagementStyles.fallbackIcon, {
918
- display: isImage ? 'none' : 'flex'
919
- }],
920
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
921
- name: (0, _fileManagement.getFileIcon)(file.contentType),
922
- size: 32,
923
- color: colors.primary
924
- })
925
- }), selectMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
926
- style: _styles.fileManagementStyles.selectionBadge,
927
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
928
- name: selectedIds.has(file.id) ? 'checkmark-circle' : 'ellipse-outline',
929
- size: 22,
930
- color: selectedIds.has(file.id) ? colors.primary : colors.text
931
- })
932
- })]
933
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
934
- style: _styles.fileManagementStyles.fileIconContainer,
935
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
936
- name: (0, _fileManagement.getFileIcon)(file.contentType),
937
- size: 32,
938
- color: colors.primary
939
- })
940
- })
941
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
942
- style: _styles.fileManagementStyles.fileInfo,
943
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
944
- style: [_styles.fileManagementStyles.fileName, {
945
- color: colors.text
946
- }],
947
- numberOfLines: 1,
948
- children: file.filename
949
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
950
- style: [_styles.fileManagementStyles.fileDetails, {
951
- color: colors.textSecondary
952
- }],
953
- children: [(0, _fileManagement.formatFileSize)(file.length), " \u2022 ", new Date(file.uploadDate).toLocaleDateString()]
954
- }), file.metadata?.description && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
955
- style: [_styles.fileManagementStyles.fileDescription, {
956
- color: colors.textTertiary
957
- }],
958
- numberOfLines: 2,
959
- children: file.metadata.description
960
- })]
961
- })]
962
- }), !selectMode && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
963
- style: _styles.fileManagementStyles.fileActions,
964
- children: [hasPreview && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
965
- style: [_styles.fileManagementStyles.actionButton, {
966
- backgroundColor: colors.backgroundSecondary
967
- }],
968
- onPress: () => handleFileOpen(file),
969
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
970
- name: "eye",
971
- size: 20,
972
- color: colors.primary
973
- })
974
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
975
- style: [_styles.fileManagementStyles.actionButton, {
976
- backgroundColor: colors.backgroundSecondary
977
- }],
978
- onPress: () => handleFileDownload(file.id, file.filename),
979
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
980
- name: "download",
981
- size: 20,
982
- color: colors.primary
983
- })
984
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
985
- style: [_styles.fileManagementStyles.actionButton, {
986
- backgroundColor: colors.negativeSubtle
987
- }],
988
- onPress: () => confirmFileDelete(file.id, file.filename),
989
- disabled: deleting === file.id,
990
- children: deleting === file.id ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
991
- size: "small",
992
- color: colors.error
993
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
994
- name: "trash",
995
- size: 20,
996
- color: colors.error
997
- })
998
- })]
999
- })]
1000
- }, file.id);
1001
- };
1002
829
 
1003
830
  // SettingsListItem-based file items (for 'all' view)
1004
831
  const groupedFileItems = (0, _react.useMemo)(() => {
@@ -1120,11 +947,12 @@ const FileManagementScreen = ({
1120
947
  },
1121
948
  // Hide action buttons when selecting (in selectMode or bulk operations mode)
1122
949
  rightElement: !selectMode && selectedIds.size === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1123
- style: _styles.fileManagementStyles.groupedActions,
950
+ className: "flex-row items-center gap-[6px] ml-[12px]",
1124
951
  children: [(isImage || isVideo || file.contentType.includes('pdf')) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1125
- style: [_styles.fileManagementStyles.groupedActionBtn, {
952
+ className: "w-[34px] h-[34px] rounded-[8px] items-center justify-center",
953
+ style: {
1126
954
  backgroundColor: colors.backgroundSecondary
1127
- }],
955
+ },
1128
956
  onPress: () => handleFileOpen(file),
1129
957
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1130
958
  name: "eye",
@@ -1132,9 +960,10 @@ const FileManagementScreen = ({
1132
960
  color: colors.primary
1133
961
  })
1134
962
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1135
- style: [_styles.fileManagementStyles.groupedActionBtn, {
963
+ className: "w-[34px] h-[34px] rounded-[8px] items-center justify-center",
964
+ style: {
1136
965
  backgroundColor: colors.backgroundSecondary
1137
- }],
966
+ },
1138
967
  onPress: () => handleFileDownload(file.id, file.filename),
1139
968
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1140
969
  name: "download",
@@ -1142,9 +971,10 @@ const FileManagementScreen = ({
1142
971
  color: colors.primary
1143
972
  })
1144
973
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1145
- style: [_styles.fileManagementStyles.groupedActionBtn, {
974
+ className: "w-[34px] h-[34px] rounded-[8px] items-center justify-center",
975
+ style: {
1146
976
  backgroundColor: colors.negativeSubtle
1147
- }],
977
+ },
1148
978
  onPress: () => confirmFileDelete(file.id, file.filename),
1149
979
  disabled: deleting === file.id,
1150
980
  children: deleting === file.id ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
@@ -1204,19 +1034,12 @@ const FileManagementScreen = ({
1204
1034
  const photos = filteredFiles.filter(file => file.contentType.startsWith('image/'));
1205
1035
  const photoIndex = photos.findIndex(p => p.id === lastSelectedFileId);
1206
1036
  if (photoIndex >= 0) {
1207
- // Estimate photo item height based on grid layout
1208
- // Calculate items per row
1209
- let itemsPerRow = 3;
1210
- if (safeContainerWidth > 768) itemsPerRow = 6;else if (safeContainerWidth > 480) itemsPerRow = 4;
1211
- const scrollContainerPadding = 32;
1212
- const gaps = (itemsPerRow - 1) * 4;
1213
- const availableWidth = safeContainerWidth - scrollContainerPadding;
1214
- const itemWidth = (availableWidth - gaps) / itemsPerRow;
1215
-
1216
- // Calculate row and approximate scroll position
1037
+ // Rough scroll estimate for the justified grid (3 photos/row; variable row heights).
1038
+ const itemsPerRow = 3;
1039
+ const estimatedRowHeight = 150;
1040
+ const rowGap = 4;
1217
1041
  const row = Math.floor(photoIndex / itemsPerRow);
1218
- const headerHeight = 250;
1219
- const finalScrollPosition = headerHeight + row * (itemWidth + 4) - 150;
1042
+ const finalScrollPosition = row * (estimatedRowHeight + rowGap) - 100;
1220
1043
 
1221
1044
  // Use requestAnimationFrame to ensure DOM is updated before scrolling
1222
1045
  requestAnimationFrame(() => {
@@ -1242,67 +1065,32 @@ const FileManagementScreen = ({
1242
1065
  return () => clearTimeout(timeoutId);
1243
1066
  }
1244
1067
  }, [lastSelectedFileId]);
1245
- const renderPhotoItem = (photo, index) => {
1246
- const downloadUrl = thumbSourceFor(photo);
1247
-
1248
- // Calculate photo item width based on actual container size from bottom sheet
1249
- let itemsPerRow = 3; // Default for mobile
1250
- if (safeContainerWidth > 768) itemsPerRow = 6; // Tablet/Desktop
1251
- else if (safeContainerWidth > 480) itemsPerRow = 4; // Large mobile
1252
-
1253
- // Account for the photoScrollContainer padding (16px on each side = 32px total)
1254
- const scrollContainerPadding = 32; // Total horizontal padding from photoScrollContainer
1255
- const gaps = (itemsPerRow - 1) * 4; // Gap between items
1256
- const availableWidth = safeContainerWidth - scrollContainerPadding;
1257
- const itemWidth = (availableWidth - gaps) / itemsPerRow;
1258
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1259
- style: [_styles.fileManagementStyles.photoItem, {
1260
- width: itemWidth,
1261
- height: itemWidth
1262
- }],
1263
- onPress: () => handleFileOpen(photo),
1264
- activeOpacity: 0.8,
1265
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1266
- style: _styles.fileManagementStyles.photoContainer,
1267
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
1268
- source: {
1269
- uri: downloadUrl
1270
- },
1271
- style: _styles.fileManagementStyles.photoImage,
1272
- contentFit: "cover",
1273
- transition: 120,
1274
- cachePolicy: "memory-disk",
1275
- onError: () => {
1276
- // Image preview failed to load
1277
- },
1278
- accessibilityLabel: photo.filename
1279
- })
1280
- })
1281
- }, photo.id);
1282
- };
1283
1068
  const renderPhotoGrid = (0, _react.useCallback)(() => {
1284
1069
  const photos = filteredFiles.filter(file => file.contentType.startsWith('image/'));
1285
1070
  if (photos.length === 0) {
1286
1071
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1287
- style: _styles.fileManagementStyles.emptyState,
1072
+ className: "items-center py-[40px] px-[24px]",
1288
1073
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1289
1074
  name: "images-outline",
1290
1075
  size: 64,
1291
1076
  color: colors.textTertiary
1292
1077
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1293
- style: [_styles.fileManagementStyles.emptyStateTitle, {
1078
+ className: "text-[24px] font-bold mt-[16px] mb-[8px]",
1079
+ style: {
1294
1080
  color: colors.text
1295
- }],
1081
+ },
1296
1082
  children: t('fileManagement.emptyPhotos.title')
1297
1083
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
1298
- style: [_styles.fileManagementStyles.emptyStateDescription, {
1084
+ className: "text-[16px] text-center leading-[24px] mb-[32px]",
1085
+ style: {
1299
1086
  color: colors.textSecondary
1300
- }],
1087
+ },
1301
1088
  children: [" ", user?.id === targetUserId ? t('fileManagement.emptyPhotos.ownDescription') : t('fileManagement.emptyPhotos.otherDescription'), " "]
1302
1089
  }), user?.id === targetUserId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1303
- style: [_styles.fileManagementStyles.emptyStateButton, {
1090
+ className: "flex-row items-center px-[24px] py-[12px] rounded-[24px] gap-[8px]",
1091
+ style: {
1304
1092
  backgroundColor: colors.primary
1305
- }],
1093
+ },
1306
1094
  onPress: handleFileUpload,
1307
1095
  disabled: uploading || isPickingDocument,
1308
1096
  children: uploading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
@@ -1317,7 +1105,7 @@ const FileManagementScreen = ({
1317
1105
  size: 20,
1318
1106
  color: "#FFFFFF"
1319
1107
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1320
- style: _styles.fileManagementStyles.emptyStateButtonText,
1108
+ className: "text-white text-[16px] font-semibold",
1321
1109
  children: t('fileManagement.uploadPhotos')
1322
1110
  })]
1323
1111
  })
@@ -1326,8 +1114,8 @@ const FileManagementScreen = ({
1326
1114
  }
1327
1115
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
1328
1116
  ref: photoScrollViewRef,
1329
- style: _styles.fileManagementStyles.scrollView,
1330
- contentContainerStyle: _styles.fileManagementStyles.photoScrollContainer,
1117
+ className: "flex-1",
1118
+ contentContainerClassName: "p-[10px]",
1331
1119
  refreshControl: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.RefreshControl, {
1332
1120
  refreshing: refreshing,
1333
1121
  onRefresh: () => loadFiles('refresh'),
@@ -1349,14 +1137,15 @@ const FileManagementScreen = ({
1349
1137
  },
1350
1138
  scrollEventThrottle: 250,
1351
1139
  children: [loadingDimensions && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1352
- style: _styles.fileManagementStyles.dimensionsLoadingIndicator,
1140
+ className: "flex-row items-center justify-center py-[16px] gap-[8px]",
1353
1141
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
1354
1142
  size: "small",
1355
1143
  color: colors.primary
1356
1144
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1357
- style: [_styles.fileManagementStyles.dimensionsLoadingText, {
1145
+ className: "text-[14px] italic",
1146
+ style: {
1358
1147
  color: colors.textSecondary
1359
- }],
1148
+ },
1360
1149
  children: t('fileManagement.loadingPhotoLayout')
1361
1150
  })]
1362
1151
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JustifiedPhotoGrid.default, {
@@ -1365,35 +1154,37 @@ const FileManagementScreen = ({
1365
1154
  loadPhotoDimensions: loadPhotoDimensions,
1366
1155
  createJustifiedRows: createJustifiedRows,
1367
1156
  renderJustifiedPhotoItem: renderJustifiedPhotoItem,
1368
- renderSimplePhotoItem: renderPhotoItem,
1369
1157
  textColor: colors.text,
1370
- containerWidth: safeContainerWidth
1158
+ containerWidth: typeof containerWidth === 'number' && containerWidth > 0 ? containerWidth : undefined
1371
1159
  })]
1372
1160
  });
1373
- }, [filteredFiles, colors, user?.id, targetUserId, uploading, handleFileUpload, refreshing, loadFiles, loadingDimensions, photoDimensions, loadPhotoDimensions, createJustifiedRows, renderJustifiedPhotoItem, renderPhotoItem, safeContainerWidth]);
1161
+ }, [filteredFiles, colors, user?.id, targetUserId, uploading, handleFileUpload, refreshing, loadFiles, loadingDimensions, photoDimensions, loadPhotoDimensions, createJustifiedRows, renderJustifiedPhotoItem, containerWidth]);
1374
1162
 
1375
1163
  // Inline justified grid removed (moved to components/photogrid/JustifiedPhotoGrid.tsx)
1376
1164
 
1377
1165
  const renderEmptyState = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1378
- style: _styles.fileManagementStyles.emptyState,
1166
+ className: "items-center py-[40px] px-[24px]",
1379
1167
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1380
1168
  name: "folder-open-outline",
1381
1169
  size: 64,
1382
1170
  color: colors.textTertiary
1383
1171
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1384
- style: [_styles.fileManagementStyles.emptyStateTitle, {
1172
+ className: "text-[24px] font-bold mt-[16px] mb-[8px]",
1173
+ style: {
1385
1174
  color: colors.text
1386
- }],
1175
+ },
1387
1176
  children: t('fileManagement.emptyFiles.title')
1388
1177
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1389
- style: [_styles.fileManagementStyles.emptyStateDescription, {
1178
+ className: "text-[16px] text-center leading-[24px] mb-[32px]",
1179
+ style: {
1390
1180
  color: colors.textSecondary
1391
- }],
1181
+ },
1392
1182
  children: user?.id === targetUserId ? t('fileManagement.emptyFiles.ownDescription') : t('fileManagement.emptyFiles.otherDescription')
1393
1183
  }), user?.id === targetUserId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1394
- style: [_styles.fileManagementStyles.emptyStateButton, {
1184
+ className: "flex-row items-center px-[24px] py-[12px] rounded-[24px] gap-[8px]",
1185
+ style: {
1395
1186
  backgroundColor: colors.primary
1396
- }],
1187
+ },
1397
1188
  onPress: handleFileUpload,
1398
1189
  disabled: uploading || isPickingDocument,
1399
1190
  children: uploading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
@@ -1408,7 +1199,7 @@ const FileManagementScreen = ({
1408
1199
  size: 20,
1409
1200
  color: "#FFFFFF"
1410
1201
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1411
- style: _styles.fileManagementStyles.emptyStateButtonText,
1202
+ className: "text-white text-[16px] font-semibold",
1412
1203
  children: t('fileManagement.uploadFiles')
1413
1204
  })]
1414
1205
  })
@@ -1424,7 +1215,10 @@ const FileManagementScreen = ({
1424
1215
  toValue: 1,
1425
1216
  duration: 2000,
1426
1217
  easing: _reactNative.Easing.linear,
1427
- useNativeDriver: true
1218
+ // Web has no native animated module; forcing the native
1219
+ // driver there warns and falls back to JS. The shimmer only
1220
+ // drives a transform, so JS-driving it on web is fine.
1221
+ useNativeDriver: _reactNative.Platform.OS !== 'web'
1428
1222
  }));
1429
1223
  shimmer.start();
1430
1224
  return () => shimmer.stop();
@@ -1532,22 +1326,22 @@ const FileManagementScreen = ({
1532
1326
  })]
1533
1327
  });
1534
1328
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1535
- style: [_styles.fileManagementStyles.container, {
1329
+ className: "flex-1",
1330
+ style: {
1536
1331
  backgroundColor
1537
- }],
1332
+ },
1538
1333
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1539
- style: [_styles.fileManagementStyles.header, {
1334
+ className: "flex-row items-center justify-between px-[16px] py-[12px] relative",
1335
+ style: {
1540
1336
  borderBottomColor: colors.border,
1541
1337
  borderBottomWidth: _reactNative.StyleSheet.hairlineWidth
1542
- }],
1338
+ },
1543
1339
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
1544
1340
  width: 44,
1545
1341
  height: 44,
1546
1342
  borderRadius: 12
1547
1343
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1548
- style: [_styles.fileManagementStyles.headerTitleContainer, {
1549
- flex: 1
1550
- }],
1344
+ className: "flex-1 items-center justify-center mx-[16px]",
1551
1345
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
1552
1346
  width: 140,
1553
1347
  height: 20,
@@ -1564,7 +1358,7 @@ const FileManagementScreen = ({
1564
1358
  borderRadius: 12
1565
1359
  })]
1566
1360
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1567
- style: _styles.fileManagementStyles.controlsBar,
1361
+ className: "flex-row items-center justify-between px-[12px] py-[12px] gap-[12px]",
1568
1362
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
1569
1363
  width: 100,
1570
1364
  height: 36,
@@ -1575,20 +1369,22 @@ const FileManagementScreen = ({
1575
1369
  borderRadius: 22
1576
1370
  })]
1577
1371
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1578
- style: [_styles.fileManagementStyles.searchContainer, {
1372
+ className: "flex-row items-center px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-full gap-[10px]",
1373
+ style: {
1579
1374
  backgroundColor: colors.card
1580
- }],
1375
+ },
1581
1376
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
1582
1377
  width: "100%",
1583
1378
  height: 44,
1584
1379
  borderRadius: 12
1585
1380
  })
1586
1381
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1587
- style: [_styles.fileManagementStyles.statsContainer, {
1382
+ className: "flex-row px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-[18px]",
1383
+ style: {
1588
1384
  backgroundColor: colors.card
1589
- }],
1385
+ },
1590
1386
  children: [1, 2, 3].map(i => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1591
- style: _styles.fileManagementStyles.statItem,
1387
+ className: "flex-1 items-center py-[4px]",
1592
1388
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
1593
1389
  width: 50,
1594
1390
  height: 20,
@@ -1603,8 +1399,8 @@ const FileManagementScreen = ({
1603
1399
  })]
1604
1400
  }, i))
1605
1401
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
1606
- style: _styles.fileManagementStyles.scrollView,
1607
- contentContainerStyle: _styles.fileManagementStyles.scrollContainer,
1402
+ className: "flex-1",
1403
+ contentContainerClassName: "px-[12px] pt-0 pb-[12px]",
1608
1404
  showsVerticalScrollIndicator: false,
1609
1405
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
1610
1406
  style: {
@@ -1695,7 +1491,7 @@ const FileManagementScreen = ({
1695
1491
  // If upload preview is showing, render it inline instead of the file list
1696
1492
  if (showUploadPreview) {
1697
1493
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1698
- style: _styles.fileManagementStyles.container,
1494
+ className: "flex-1",
1699
1495
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Header.default, {
1700
1496
  title: t('fileManagement.reviewFiles'),
1701
1497
  subtitle: t('fileManagement.readyToUpload', {
@@ -1716,7 +1512,7 @@ const FileManagementScreen = ({
1716
1512
  });
1717
1513
  }
1718
1514
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1719
- style: _styles.fileManagementStyles.container,
1515
+ className: "flex-1",
1720
1516
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Header.default, {
1721
1517
  title: selectMode ? multiSelect ? maxSelection ? t('fileManagement.selectedWithMax', {
1722
1518
  count: selectedIds.size,
@@ -1766,22 +1562,26 @@ const FileManagementScreen = ({
1766
1562
  elevation: "none",
1767
1563
  titleAlignment: "left"
1768
1564
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1769
- style: _styles.fileManagementStyles.controlsBar,
1565
+ className: "flex-row items-center justify-between px-[12px] py-[12px] gap-[12px]",
1770
1566
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
1771
1567
  horizontal: true,
1772
1568
  showsHorizontalScrollIndicator: false,
1773
- style: _styles.fileManagementStyles.viewModeScroll,
1569
+ className: "flex-1",
1570
+ style: {
1571
+ maxWidth: '80%'
1572
+ },
1774
1573
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1775
- style: [_styles.fileManagementStyles.viewModeToggle, {
1574
+ className: "flex-row rounded-full p-[2px] overflow-hidden",
1575
+ style: {
1776
1576
  backgroundColor: colors.card
1777
- }],
1577
+ },
1778
1578
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
1779
1579
  isSelected: viewMode === 'all',
1780
1580
  onPress: () => setViewMode('all'),
1781
1581
  icon: viewMode === 'all' ? 'folder' : 'folder-outline',
1782
1582
  primaryColor: colors.primary,
1783
1583
  textColor: colors.text,
1784
- style: _styles.fileManagementStyles.viewModeButton,
1584
+ style: screenStyles.viewModeButton,
1785
1585
  accessibilityLabel: t('fileManagement.a11y.viewAll') || 'Show all files'
1786
1586
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
1787
1587
  isSelected: viewMode === 'photos',
@@ -1789,7 +1589,7 @@ const FileManagementScreen = ({
1789
1589
  icon: viewMode === 'photos' ? 'image-multiple' : 'image-multiple-outline',
1790
1590
  primaryColor: colors.primary,
1791
1591
  textColor: colors.text,
1792
- style: _styles.fileManagementStyles.viewModeButton,
1592
+ style: screenStyles.viewModeButton,
1793
1593
  accessibilityLabel: t('fileManagement.a11y.viewPhotos') || 'Show photos only'
1794
1594
  }), !isImageOnlyPicker && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
1795
1595
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
@@ -1798,7 +1598,7 @@ const FileManagementScreen = ({
1798
1598
  icon: viewMode === 'videos' ? 'video' : 'video-outline',
1799
1599
  primaryColor: colors.primary,
1800
1600
  textColor: colors.text,
1801
- style: _styles.fileManagementStyles.viewModeButton,
1601
+ style: screenStyles.viewModeButton,
1802
1602
  accessibilityLabel: t('fileManagement.a11y.viewVideos') || 'Show videos only'
1803
1603
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
1804
1604
  isSelected: viewMode === 'documents',
@@ -1806,7 +1606,7 @@ const FileManagementScreen = ({
1806
1606
  icon: viewMode === 'documents' ? 'file-document' : 'file-document-outline',
1807
1607
  primaryColor: colors.primary,
1808
1608
  textColor: colors.text,
1809
- style: _styles.fileManagementStyles.viewModeButton,
1609
+ style: screenStyles.viewModeButton,
1810
1610
  accessibilityLabel: t('fileManagement.a11y.viewDocuments') || 'Show documents only'
1811
1611
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
1812
1612
  isSelected: viewMode === 'audio',
@@ -1814,15 +1614,16 @@ const FileManagementScreen = ({
1814
1614
  icon: viewMode === 'audio' ? 'music-note' : 'music-note-outline',
1815
1615
  primaryColor: colors.primary,
1816
1616
  textColor: colors.text,
1817
- style: _styles.fileManagementStyles.viewModeButton,
1617
+ style: screenStyles.viewModeButton,
1818
1618
  accessibilityLabel: t('fileManagement.a11y.viewAudio') || 'Show audio only'
1819
1619
  })]
1820
1620
  })]
1821
1621
  })
1822
1622
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
1823
- style: [_styles.fileManagementStyles.sortButton, {
1623
+ className: "flex-row items-center justify-center px-[10px] py-[6px] rounded-full min-w-[36px] gap-[4px]",
1624
+ style: {
1824
1625
  backgroundColor: colors.card
1825
- }],
1626
+ },
1826
1627
  accessibilityRole: "button",
1827
1628
  accessibilityLabel: t('fileManagement.a11y.sortBy', {
1828
1629
  field: sortBy,
@@ -1849,9 +1650,10 @@ const FileManagementScreen = ({
1849
1650
  color: colors.textSecondary
1850
1651
  })]
1851
1652
  }), user?.id === targetUserId && (!selectMode || selectMode && allowUploadInSelectMode) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1852
- style: [_styles.fileManagementStyles.uploadButton, isImageOnlyPicker && _styles.fileManagementStyles.uploadButtonExtended, {
1653
+ className: `h-[44px] rounded-[22px] items-center justify-center ${isImageOnlyPicker ? 'w-auto min-w-[44px] px-[14px]' : 'w-[44px]'}`,
1654
+ style: {
1853
1655
  backgroundColor: colors.primary
1854
- }],
1656
+ },
1855
1657
  onPress: handleFileUpload,
1856
1658
  disabled: uploading || isPickingDocument,
1857
1659
  accessibilityRole: "button",
@@ -1860,25 +1662,25 @@ const FileManagementScreen = ({
1860
1662
  busy: uploading || isPickingDocument
1861
1663
  },
1862
1664
  children: uploading ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1863
- style: _styles.fileManagementStyles.uploadProgress,
1665
+ className: "items-center justify-center",
1864
1666
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
1865
1667
  size: "small",
1866
1668
  color: "#FFFFFF"
1867
1669
  }), uploadProgress && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
1868
- style: _styles.fileManagementStyles.uploadProgressText,
1670
+ className: "text-white text-[10px] font-semibold mt-[2px]",
1869
1671
  children: [uploadProgress.current, "/", uploadProgress.total]
1870
1672
  })]
1871
1673
  }) : isPickingDocument ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
1872
1674
  size: "small",
1873
1675
  color: "#FFFFFF"
1874
1676
  }) : isImageOnlyPicker ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1875
- style: _styles.fileManagementStyles.uploadButtonContent,
1677
+ className: "flex-row items-center gap-[6px]",
1876
1678
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1877
1679
  name: "cloud-upload",
1878
1680
  size: 18,
1879
1681
  color: "#FFFFFF"
1880
1682
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1881
- style: _styles.fileManagementStyles.uploadButtonLabel,
1683
+ className: "text-white text-[14px] font-semibold",
1882
1684
  numberOfLines: 1,
1883
1685
  children: t('fileManagement.upload') || 'Upload'
1884
1686
  })]
@@ -1889,24 +1691,26 @@ const FileManagementScreen = ({
1889
1691
  })
1890
1692
  })]
1891
1693
  }), files.length > 0 && (viewMode === 'all' || files.some(f => f.contentType.startsWith('image/'))) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1892
- style: [_styles.fileManagementStyles.searchContainer, {
1694
+ className: "flex-row items-center px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-full gap-[10px]",
1695
+ style: {
1893
1696
  backgroundColor: colors.card
1894
- }],
1697
+ },
1895
1698
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1896
1699
  name: "search",
1897
1700
  size: 22,
1898
1701
  color: colors.icon
1899
1702
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
1900
- style: [_styles.fileManagementStyles.searchInput, {
1703
+ className: "flex-1 text-[16px] leading-[20px]",
1704
+ style: {
1901
1705
  color: colors.text
1902
- }],
1706
+ },
1903
1707
  placeholder: viewMode === 'photos' ? t('fileManagement.searchPhotos') : t('fileManagement.searchFiles'),
1904
1708
  placeholderTextColor: colors.textSecondary,
1905
1709
  value: searchQuery,
1906
1710
  onChangeText: setSearchQuery
1907
1711
  }), searchQuery.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
1908
1712
  onPress: () => setSearchQuery(''),
1909
- style: _styles.fileManagementStyles.searchClearButton,
1713
+ className: "p-[4px] rounded-[12px] items-center justify-center",
1910
1714
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
1911
1715
  name: "close-circle",
1912
1716
  size: 22,
@@ -1914,46 +1718,59 @@ const FileManagementScreen = ({
1914
1718
  })
1915
1719
  })]
1916
1720
  }), files.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1917
- style: [_styles.fileManagementStyles.statsContainer, {
1721
+ className: "flex-row px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-[18px]",
1722
+ style: {
1918
1723
  backgroundColor: colors.card
1919
- }],
1724
+ },
1920
1725
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1921
- style: _styles.fileManagementStyles.statItem,
1726
+ className: "flex-1 items-center py-[4px]",
1922
1727
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1923
- style: [_styles.fileManagementStyles.statValue, {
1924
- color: colors.text
1925
- }],
1728
+ className: "text-[20px] font-extrabold leading-[24px]",
1729
+ style: {
1730
+ color: colors.text,
1731
+ letterSpacing: -0.5
1732
+ },
1926
1733
  children: filteredFiles.length
1927
1734
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1928
- style: [_styles.fileManagementStyles.statLabel, {
1929
- color: colors.textSecondary
1930
- }],
1735
+ className: "text-[12px] font-medium mt-[2px]",
1736
+ style: {
1737
+ color: colors.textSecondary,
1738
+ letterSpacing: 0.2
1739
+ },
1931
1740
  children: searchQuery.length > 0 ? t('fileManagement.found') : filteredFiles.length === 1 ? viewMode === 'photos' ? t('fileManagement.photo') : t('fileManagement.file') : viewMode === 'photos' ? t('fileManagement.photos_stat') : t('fileManagement.files')
1932
1741
  })]
1933
1742
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1934
- style: _styles.fileManagementStyles.statItem,
1743
+ className: "flex-1 items-center py-[4px]",
1935
1744
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1936
- style: [_styles.fileManagementStyles.statValue, {
1937
- color: colors.text
1938
- }],
1745
+ className: "text-[20px] font-extrabold leading-[24px]",
1746
+ style: {
1747
+ color: colors.text,
1748
+ letterSpacing: -0.5
1749
+ },
1939
1750
  children: (0, _fileManagement.formatFileSize)(filteredFiles.reduce((total, file) => total + file.length, 0))
1940
1751
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1941
- style: [_styles.fileManagementStyles.statLabel, {
1942
- color: colors.textSecondary
1943
- }],
1752
+ className: "text-[12px] font-medium mt-[2px]",
1753
+ style: {
1754
+ color: colors.textSecondary,
1755
+ letterSpacing: 0.2
1756
+ },
1944
1757
  children: searchQuery.length > 0 ? t('fileManagement.size') : t('fileManagement.totalSize')
1945
1758
  })]
1946
1759
  }), searchQuery.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
1947
- style: _styles.fileManagementStyles.statItem,
1760
+ className: "flex-1 items-center py-[4px]",
1948
1761
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1949
- style: [_styles.fileManagementStyles.statValue, {
1950
- color: colors.text
1951
- }],
1762
+ className: "text-[20px] font-extrabold leading-[24px]",
1763
+ style: {
1764
+ color: colors.text,
1765
+ letterSpacing: -0.5
1766
+ },
1952
1767
  children: files.length
1953
1768
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
1954
- style: [_styles.fileManagementStyles.statLabel, {
1955
- color: colors.textSecondary
1956
- }],
1769
+ className: "text-[12px] font-medium mt-[2px]",
1770
+ style: {
1771
+ color: colors.textSecondary,
1772
+ letterSpacing: 0.2
1773
+ },
1957
1774
  children: t('fileManagement.total')
1958
1775
  })]
1959
1776
  })]
@@ -2031,7 +1848,5 @@ const FileManagementScreen = ({
2031
1848
  })]
2032
1849
  });
2033
1850
  };
2034
-
2035
- // Styles have been moved to components/fileManagement/styles.ts
2036
1851
  var _default = exports.default = FileManagementScreen;
2037
1852
  //# sourceMappingURL=FileManagementScreen.js.map