react-native-inapp-inspector 2.5.10 → 2.5.12

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 (134) hide show
  1. package/README.ar.md +0 -8
  2. package/README.de.md +0 -8
  3. package/README.es.md +0 -8
  4. package/README.fr.md +0 -8
  5. package/README.hi.md +0 -8
  6. package/README.ja.md +0 -8
  7. package/README.ko.md +0 -8
  8. package/README.md +54 -26
  9. package/README.pt-BR.md +0 -8
  10. package/README.ru.md +0 -8
  11. package/README.zh-CN.md +0 -8
  12. package/dist/commonjs/components/ConsoleLogCard.js +32 -26
  13. package/dist/commonjs/components/ErrorBoundary.js +1 -1
  14. package/dist/commonjs/components/Inspector/ConsoleTab.js +19 -14
  15. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +4 -4
  16. package/dist/commonjs/components/Inspector/InspectorHeader.js +73 -65
  17. package/dist/commonjs/components/Inspector/MainScreen.js +9 -6
  18. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +187 -90
  19. package/dist/commonjs/components/Inspector/NetworkDetail.js +11 -8
  20. package/dist/commonjs/components/Inspector/NetworkTab.js +33 -31
  21. package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +2 -0
  22. package/dist/commonjs/components/Inspector/PerformanceTab.js +652 -0
  23. package/dist/commonjs/components/Inspector/SettingsPanel.js +346 -245
  24. package/dist/commonjs/components/Inspector/TabBar.js +17 -16
  25. package/dist/commonjs/components/LogCard.js +11 -8
  26. package/dist/commonjs/components/ModuleErrorBoundary.js +1 -1
  27. package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
  28. package/dist/commonjs/components/NetworkIcons.js +51 -6
  29. package/dist/commonjs/constants/index.d.ts +1 -0
  30. package/dist/commonjs/constants/index.js +1 -1
  31. package/dist/commonjs/constants/version.d.ts +1 -1
  32. package/dist/commonjs/constants/version.js +1 -1
  33. package/dist/commonjs/customHooks/crashHandler.d.ts +9 -1
  34. package/dist/commonjs/customHooks/crashHandler.js +4 -4
  35. package/dist/commonjs/helpers/index.d.ts +3 -0
  36. package/dist/commonjs/helpers/index.js +8 -6
  37. package/dist/commonjs/helpers/performanceSampler.d.ts +88 -0
  38. package/dist/commonjs/helpers/performanceSampler.js +1 -0
  39. package/dist/commonjs/helpers/remoteConfig.d.ts +6 -0
  40. package/dist/commonjs/helpers/remoteConfig.js +1 -1
  41. package/dist/commonjs/helpers/telemetry.js +1 -1
  42. package/dist/commonjs/i18n/locales/ar.json +1 -1
  43. package/dist/commonjs/i18n/locales/bn.json +1 -1
  44. package/dist/commonjs/i18n/locales/de.json +1 -1
  45. package/dist/commonjs/i18n/locales/en.json +1 -1
  46. package/dist/commonjs/i18n/locales/es.json +1 -1
  47. package/dist/commonjs/i18n/locales/fr.json +1 -1
  48. package/dist/commonjs/i18n/locales/gu.json +1 -1
  49. package/dist/commonjs/i18n/locales/hi.json +1 -1
  50. package/dist/commonjs/i18n/locales/id.json +1 -1
  51. package/dist/commonjs/i18n/locales/it.json +1 -1
  52. package/dist/commonjs/i18n/locales/ja.json +1 -1
  53. package/dist/commonjs/i18n/locales/kn.json +1 -1
  54. package/dist/commonjs/i18n/locales/ko.json +1 -1
  55. package/dist/commonjs/i18n/locales/ml.json +1 -1
  56. package/dist/commonjs/i18n/locales/mr.json +1 -1
  57. package/dist/commonjs/i18n/locales/nl.json +1 -1
  58. package/dist/commonjs/i18n/locales/pa.json +1 -1
  59. package/dist/commonjs/i18n/locales/pl.json +1 -1
  60. package/dist/commonjs/i18n/locales/pt.json +1 -1
  61. package/dist/commonjs/i18n/locales/ru.json +1 -1
  62. package/dist/commonjs/i18n/locales/ta.json +1 -1
  63. package/dist/commonjs/i18n/locales/te.json +1 -1
  64. package/dist/commonjs/i18n/locales/tr.json +1 -1
  65. package/dist/commonjs/i18n/locales/vi.json +1 -1
  66. package/dist/commonjs/i18n/locales/zh.json +1 -1
  67. package/dist/commonjs/index.d.ts +4 -2
  68. package/dist/commonjs/index.js +3 -3
  69. package/dist/commonjs/styles/index.js +1 -1
  70. package/dist/commonjs/types/enums.d.ts +1 -0
  71. package/dist/commonjs/types/enums.js +1 -1
  72. package/dist/commonjs/types/interfaces.d.ts +28 -0
  73. package/dist/esm/components/ConsoleLogCard.js +67 -61
  74. package/dist/esm/components/ErrorBoundary.js +10 -10
  75. package/dist/esm/components/Inspector/ConsoleTab.js +33 -28
  76. package/dist/esm/components/Inspector/FloatingCaptureWidget.js +22 -22
  77. package/dist/esm/components/Inspector/InspectorHeader.js +194 -186
  78. package/dist/esm/components/Inspector/MainScreen.js +61 -58
  79. package/dist/esm/components/Inspector/MediaGalleryTab.js +254 -157
  80. package/dist/esm/components/Inspector/NetworkDetail.js +62 -59
  81. package/dist/esm/components/Inspector/NetworkTab.js +39 -37
  82. package/dist/esm/components/Inspector/PerformanceTab.d.ts +2 -0
  83. package/dist/esm/components/Inspector/PerformanceTab.js +652 -0
  84. package/dist/esm/components/Inspector/SettingsPanel.js +407 -306
  85. package/dist/esm/components/Inspector/TabBar.js +4 -3
  86. package/dist/esm/components/LogCard.js +37 -34
  87. package/dist/esm/components/ModuleErrorBoundary.js +1 -1
  88. package/dist/esm/components/NetworkIcons.d.ts +9 -0
  89. package/dist/esm/components/NetworkIcons.js +48 -3
  90. package/dist/esm/constants/index.d.ts +1 -0
  91. package/dist/esm/constants/index.js +1 -1
  92. package/dist/esm/constants/version.d.ts +1 -1
  93. package/dist/esm/constants/version.js +1 -1
  94. package/dist/esm/customHooks/crashHandler.d.ts +9 -1
  95. package/dist/esm/customHooks/crashHandler.js +6 -6
  96. package/dist/esm/helpers/index.d.ts +3 -0
  97. package/dist/esm/helpers/index.js +8 -6
  98. package/dist/esm/helpers/performanceSampler.d.ts +88 -0
  99. package/dist/esm/helpers/performanceSampler.js +1 -0
  100. package/dist/esm/helpers/remoteConfig.d.ts +6 -0
  101. package/dist/esm/helpers/remoteConfig.js +1 -1
  102. package/dist/esm/helpers/telemetry.js +1 -1
  103. package/dist/esm/i18n/locales/ar.json +1 -1
  104. package/dist/esm/i18n/locales/bn.json +1 -1
  105. package/dist/esm/i18n/locales/de.json +1 -1
  106. package/dist/esm/i18n/locales/en.json +1 -1
  107. package/dist/esm/i18n/locales/es.json +1 -1
  108. package/dist/esm/i18n/locales/fr.json +1 -1
  109. package/dist/esm/i18n/locales/gu.json +1 -1
  110. package/dist/esm/i18n/locales/hi.json +1 -1
  111. package/dist/esm/i18n/locales/id.json +1 -1
  112. package/dist/esm/i18n/locales/it.json +1 -1
  113. package/dist/esm/i18n/locales/ja.json +1 -1
  114. package/dist/esm/i18n/locales/kn.json +1 -1
  115. package/dist/esm/i18n/locales/ko.json +1 -1
  116. package/dist/esm/i18n/locales/ml.json +1 -1
  117. package/dist/esm/i18n/locales/mr.json +1 -1
  118. package/dist/esm/i18n/locales/nl.json +1 -1
  119. package/dist/esm/i18n/locales/pa.json +1 -1
  120. package/dist/esm/i18n/locales/pl.json +1 -1
  121. package/dist/esm/i18n/locales/pt.json +1 -1
  122. package/dist/esm/i18n/locales/ru.json +1 -1
  123. package/dist/esm/i18n/locales/ta.json +1 -1
  124. package/dist/esm/i18n/locales/te.json +1 -1
  125. package/dist/esm/i18n/locales/tr.json +1 -1
  126. package/dist/esm/i18n/locales/vi.json +1 -1
  127. package/dist/esm/i18n/locales/zh.json +1 -1
  128. package/dist/esm/index.d.ts +4 -2
  129. package/dist/esm/index.js +8 -8
  130. package/dist/esm/styles/index.js +1 -1
  131. package/dist/esm/types/enums.d.ts +1 -0
  132. package/dist/esm/types/enums.js +1 -1
  133. package/dist/esm/types/interfaces.d.ts +28 -0
  134. package/package.json +24 -1
@@ -1,202 +1,299 @@
1
- import{useState as F,useEffect as je,useMemo as se,useCallback as de}from"react";import{Dimensions as Ee,FlatList as Ne,Image as Ce,RefreshControl as _e,Share as Te,StyleSheet as qe,Text as S,TouchableOpacity as B,View as C}from"react-native";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as I}from"../../styles/AppFonts";import Se from"../TouchableScale";import Je from"../EmptyState";import{CameraRollIcon as Be,CheckIcon as Ie,CopyIcon as Y,FilmIcon as U,GifIcon as Z,GridIcon as Qe,ImageIcon as E,ListIcon as Xe,PlayIcon as Re,ScreencastIcon as Ye,ShareIcon as Ve,TrashIcon as K,WhiteBackNavigation as Ze,CloseWhite as Ke}from"../NetworkIcons";import{MediaPreviewModal as Ct}from"./MediaPreviewModal";import{ScreenCapture as O}from"../../capture";import{copyImageOrMediaToClipboard as Tt,copyToClipboard as St,formatBytes as N}from"../../helpers";import{showToast as M}from"../../helpers/toast";import{useTranslation as xt}from"../../i18n";import{useInspector as kt}from"./InspectorContext";import{ConfirmationModal as Bt}from"./ConfirmationModal";export const MediaGalleryTab=()=>{const{t:r}=xt(),{refreshMediaCount:W,switchActiveTab:A,previewMediaItem:ee,setPreviewMediaItem:_}=kt(),[z,te]=F([]),[Ge,oe]=F(!1),[v,De]=F("all"),[R,q]=F(new Set),[V,ie]=F("grid"),[$,L]=F({visible:!1,title:"",message:"",onConfirm:()=>{}}),re=async()=>{try{const t=v==="image"?"image":v==="video"?"video":"any",i=await O.pickMedia({mediaType:t});i&&(await G(),W?.().catch(()=>{}),M(i.type==="video"?r("mediaGallery.importedVideo","Video imported from Camera Roll"):r("mediaGallery.importedPhoto","Photo imported from Camera Roll")),_(i))}catch{M(r("mediaGallery.importFailed","Failed to import media"))}},G=de(async()=>{try{const t=await O.getMediaList();te(t),W?.().catch(()=>{})}catch{te([])}},[W]);je(()=>{G()},[G]);const Me=async()=>{oe(!0),await G(),oe(!1)},D=se(()=>v==="all"?z:z.filter(t=>t.type===v),[z,v]),J=se(()=>z.reduce((t,i)=>t+(i.sizeBytes||0),0),[z]),le=de(t=>{q(i=>{const l=new Set(i);return l.has(t)?l.delete(t):l.add(t),l})},[]),ae=async t=>{await O.deleteMedia(t.uri),q(l=>{const T=new Set(l);return T.delete(t.id),T}),await G(),await W?.()===0&&A("apis"),M(r("mediaGallery.deleted"))},ne=t=>{t?.uri&&Tt(t.uri,t.type==="image"?"Image":"Media")},We=()=>{const t=z.filter(l=>R.has(l.id));if(t.length===0)return;const i=t.map(l=>l.uri).join(`
2
- `);St(i,`${t.length} Media URIs`),M(`${t.length} file URIs copied to clipboard`)},Pe=async t=>{try{const i=t.uri.startsWith("file://")||t.uri.startsWith("content://")||t.uri.startsWith("http")?t.uri:`file://${t.uri}`;await Te.share({url:i,title:t.filename,message:t.filename})}catch{M(r("mediaGallery.shareUnavailable","Sharing not available on this device"))}},$e=async()=>{const t=z.filter(i=>R.has(i.id));if(t.length!==0)try{const i=t[0],l=i.uri.startsWith("file://")||i.uri.startsWith("content://")||i.uri.startsWith("http")?i.uri:`file://${i.uri}`;await Te.share({url:l,title:i.filename,message:t.length===1?i.filename:`${t.length} items: ${t.map(T=>T.filename).join(", ")}`})}catch{M(r("mediaGallery.shareUnavailable","Sharing not available on this device"))}},Fe=()=>{const t=R.size;t!==0&&L({visible:!0,title:r("mediaGallery.deleteSelectedTitle","Delete Selected Media"),message:r("mediaGallery.deleteSelectedMessage",{count:t,defaultValue:`Are you sure you want to permanently delete ${t} media items?`}),confirmText:r("mediaGallery.delete","Delete"),cancelText:r("common.cancel","Cancel"),onConfirm:async()=>{L(T=>({...T,visible:!1}));const i=z.filter(T=>R.has(T.id));for(const T of i)await O.deleteMedia(T.uri);q(new Set),await G(),await W?.()===0&&A("apis"),M(r("mediaGallery.deletedCount",{count:i.length}))}})},Oe=()=>{L({visible:!0,title:r("mediaGallery.purgeTitle","Purge Gallery"),message:r("mediaGallery.purgeMessage",{count:z.length,size:N(J),defaultValue:`Are you sure you want to delete all ${z.length} media files (${N(J)})? This cannot be undone.`}),confirmText:r("common.clearAll","Clear All"),cancelText:r("common.cancel","Cancel"),onConfirm:async()=>{L(t=>({...t,visible:!1})),await O.clearAllMedia(),q(new Set),await G(),await W?.(),A("apis"),M(r("mediaGallery.allPurged"))}})},Ae=async t=>{await O.convertToGif(t.uri,{fps:12,width:480})&&(await G(),W?.().catch(()=>{}))},Le=(t,i)=>{const l=i?e.sky400:e.slate400,T=12;switch(t){case"all":return<Ye size={T}color={l}/>;case"image":return<E size={T}color={l}/>;case"video":return<U size={T}color={l}/>;case"gif":return<Z size={T}color={l}/>}},He=({item:t})=>{if(!t)return null;const i=t.type==="video",l=t.type==="gif",T=i&&t.thumbnailUri||t.uri,P=!!(t.id&&R.has(t.id)),Q=(t.format||(i?"mp4":l?"gif":"png")).toUpperCase(),X=t.filename||(t.uri?t.uri.split("/").pop():"")||"Capture",H=t.timestamp?new Date(t.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return<Se onPress={()=>_(t)}style={[o.card,P&&o.cardSelected]}>
3
- <C style={o.thumbnailContainer}>
4
- {T?<Ce source={{uri:T}}style={o.thumbnail}resizeMode="cover"/>:<C style={o.thumbnailFallback}>
5
- {i?<U size={26}color={e.sky400}/>:<E size={26}color={e.slate400}/>}
6
- </C>}
1
+ import ot,{useState as $,useEffect as oe,useMemo as re,useCallback as X}from"react";import{Dimensions as rt,FlatList as Tt,Image as Pe,RefreshControl as Ct,Share as De,StyleSheet as wt,Text as C,TouchableOpacity as B,View as T}from"react-native";import{AppColors as t}from"../../styles/AppColors";import{AppFonts as S}from"../../styles/AppFonts";import G from"../TouchableScale";import{CameraIcon as Fe,CameraRollIcon as We,CheckIcon as Ae,CloseWhite as St,CopyIcon as Te,FilmIcon as $e,GridIcon as Bt,ImageIcon as Ge,ListIcon as It,PlayIcon as He,ScreencastIcon as Oe,ShareIcon as Le,TrashIcon as Ce,VideoCameraIcon as Ue,WhiteBackNavigation as Rt}from"../NetworkIcons";import{MediaPreviewModal as Vt}from"./MediaPreviewModal";import{ScreenCapture as D,generateCaptureId as qe}from"../../capture";import{copyImageOrMediaToClipboard as Mt,copyToClipboard as Pt,formatBytes as E}from"../../helpers";import{triggerNativeHaptic as k}from"../../native/NativeInspector";import{showToast as I}from"../../helpers/toast";import{useTranslation as Dt}from"../../i18n";import{useInspector as Ft}from"./InspectorContext";import{ConfirmationModal as Wt}from"./ConfirmationModal";export const MediaGalleryTab=()=>{const{t:w}=Dt(),{refreshMediaCount:R,switchActiveTab:we,previewMediaItem:xe,setPreviewMediaItem:W}=Ft(),[z,Se]=$([]),[Ee,Be]=$(!1),[V,Ne]=$("all"),[M,N]=$(new Set),[A,ke]=$("grid"),[F,Y]=$(!1),[Ie,Z]=$(0),O=ot.useRef(null),[L,U]=$({visible:!1,title:"",message:"",onConfirm:()=>{}}),v=X(async()=>{try{const e=await D.getMediaList();Se(e),R?.().catch(()=>{})}catch{Se([])}},[R]);oe(()=>{v()},[v]),oe(()=>{D.isRecording().then(e=>Y(e)).catch(()=>{})},[]),oe(()=>(F?(Z(0),O.current=setInterval(()=>{Z(e=>e+1)},1e3)):(O.current&&(clearInterval(O.current),O.current=null),Z(0)),()=>{O.current&&clearInterval(O.current)}),[F]);const Ye=async()=>{Be(!0),await v(),Be(!1)},j=re(()=>{let e=0,r=0,x=0;return z.forEach(P=>{P.type==="image"?e++:P.type==="video"?r++:P.type==="gif"&&x++}),{all:z.length,image:e,video:r,gif:x}},[z]),_=re(()=>V==="all"?z:z.filter(e=>e.type===V),[z,V]),J=re(()=>z.reduce((e,r)=>e+(r.sizeBytes||0),0),[z]),ze=X(async()=>{try{k("light");const e=await D.takeScreenshot({format:"png",quality:.9,hideInspector:!0});if(e){k("success");const r=qe("screenshot",e.format||"png"),x={id:r,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||r,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};W(x),await v(),R?.().catch(()=>{}),I(w("header.screenshotCaptured","Screenshot captured & saved"))}else I(w("header.screenshotFailed","Failed to capture screenshot"))}catch{I(w("header.screenshotError","Error capturing screenshot"))}},[v,R,W,w]),K=X(async()=>{try{if(F){k("medium");const e=await D.stopRecording();if(Y(!1),e){k("success");const r=qe("video",e.format),x={id:r,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||r,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio};W(x),await v(),R?.().catch(()=>{}),I(w("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else k("medium"),await D.startRecording({fps:24,audioSource:"none"})?(Y(!0),I(w("header.recordingStarted","Screen recording started"))):I(w("header.recordingStartFailed","Failed to start screen recording"))}catch{I(w("header.recordingError","Screen recording error")),Y(!1)}},[F,v,R,W,w]),ve=async()=>{try{k("light");const e=V==="image"?"image":V==="video"?"video":"any",r=await D.pickMedia({mediaType:e});r&&(k("success"),await v(),R?.().catch(()=>{}),I(r.type==="video"?w("mediaGallery.importedVideo","Video imported from Camera Roll"):w("mediaGallery.importedPhoto","Photo imported from Camera Roll")),W(r))}catch{I(w("mediaGallery.importFailed","Failed to import media"))}},Re=X(e=>{k("light"),N(r=>{const x=new Set(r);return x.has(e)?x.delete(e):x.add(e),x})},[]),Ve=async e=>{k("medium"),await D.deleteMedia(e.uri),N(r=>{const x=new Set(r);return x.delete(e.id),x}),await v(),await R?.(),I(w("mediaGallery.deleted","Media deleted"))},Me=e=>{e?.uri&&(k("light"),Mt(e.uri,e.type==="image"?"Image":"Media"))},_e=()=>{const e=z.filter(x=>M.has(x.id));if(e.length===0)return;k("light");const r=e.map(x=>x.uri).join(`
2
+ `);Pt(r,`${e.length} Media URIs`),I(`${e.length} file URIs copied to clipboard`)},Xe=async e=>{try{k("light");const r=e.uri.startsWith("file://")||e.uri.startsWith("content://")||e.uri.startsWith("http")?e.uri:`file://${e.uri}`;await De.share({url:r,title:e.filename,message:e.filename})}catch{I(w("mediaGallery.shareUnavailable","Sharing not available on this device"))}},Ze=async()=>{const e=z.filter(r=>M.has(r.id));if(e.length!==0)try{k("light");const r=e[0],x=r.uri.startsWith("file://")||r.uri.startsWith("content://")||r.uri.startsWith("http")?r.uri:`file://${r.uri}`;await De.share({url:x,title:r.filename,message:e.length===1?r.filename:`${e.length} items: ${e.map(P=>P.filename).join(", ")}`})}catch{I(w("mediaGallery.shareUnavailable","Sharing not available on this device"))}},Je=()=>{const e=M.size;e!==0&&U({visible:!0,title:w("mediaGallery.deleteSelectedTitle","Delete Selected Media"),message:w("mediaGallery.deleteSelectedMessage",{count:e,defaultValue:`Are you sure you want to permanently delete ${e} media items?`}),confirmText:w("mediaGallery.delete","Delete"),cancelText:w("common.cancel","Cancel"),onConfirm:async()=>{U(x=>({...x,visible:!1}));const r=z.filter(x=>M.has(x.id));for(const x of r)await D.deleteMedia(x.uri);N(new Set),await v(),await R?.(),I(w("mediaGallery.deletedCount",{count:r.length,defaultValue:`Deleted ${r.length} items`}))}})},Ke=()=>{U({visible:!0,title:w("mediaGallery.purgeTitle","Purge Gallery"),message:w("mediaGallery.purgeMessage",{count:z.length,size:E(J),defaultValue:`Are you sure you want to delete all ${z.length} media files (${E(J)})? This cannot be undone.`}),confirmText:w("common.clearAll","Clear All"),cancelText:w("common.cancel","Cancel"),onConfirm:async()=>{U(e=>({...e,visible:!1})),await D.clearAllMedia(),N(new Set),await v(),await R?.(),I(w("mediaGallery.allPurged","All screencast files deleted"))}})},Qe=async e=>{await D.convertToGif(e.uri,{fps:12,width:480})&&(await v(),R?.().catch(()=>{}))},Q=e=>{const r=Math.floor(e/60),x=e%60;return`${r.toString().padStart(2,"0")}:${x.toString().padStart(2,"0")}`},et=({item:e})=>{if(!e)return null;const r=e.type==="video",x=e.type==="gif",P=r&&e.thumbnailUri||e.uri,H=!!(e.id&&M.has(e.id)),ee=(e.format||(r?"mp4":x?"gif":"png")).toUpperCase(),te=e.filename||(e.uri?e.uri.split("/").pop():"")||"Capture",q=e.timestamp?new Date(e.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return<G onPress={()=>W(e)}style={[o.card,H&&o.cardSelected]}>
3
+ <T style={o.thumbnailContainer}>
4
+ {P?<Pe source={{uri:P}}style={o.thumbnail}resizeMode="cover"/>:<T style={o.thumbnailFallback}>
5
+ {r?<$e size={28}color={t.sky500}/>:<Ge size={28}color={t.grayTextWeak}/>}
6
+ </T>}
7
7
 
8
8
 
9
- <B onPress={()=>t.id&&le(t.id)}style={[o.checkbox,P&&o.checkboxSelected]}hitSlop={{top:8,bottom:8,left:8,right:8}}>
10
- {P&&<Ie size={12}color={e.white}/>}
9
+ <B onPress={()=>e.id&&Re(e.id)}style={[o.checkbox,H&&o.checkboxSelected]}hitSlop={{top:8,bottom:8,left:8,right:8}}>
10
+ {H&&<Ae size={11}color={t.white}/>}
11
11
  </B>
12
12
 
13
- {i&&<C style={o.miniPlayCircle}>
14
- <Re size={14}color={e.white}/>
15
- </C>}
16
- <C style={o.typeBadge}>
17
- {i?<U size={11}color={e.sky400}/>:l?<Z size={11}color={e.warningAmber}/>:<E size={11}color={e.emerald500}/>}
18
- <S style={o.typeBadgeText}>
19
- {Q}
20
- </S>
13
+
14
+ {r&&<T style={o.miniPlayCircle}>
15
+ <He size={14}color={t.white}/>
16
+ </T>}
17
+
18
+
19
+ <T style={[o.typeBadge,{backgroundColor:r?"rgba(14, 165, 233, 0.88)":x?"rgba(245, 158, 11, 0.88)":"rgba(16, 185, 129, 0.88)"}]}>
20
+ <C style={o.typeBadgeText}>
21
+ {ee}
22
+ </C>
23
+ </T>
24
+
25
+
26
+ {r&&e.durationMs?<T style={o.durationBadge}>
27
+ <C style={o.durationBadgeText}>
28
+ {Q(Math.round(e.durationMs/1e3))}
29
+ </C>
30
+ </T>:null}
31
+ </T>
32
+
33
+ <T style={o.cardInfo}>
34
+ <C style={o.cardTitle}numberOfLines={1}>
35
+ {te}
21
36
  </C>
22
- </C>
23
-
24
- <C style={o.cardInfo}>
25
- <S style={o.cardTitle}numberOfLines={1}>
26
- {X}
27
- </S>
28
- <C style={o.cardMetaRow}>
29
- <C style={{flexDirection:"row",alignItems:"center",gap:4,flex:1,minWidth:0}}>
30
- <S style={o.cardMeta}numberOfLines={1}>
31
- {N(t.sizeBytes||0)}
32
- </S>
33
- {H?<>
34
- <S style={o.cardMetaDot}>•</S>
35
- <S style={o.cardMeta}numberOfLines={1}>
36
- {H}
37
- </S>
37
+ <T style={o.cardMetaRow}>
38
+ <T style={{flexDirection:"row",alignItems:"center",gap:4,flex:1,minWidth:0}}>
39
+ <C style={o.cardMeta}numberOfLines={1}>
40
+ {E(e.sizeBytes||0)}
41
+ </C>
42
+ {q?<>
43
+ <C style={o.cardMetaDot}>•</C>
44
+ <C style={o.cardMeta}numberOfLines={1}>
45
+ {q}
46
+ </C>
38
47
  </>:null}
39
- </C>
40
- <B onPress={()=>ne(t)}style={o.gridCopyBtn}hitSlop={{top:6,bottom:6,left:6,right:6}}>
41
- <Y size={11}color={e.slate400}/>
48
+ </T>
49
+ <B onPress={()=>Me(e)}style={o.gridCopyBtn}hitSlop={{top:6,bottom:6,left:6,right:6}}>
50
+ <Te size={11}color={t.grayText}/>
42
51
  </B>
43
- </C>
44
- </C>
45
- </Se>},Ue=({item:t})=>{if(!t)return null;const i=t.type==="video",l=t.type==="gif",T=i&&t.thumbnailUri||t.uri,P=!!(t.id&&R.has(t.id)),Q=(t.format||(i?"mp4":l?"gif":"png")).toUpperCase(),X=t.filename||(t.uri?t.uri.split("/").pop():"")||"Capture",H=t.timestamp?`${new Date(t.timestamp).toLocaleDateString([],{month:"short",day:"numeric"})} ${new Date(t.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}`:"";return<Se onPress={()=>_(t)}style={[o.listRow,P&&o.listRowSelected]}>
52
+ </T>
53
+ </T>
54
+ </G>},tt=({item:e})=>{if(!e)return null;const r=e.type==="video",x=e.type==="gif",P=r&&e.thumbnailUri||e.uri,H=!!(e.id&&M.has(e.id)),ee=(e.format||(r?"mp4":x?"gif":"png")).toUpperCase(),te=e.filename||(e.uri?e.uri.split("/").pop():"")||"Capture",q=e.timestamp?`${new Date(e.timestamp).toLocaleDateString([],{month:"short",day:"numeric"})} ${new Date(e.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}`:"";return<G onPress={()=>W(e)}style={[o.listRow,H&&o.listRowSelected]}>
46
55
 
47
- <B onPress={()=>t.id&&le(t.id)}style={[o.listCheckbox,P&&o.checkboxSelected]}hitSlop={{top:8,bottom:8,left:8,right:8}}>
48
- {P&&<Ie size={12}color={e.white}/>}
56
+ <B onPress={()=>e.id&&Re(e.id)}style={[o.listCheckbox,H&&o.checkboxSelected]}hitSlop={{top:8,bottom:8,left:8,right:8}}>
57
+ {H&&<Ae size={11}color={t.white}/>}
49
58
  </B>
50
59
 
51
60
 
52
- <C style={o.listThumbContainer}>
53
- {T?<Ce source={{uri:T}}style={o.listThumb}resizeMode="cover"/>:<C style={o.listThumbFallback}>
54
- {i?<U size={18}color={e.sky400}/>:<E size={18}color={e.slate400}/>}
55
- </C>}
56
- {i&&<C style={o.listMiniPlay}>
57
- <Re size={10}color={e.white}/>
58
- </C>}
59
- </C>
61
+ <T style={o.listThumbContainer}>
62
+ {P?<Pe source={{uri:P}}style={o.listThumb}resizeMode="cover"/>:<T style={o.listThumbFallback}>
63
+ {r?<$e size={18}color={t.sky500}/>:<Ge size={18}color={t.grayTextWeak}/>}
64
+ </T>}
65
+ {r&&<T style={o.listMiniPlay}>
66
+ <He size={10}color={t.white}/>
67
+ </T>}
68
+ </T>
60
69
 
61
70
 
62
- <C style={o.listInfo}>
63
- <S style={o.listTitle}numberOfLines={1}>
64
- {X}
65
- </S>
66
- <C style={o.listMetaRow}>
67
- <C style={o.listBadge}>
68
- {i?<U size={10}color={e.sky400}/>:l?<Z size={10}color={e.warningAmber}/>:<E size={10}color={e.emerald500}/>}
69
- <S style={o.listBadgeText}>
70
- {Q}
71
- </S>
71
+ <T style={o.listInfo}>
72
+ <C style={o.listTitle}numberOfLines={1}>
73
+ {te}
74
+ </C>
75
+ <T style={o.listMetaRow}>
76
+ <T style={[o.listBadge,{backgroundColor:r?`${t.sky500}18`:x?`${t.amber500}18`:`${t.green600}18`}]}>
77
+ <C style={[o.listBadgeText,{color:r?t.sky600:x?t.amber500:t.green600}]}>
78
+ {ee}
79
+ </C>
80
+ </T>
81
+ <C style={o.cardMeta}>
82
+ {E(e.sizeBytes||0)}
72
83
  </C>
73
- <S style={o.cardMeta}>
74
- {N(t.sizeBytes||0)}
75
- </S>
76
- {H?<>
77
- <S style={o.cardMetaDot}>•</S>
78
- <S style={o.cardMeta}>
79
- {H}
80
- </S>
84
+ {q?<>
85
+ <C style={o.cardMetaDot}>•</C>
86
+ <C style={o.cardMeta}>
87
+ {q}
88
+ </C>
81
89
  </>:null}
82
- </C>
83
- </C>
90
+ </T>
91
+ </T>
84
92
 
85
93
 
86
- <C style={o.listActionsRow}>
87
- <B onPress={()=>ne(t)}style={o.listCopyBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
88
- <Y size={13}color={e.slate200}/>
94
+ <T style={o.listActionsRow}>
95
+ <B onPress={()=>Me(e)}style={o.listActionBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
96
+ <Te size={13}color={t.grayText}/>
89
97
  </B>
90
98
 
91
- <B onPress={()=>Pe(t)}style={o.listShareBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
92
- <Ve size={13}color={e.sky400}/>
99
+ <B onPress={()=>Xe(e)}style={o.listActionBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
100
+ <Le size={13}color={t.sky600}/>
93
101
  </B>
94
102
 
95
- <B onPress={()=>ae(t)}style={o.listDeleteBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
96
- <K size={13}color={e.red500}/>
103
+ <B onPress={()=>Ve(e)}style={o.listActionBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
104
+ <Ce size={13}color={t.red500}/>
97
105
  </B>
98
- </C>
99
- </Se>};return<C style={o.container}>
106
+ </T>
107
+ </G>};return<T style={o.container}>
100
108
 
101
- <C style={o.topHeaderBar}>
102
- <B onPress={()=>A("apis")}style={o.backToTabBtn}accessibilityLabel="Back to Inspector"hitSlop={{top:8,bottom:8,left:8,right:8}}>
103
- <Ze size={15}color={e.purple}/>
104
- <S style={o.backToTabText}>
105
- {r("common.back","Back to Inspector")}
106
- </S>
109
+ <T style={o.topHeaderBar}>
110
+ <B onPress={()=>we("apis")}style={o.backToTabBtn}accessibilityLabel="Back to Inspector"hitSlop={{top:8,bottom:8,left:8,right:8}}>
111
+ <Rt size={14}color={t.purple}/>
112
+ <C style={o.backToTabText}>
113
+ {w("common.back","Back")}
114
+ </C>
107
115
  </B>
108
116
 
109
- <B onPress={()=>A("apis")}style={o.closeCircleBtn}accessibilityLabel="Close Screencast"hitSlop={{top:8,bottom:8,left:8,right:8}}>
110
- <Ke size={14}color={e.grayTextStrong}/>
117
+ <T style={o.headerCenterTitle}>
118
+ <Oe size={15}color={t.purple}/>
119
+ <C style={o.headerStudioTitle}>
120
+ {w("tabs.media","Screencast")}
121
+ </C>
122
+ {j.all>0&&<T style={o.headerBadge}>
123
+ <C style={o.headerBadgeText}>{j.all}</C>
124
+ </T>}
125
+ </T>
126
+
127
+ <B onPress={()=>we("apis")}style={o.closeCircleBtn}accessibilityLabel="Close Screencast"hitSlop={{top:8,bottom:8,left:8,right:8}}>
128
+ <St size={12}color={t.grayTextStrong}/>
111
129
  </B>
112
- </C>
130
+ </T>
131
+
132
+
133
+ {F&&<T style={o.recordingBanner}>
134
+ <T style={o.recordingDot}/>
135
+ <C style={o.recordingBannerText}>
136
+ {w("header.recordingScreen","Screen Recording Active")} • {Q(Ie)}
137
+ </C>
138
+ <B onPress={K}style={o.stopRecordBtn}activeOpacity={.8}>
139
+ <T style={o.stopSquare}/>
140
+ <C style={o.stopRecordBtnText}>Stop & Save</C>
141
+ </B>
142
+ </T>}
143
+
144
+
145
+ <T style={o.quickActionsBar}>
146
+ <G onPress={ze}style={[o.quickBtn,{backgroundColor:`${t.purple}10`,borderColor:`${t.purple}30`}]}>
147
+ <Fe size={14}color={t.purple}/>
148
+ <C style={[o.quickBtnText,{color:t.purple}]}>
149
+ {w("header.screenshot","Screenshot")}
150
+ </C>
151
+ </G>
152
+
153
+ <G onPress={K}style={[o.quickBtn,F?{backgroundColor:`${t.red500}18`,borderColor:t.red500}:{backgroundColor:`${t.sky600}10`,borderColor:`${t.sky600}30`}]}>
154
+ <Ue size={14}color={F?t.red500:t.sky600}/>
155
+ <C style={[o.quickBtnText,{color:F?t.red500:t.sky600}]}>
156
+ {F?`Stop (${Q(Ie)})`:w("header.videoRecord","Record Video")}
157
+ </C>
158
+ </G>
159
+
160
+ <G onPress={ve}style={[o.quickBtn,{backgroundColor:`${t.emerald500}10`,borderColor:`${t.emerald500}30`}]}>
161
+ <We size={14}color={t.green600}/>
162
+ <C style={[o.quickBtnText,{color:t.green600}]}>
163
+ {w("common.import","Import")}
164
+ </C>
165
+ </G>
166
+ </T>
113
167
 
114
168
 
115
- <C style={o.filterBar}>
116
- <C style={o.chipGroup}>
117
- {["all","image","video","gif"].map(t=>{const i=v===t,l=t==="all"?r("mediaGallery.all",{count:z.length}):r(t==="image"?"mediaGallery.photos":t==="video"?"mediaGallery.videos":"mediaGallery.gifs");return<B key={t}onPress={()=>De(t)}style={[o.chip,i&&o.chipActive]}>
118
- {Le(t,i)}
119
- <S style={[o.chipText,i&&o.chipTextActive]}>
120
- {l}
121
- </S>
169
+ <T style={o.filterBar}>
170
+ <T style={o.chipGroup}>
171
+ {[{key:"all",label:w("common.all","All"),count:j.all},{key:"image",label:w("mediaGallery.photos","Photos"),count:j.image},{key:"video",label:w("mediaGallery.videos","Videos"),count:j.video},{key:"gif",label:w("mediaGallery.gifs","GIFs"),count:j.gif}].map(e=>{const r=V===e.key;return<B key={e.key}onPress={()=>{k("light"),Ne(e.key)}}style={[o.chip,r&&o.chipActive]}>
172
+ <C style={[o.chipText,r&&o.chipTextActive]}>
173
+ {e.label}
174
+ </C>
175
+ <T style={[o.chipBadge,r&&o.chipBadgeActive]}>
176
+ <C style={[o.chipBadgeText,r&&o.chipBadgeTextActive]}>
177
+ {e.count}
178
+ </C>
179
+ </T>
122
180
  </B>})}
123
- </C>
181
+ </T>
124
182
 
125
183
 
126
- <C style={o.rightControls}>
127
- <B onPress={re}style={o.importBtn}accessibilityLabel="Open Camera Roll"hitSlop={{top:6,bottom:6,left:6,right:6}}>
128
- <Be size={12}color={e.sky400}/>
129
- <S style={o.importBtnText}>
130
- {v==="image"?"Photos":v==="video"?"Videos":"Import"}
131
- </S>
184
+ <T style={o.viewToggleContainer}>
185
+ <B onPress={()=>{k("light"),ke("grid")}}style={[o.viewToggleBtn,A==="grid"&&o.viewToggleBtnActive]}>
186
+ <Bt size={13}color={A==="grid"?t.white:t.grayText}/>
132
187
  </B>
133
-
134
-
135
- <C style={o.viewToggleContainer}>
136
- <B onPress={()=>ie("grid")}style={[o.viewToggleBtn,V==="grid"&&o.viewToggleBtnActive]}>
137
- <Qe size={13}color={V==="grid"?e.white:e.slate400}/>
138
- </B>
139
- <B onPress={()=>ie("list")}style={[o.viewToggleBtn,V==="list"&&o.viewToggleBtnActive]}>
140
- <Xe size={13}color={V==="list"?e.white:e.slate400}/>
141
- </B>
142
- </C>
143
- </C>
144
- </C>
188
+ <B onPress={()=>{k("light"),ke("list")}}style={[o.viewToggleBtn,A==="list"&&o.viewToggleBtnActive]}>
189
+ <It size={13}color={A==="list"?t.white:t.grayText}/>
190
+ </B>
191
+ </T>
192
+ </T>
145
193
 
146
194
 
147
- {z.length>0&&<C style={o.subBar}>
148
- <C style={o.resultCountWrapper}>
149
- <S style={[o.resultCountText,R.size>0&&o.resultCountTextSelected]}>
150
- {R.size>0?r("mediaGallery.selectedOfResults",{selected:R.size,total:D.length,defaultValue:`Selected ${R.size} of ${D.length} results`}):D.length!==z.length?r("mediaGallery.showingFilteredResults",{count:D.length,total:z.length,defaultValue:`Showing ${D.length} of ${z.length} results`}):r("mediaGallery.showingResults",{count:D.length,defaultValue:`Showing ${D.length} results`})}
151
- </S>
152
- </C>
195
+ {z.length>0&&<T style={o.subBar}>
196
+ <T style={o.resultCountWrapper}>
197
+ <C style={[o.resultCountText,M.size>0&&o.resultCountTextSelected]}>
198
+ {M.size>0?`${M.size} of ${_.length} selected`:`${_.length} ${_.length===1?"item":"items"} \u2022 ${E(J)}`}
199
+ </C>
200
+ </T>
153
201
 
154
- <C style={o.actionsGroup}>
155
- {R.size>0&&<>
156
- <B onPress={We}style={o.copySelectedBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
157
- <Y size={12}color={e.slate200}/>
158
- <S style={o.copySelectedBtnText}>
159
- {r("mediaGallery.copyUri","Copy URI")}
160
- </S>
202
+ <T style={o.actionsGroup}>
203
+ {M.size>0?<>
204
+ <B onPress={_e}style={o.copySelectedBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
205
+ <Te size={11}color={t.grayTextStrong}/>
206
+ <C style={o.copySelectedBtnText}>
207
+ Copy
208
+ </C>
161
209
  </B>
162
210
 
163
- <B onPress={$e}style={o.shareSelectedBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
164
- <Ve size={12}color={e.sky400}/>
165
- <S style={o.shareSelectedBtnText}>
166
- {r("mediaGallery.share","Share")}
167
- </S>
211
+ <B onPress={Ze}style={o.shareSelectedBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
212
+ <Le size={11}color={t.sky600}/>
213
+ <C style={o.shareSelectedBtnText}>
214
+ Share
215
+ </C>
168
216
  </B>
169
217
 
170
- <B onPress={Fe}style={o.deleteBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
171
- <K size={13}color={e.red500}/>
172
- <S style={o.deleteBtnText}>
173
- {r("mediaGallery.deleteSelected",{count:R.size})}
174
- </S>
218
+ <B onPress={Je}style={o.deleteBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
219
+ <Ce size={11}color={t.red500}/>
220
+ <C style={o.deleteBtnText}>
221
+ Delete ({M.size})
222
+ </C>
175
223
  </B>
176
- </>}
177
-
178
- <B onPress={Oe}style={o.clearBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
179
- <K size={13}color={e.red500}/>
180
- <S style={o.clearBtnText}>
181
- {r("mediaGallery.purge",{size:N(J)})}
182
- </S>
183
- </B>
184
- </C>
185
- </C>}
224
+ </>:<B onPress={Ke}style={o.clearBtn}hitSlop={{top:8,bottom:8,left:8,right:8}}>
225
+ <Ce size={11}color={t.red500}/>
226
+ <C style={o.clearBtnText}>
227
+ Purge All
228
+ </C>
229
+ </B>}
230
+ </T>
231
+ </T>}
186
232
 
187
233
 
188
- <Ne key={V}data={D}keyExtractor={t=>t.id}renderItem={V==="grid"?He:Ue}numColumns={V==="grid"?2:1}columnWrapperStyle={V==="grid"?o.columnWrapper:void 0}style={{flex:1}}contentContainerStyle={[o.listContent,{flexGrow:1}]}nestedScrollEnabled={!0}keyboardShouldPersistTaps="handled"refreshControl={<_e refreshing={Ge}onRefresh={Me}tintColor={e.sky400}/>}ListEmptyComponent={<C style={o.emptyContainer}>
189
- <Je customTitle={v==="image"?"No Photos Found":v==="video"?"No Videos Found":r("mediaGallery.noMediaTitle")}customSub={v==="image"?"Take a screenshot or import photos from Camera Roll.":v==="video"?"Record a video or import videos from Camera Roll.":r("mediaGallery.noMediaDesc")}showReload={!1}/>
190
- <B onPress={re}style={o.emptyImportBtn}activeOpacity={.8}>
191
- <Be size={14}color={e.white}/>
192
- <S style={o.emptyImportBtnText}>
193
- {v==="image"?r("mediaGallery.importPhotos","Import Photos from Camera Roll"):v==="video"?r("mediaGallery.importVideos","Import Videos from Camera Roll"):r("mediaGallery.openCameraRoll","Open Camera Roll")}
194
- </S>
195
- </B>
196
- </C>}/>
234
+ <Tt key={A}data={_}keyExtractor={e=>e.id}renderItem={A==="grid"?et:tt}numColumns={A==="grid"?2:1}columnWrapperStyle={A==="grid"?o.columnWrapper:void 0}style={{flex:1}}contentContainerStyle={[o.listContent,{flexGrow:1}]}nestedScrollEnabled={!0}keyboardShouldPersistTaps="handled"refreshControl={<Ct refreshing={Ee}onRefresh={Ye}tintColor={t.purple}/>}ListEmptyComponent={<T style={o.emptyHeroCard}>
235
+ <T style={o.emptyIconCircle}>
236
+ <Oe size={32}color={t.purple}/>
237
+ </T>
238
+
239
+ <C style={o.emptyHeroTitle}>
240
+ {V==="image"?"No Screenshots Yet":V==="video"?"No Screen Recordings Yet":V==="gif"?"No Animated GIFs Yet":"Screencast & Media Studio"}
241
+ </C>
242
+
243
+ <C style={o.emptyHeroSubtitle}>
244
+ {V==="image"?"Take a full-screen application snapshot or import photos from your device library.":V==="video"?"Record high-FPS screen videos with audio narration to reproduce and debug issues.":"Capture pixel-perfect screenshots, record 60fps screen videos, and export GIF animations with zero background overhead."}
245
+ </C>
246
+
247
+
248
+ <T style={o.emptyActionsGrid}>
249
+ <G onPress={ze}style={o.emptyActionCard}>
250
+ <T style={[o.actionCardIconBox,{backgroundColor:`${t.purple}14`}]}>
251
+ <Fe size={18}color={t.purple}/>
252
+ </T>
253
+ <T style={o.actionCardTextBox}>
254
+ <C style={o.actionCardTitle}>Take Screenshot</C>
255
+ <C style={o.actionCardDesc}>Full-window lossless PNG</C>
256
+ </T>
257
+ </G>
258
+
259
+ <G onPress={K}style={o.emptyActionCard}>
260
+ <T style={[o.actionCardIconBox,{backgroundColor:`${t.sky600}14`}]}>
261
+ <Ue size={18}color={t.sky600}/>
262
+ </T>
263
+ <T style={o.actionCardTextBox}>
264
+ <C style={o.actionCardTitle}>Record Screen Video</C>
265
+ <C style={o.actionCardDesc}>High-FPS MP4 with audio</C>
266
+ </T>
267
+ </G>
268
+
269
+ <G onPress={ve}style={o.emptyActionCard}>
270
+ <T style={[o.actionCardIconBox,{backgroundColor:`${t.emerald500}14`}]}>
271
+ <We size={18}color={t.green600}/>
272
+ </T>
273
+ <T style={o.actionCardTextBox}>
274
+ <C style={o.actionCardTitle}>Import from Camera Roll</C>
275
+ <C style={o.actionCardDesc}>Device photos & videos</C>
276
+ </T>
277
+ </G>
278
+ </T>
279
+
280
+
281
+ <T style={o.featurePillsRow}>
282
+ <T style={o.featurePill}>
283
+ <C style={o.featurePillText}>⚡ Zero Overhead</C>
284
+ </T>
285
+ <T style={o.featurePill}>
286
+ <C style={o.featurePillText}>✂️ Crop & Annotate</C>
287
+ </T>
288
+ <T style={o.featurePill}>
289
+ <C style={o.featurePillText}>🎞️ Convert to GIF</C>
290
+ </T>
291
+ </T>
292
+ </T>}/>
197
293
 
198
294
 
199
- <Ct item={ee}visible={!!ee}onClose={()=>_(null)}onDelete={ae}onConvertToGif={Ae}/>
295
+ <Vt item={xe}visible={!!xe}onClose={()=>W(null)}onDelete={Ve}onConvertToGif={Qe}/>
200
296
 
201
- <Bt visible={$.visible}title={$.title}message={$.message}confirmText={$.confirmText}cancelText={$.cancelText}isDestructive={!0}icon="trash"onConfirm={$.onConfirm}onCancel={()=>L(t=>({...t,visible:!1}))}/>
202
- </C>};const{width:It}=Ee.get("window"),zt=(It-36)/2,o=qe.create({container:{flex:1,backgroundColor:e.slate850},topHeaderBar:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:8,backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.dividerColor},backToTabBtn:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:3,paddingHorizontal:6},backToTabText:{fontFamily:I.interSemiBold,fontSize:12,color:e.purple},closeCircleBtn:{width:26,height:26,borderRadius:13,backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.dividerColor,alignItems:"center",justifyContent:"center"},filterBar:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:9,borderBottomWidth:1,borderBottomColor:e.borderGlassLight,gap:8},chipGroup:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},chip:{flexDirection:"row",alignItems:"center",gap:4.5,paddingHorizontal:8,paddingVertical:4.5,borderRadius:6,backgroundColor:e.whiteAlpha06,borderWidth:1,borderColor:e.whiteAlpha10},chipActive:{backgroundColor:`${e.sky400}2E`,borderColor:e.sky400},chipText:{fontFamily:I.interMedium,fontSize:11,color:e.slate400},chipTextActive:{fontFamily:I.interBold,color:e.sky400},subBar:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:7,backgroundColor:`${e.slate900}99`,borderBottomWidth:1,borderBottomColor:e.borderGlassLight,gap:8},resultCountWrapper:{flexDirection:"row",alignItems:"center",flexShrink:1},resultCountText:{fontFamily:I.interMedium,fontSize:11,color:e.slate400},resultCountTextSelected:{fontFamily:I.interSemiBold,color:e.sky400},actionsGroup:{flexDirection:"row",alignItems:"center",gap:6},rightControls:{flexDirection:"row",alignItems:"center",gap:6},importBtn:{flexDirection:"row",alignItems:"center",gap:5,backgroundColor:`${e.sky500}1F`,borderColor:`${e.sky400}44`,borderWidth:1,paddingHorizontal:8,paddingVertical:4.5,borderRadius:6},importBtnText:{fontFamily:I.interSemiBold,fontSize:11,color:e.sky400},emptyContainer:{alignItems:"center",justifyContent:"center",paddingVertical:36},emptyImportBtn:{flexDirection:"row",alignItems:"center",gap:7,backgroundColor:e.sky500,paddingHorizontal:16,paddingVertical:10,borderRadius:8,marginTop:18,shadowColor:e.sky500,shadowOffset:{width:0,height:2},shadowOpacity:.35,shadowRadius:6,elevation:3},emptyImportBtnText:{fontFamily:I.interSemiBold,fontSize:13,color:e.white},viewToggleContainer:{flexDirection:"row",alignItems:"center",backgroundColor:e.whiteAlpha06,borderRadius:6,padding:2,borderWidth:1,borderColor:e.whiteAlpha10},viewToggleBtn:{paddingHorizontal:7,paddingVertical:4,borderRadius:4,alignItems:"center",justifyContent:"center"},viewToggleBtnActive:{backgroundColor:`${e.violet600}80`},deleteBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${e.red500}26`,borderWidth:1,borderColor:`${e.red500}80`},deleteBtnText:{fontFamily:I.interBold,fontSize:10.5,color:e.red500},clearBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${e.red500}1F`,borderWidth:1,borderColor:`${e.red500}4D`},clearBtnText:{fontFamily:I.interMedium,fontSize:10.5,color:e.red500},listContent:{padding:12,gap:10},columnWrapper:{gap:12},card:{width:zt,backgroundColor:e.slate800,borderRadius:8,borderWidth:1,borderColor:e.borderGlassLight,overflow:"hidden"},cardSelected:{borderColor:e.violet600,borderWidth:1.5},thumbnailContainer:{width:"100%",height:110,backgroundColor:e.slate850,position:"relative"},thumbnail:{width:"100%",height:"100%"},thumbnailFallback:{width:"100%",height:"100%",alignItems:"center",justifyContent:"center",backgroundColor:e.slate900},checkbox:{position:"absolute",top:6,left:6,width:22,height:22,borderRadius:5,borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.65)",backgroundColor:"rgba(15, 23, 42, 0.65)",alignItems:"center",justifyContent:"center",zIndex:10},checkboxSelected:{backgroundColor:e.violet600,borderColor:e.violet600},miniPlayCircle:{position:"absolute",top:"50%",left:"50%",width:32,height:32,marginTop:-16,marginLeft:-16,borderRadius:16,backgroundColor:`${e.sky400}D9`,alignItems:"center",justifyContent:"center",paddingLeft:2,shadowColor:e.black,shadowOffset:{width:0,height:2},shadowOpacity:.4,shadowRadius:4,elevation:4},typeBadge:{position:"absolute",top:6,right:6,flexDirection:"row",alignItems:"center",gap:3,backgroundColor:e.badgeGlassDark,paddingHorizontal:5,paddingVertical:2,borderRadius:4,borderWidth:1,borderColor:e.borderGlassMedium},typeBadgeText:{fontFamily:I.interBold,fontSize:9,color:e.slate200},cardInfo:{padding:8,gap:3},cardTitle:{fontFamily:I.interMedium,fontSize:11.5,color:e.white},cardMetaRow:{flexDirection:"row",alignItems:"center",gap:4},cardMeta:{fontFamily:I.interRegular,fontSize:10,color:e.slate400},cardMetaDot:{fontSize:10,color:e.whiteAlpha30},listRow:{flexDirection:"row",alignItems:"center",backgroundColor:e.slate800,borderRadius:8,borderWidth:1,borderColor:e.borderGlassLight,padding:8,gap:10},listRowSelected:{borderColor:e.violet600,borderWidth:1.5,backgroundColor:`${e.violet600}14`},listCheckbox:{width:20,height:20,borderRadius:4,borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.65)",backgroundColor:"rgba(15, 23, 42, 0.65)",alignItems:"center",justifyContent:"center"},listThumbContainer:{width:46,height:46,borderRadius:6,backgroundColor:e.slate850,overflow:"hidden",position:"relative"},listThumb:{width:"100%",height:"100%"},listThumbFallback:{width:"100%",height:"100%",alignItems:"center",justifyContent:"center",backgroundColor:e.slate900},listMiniPlay:{position:"absolute",top:"50%",left:"50%",width:20,height:20,marginTop:-10,marginLeft:-10,borderRadius:10,backgroundColor:`${e.sky400}D9`,alignItems:"center",justifyContent:"center",paddingLeft:1},listInfo:{flex:1,gap:4,minWidth:0},listTitle:{fontFamily:I.interMedium,fontSize:12,color:e.white},listMetaRow:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},listBadge:{flexDirection:"row",alignItems:"center",gap:3,backgroundColor:e.badgeGlassDark,paddingHorizontal:4,paddingVertical:1.5,borderRadius:4,borderWidth:1,borderColor:e.borderGlassMedium},listBadgeText:{fontFamily:I.interBold,fontSize:8.5,color:e.slate200},gridCopyBtn:{padding:3,borderRadius:4,backgroundColor:e.whiteAlpha08},listActionsRow:{flexDirection:"row",alignItems:"center",gap:6},listCopyBtn:{padding:6,borderRadius:6,backgroundColor:e.whiteAlpha10,borderWidth:1,borderColor:e.whiteAlpha15},listShareBtn:{padding:6,borderRadius:6,backgroundColor:`${e.sky400}18`,borderWidth:1,borderColor:`${e.sky400}40`},listDeleteBtn:{padding:6,borderRadius:6,backgroundColor:`${e.red500}14`,borderWidth:1,borderColor:`${e.red500}33`},copySelectedBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:e.whiteAlpha10,borderWidth:1,borderColor:e.whiteAlpha20},copySelectedBtnText:{fontFamily:I.interSemiBold,fontSize:10.5,color:e.slate200},shareSelectedBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${e.sky400}20`,borderWidth:1,borderColor:`${e.sky400}60`},shareSelectedBtnText:{fontFamily:I.interBold,fontSize:10.5,color:e.sky400}});
297
+
298
+ <Wt visible={L.visible}title={L.title}message={L.message}confirmText={L.confirmText}cancelText={L.cancelText}isDestructive={!0}icon="trash"onConfirm={L.onConfirm}onCancel={()=>U(e=>({...e,visible:!1}))}/>
299
+ </T>};const{width:At}=rt.get("window"),$t=(At-36)/2,o=wt.create({container:{flex:1,backgroundColor:t.grayBackground},topHeaderBar:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:10,backgroundColor:t.primaryLight,borderBottomWidth:1,borderBottomColor:t.grayBorderSecondary},backToTabBtn:{flexDirection:"row",alignItems:"center",gap:4,paddingVertical:4,paddingHorizontal:8,borderRadius:8,backgroundColor:`${t.purple}12`},backToTabText:{fontFamily:S.interBold,fontSize:11.5,color:t.purple},headerCenterTitle:{flexDirection:"row",alignItems:"center",gap:6},headerStudioTitle:{fontFamily:S.interBold,fontSize:13.5,color:t.grayTextStrong},headerBadge:{backgroundColor:`${t.purple}1A`,paddingHorizontal:6,paddingVertical:1.5,borderRadius:10},headerBadgeText:{fontFamily:S.interBold,fontSize:9.5,color:t.purple},closeCircleBtn:{width:26,height:26,borderRadius:13,backgroundColor:t.grayBackground,borderWidth:1,borderColor:t.grayBorderSecondary,alignItems:"center",justifyContent:"center"},recordingBanner:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:`${t.red500}15`,borderBottomWidth:1,borderBottomColor:`${t.red500}30`,paddingHorizontal:14,paddingVertical:8},recordingDot:{width:8,height:8,borderRadius:4,backgroundColor:t.red500,marginRight:6},recordingBannerText:{fontFamily:S.interBold,fontSize:12,color:t.red500,flex:1},stopRecordBtn:{flexDirection:"row",alignItems:"center",gap:5,backgroundColor:t.red500,paddingHorizontal:10,paddingVertical:4.5,borderRadius:6},stopSquare:{width:8,height:8,backgroundColor:t.white,borderRadius:1},stopRecordBtnText:{fontFamily:S.interBold,fontSize:11,color:t.white},quickActionsBar:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:12,paddingTop:10,paddingBottom:6},quickBtn:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:5,paddingVertical:7,paddingHorizontal:4,borderRadius:8,borderWidth:1},quickBtnText:{fontFamily:S.interBold,fontSize:11},filterBar:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:t.grayBorderSecondary,gap:8},chipGroup:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},chip:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4.5,borderRadius:8,backgroundColor:t.primaryLight,borderWidth:1,borderColor:t.grayBorderSecondary},chipActive:{backgroundColor:`${t.purple}14`,borderColor:t.purple},chipText:{fontFamily:S.interMedium,fontSize:11,color:t.grayText},chipTextActive:{fontFamily:S.interBold,color:t.purple},chipBadge:{backgroundColor:t.grayBackground,paddingHorizontal:4.5,paddingVertical:1,borderRadius:6},chipBadgeActive:{backgroundColor:t.purple},chipBadgeText:{fontFamily:S.interBold,fontSize:9,color:t.grayTextWeak},chipBadgeTextActive:{color:t.white},viewToggleContainer:{flexDirection:"row",backgroundColor:t.primaryLight,borderRadius:8,borderWidth:1,borderColor:t.grayBorderSecondary,padding:2},viewToggleBtn:{paddingHorizontal:7,paddingVertical:4,borderRadius:6},viewToggleBtnActive:{backgroundColor:t.purple},subBar:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:6.5,backgroundColor:t.primaryLight,borderBottomWidth:1,borderBottomColor:t.grayBorderSecondary},resultCountWrapper:{flex:1},resultCountText:{fontFamily:S.interMedium,fontSize:11,color:t.grayTextWeak},resultCountTextSelected:{fontFamily:S.interBold,color:t.purple},actionsGroup:{flexDirection:"row",alignItems:"center",gap:6},copySelectedBtn:{flexDirection:"row",alignItems:"center",gap:3.5,paddingHorizontal:7,paddingVertical:3.5,borderRadius:6,backgroundColor:t.grayBackground,borderWidth:1,borderColor:t.grayBorderSecondary},copySelectedBtnText:{fontFamily:S.interBold,fontSize:10,color:t.grayTextStrong},shareSelectedBtn:{flexDirection:"row",alignItems:"center",gap:3.5,paddingHorizontal:7,paddingVertical:3.5,borderRadius:6,backgroundColor:`${t.sky600}14`,borderWidth:1,borderColor:`${t.sky600}30`},shareSelectedBtnText:{fontFamily:S.interBold,fontSize:10,color:t.sky600},deleteBtn:{flexDirection:"row",alignItems:"center",gap:3.5,paddingHorizontal:7,paddingVertical:3.5,borderRadius:6,backgroundColor:`${t.red500}14`,borderWidth:1,borderColor:`${t.red500}30`},deleteBtnText:{fontFamily:S.interBold,fontSize:10,color:t.red500},clearBtn:{flexDirection:"row",alignItems:"center",gap:3.5,paddingHorizontal:7,paddingVertical:3.5,borderRadius:6,backgroundColor:`${t.red500}10`},clearBtnText:{fontFamily:S.interBold,fontSize:10,color:t.red500},listContent:{padding:12,paddingBottom:40},columnWrapper:{justifyContent:"space-between",marginBottom:10},card:{width:$t,backgroundColor:t.primaryLight,borderRadius:12,borderWidth:1,borderColor:t.grayBorderSecondary,overflow:"hidden",shadowColor:t.black,shadowOffset:{width:0,height:2},shadowOpacity:.04,shadowRadius:4,elevation:2},cardSelected:{borderColor:t.purple,borderWidth:2},thumbnailContainer:{width:"100%",height:110,backgroundColor:t.grayBackground,position:"relative"},thumbnail:{width:"100%",height:"100%"},thumbnailFallback:{flex:1,alignItems:"center",justifyContent:"center"},checkbox:{position:"absolute",top:7,left:7,width:19,height:19,borderRadius:5,backgroundColor:"rgba(0, 0, 0, 0.45)",borderWidth:1.5,borderColor:t.white,alignItems:"center",justifyContent:"center",zIndex:5},checkboxSelected:{backgroundColor:t.purple,borderColor:t.purple},miniPlayCircle:{position:"absolute",top:"50%",left:"50%",transform:[{translateX:-16},{translateY:-16}],width:32,height:32,borderRadius:16,backgroundColor:"rgba(0, 0, 0, 0.65)",alignItems:"center",justifyContent:"center"},typeBadge:{position:"absolute",top:7,right:7,paddingHorizontal:5,paddingVertical:2,borderRadius:4},typeBadgeText:{fontFamily:S.interBold,fontSize:8.5,color:t.white,letterSpacing:.3},durationBadge:{position:"absolute",bottom:6,right:6,backgroundColor:"rgba(0, 0, 0, 0.72)",paddingHorizontal:5,paddingVertical:1.5,borderRadius:4},durationBadgeText:{fontFamily:S.interBold,fontSize:9,color:t.white},cardInfo:{padding:8,gap:4},cardTitle:{fontFamily:S.interSemiBold,fontSize:11,color:t.grayTextStrong},cardMetaRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},cardMeta:{fontFamily:S.interRegular,fontSize:10,color:t.grayTextWeak},cardMetaDot:{fontSize:9,color:t.grayTextWeak},gridCopyBtn:{padding:2},listRow:{flexDirection:"row",alignItems:"center",backgroundColor:t.primaryLight,borderRadius:10,borderWidth:1,borderColor:t.grayBorderSecondary,padding:8,marginBottom:8,gap:10},listRowSelected:{borderColor:t.purple,borderWidth:1.5},listCheckbox:{width:18,height:18,borderRadius:4,borderWidth:1.5,borderColor:t.grayBorderSecondary,alignItems:"center",justifyContent:"center"},listThumbContainer:{width:48,height:48,borderRadius:8,backgroundColor:t.grayBackground,overflow:"hidden",position:"relative"},listThumb:{width:"100%",height:"100%"},listThumbFallback:{flex:1,alignItems:"center",justifyContent:"center"},listMiniPlay:{position:"absolute",bottom:2,right:2,backgroundColor:"rgba(0, 0, 0, 0.65)",borderRadius:3,padding:1.5},listInfo:{flex:1,gap:3},listTitle:{fontFamily:S.interSemiBold,fontSize:12,color:t.grayTextStrong},listMetaRow:{flexDirection:"row",alignItems:"center",gap:5},listBadge:{paddingHorizontal:4.5,paddingVertical:1,borderRadius:4},listBadgeText:{fontFamily:S.interBold,fontSize:9,letterSpacing:.3},listActionsRow:{flexDirection:"row",alignItems:"center",gap:4},listActionBtn:{padding:5,borderRadius:6,backgroundColor:t.grayBackground},emptyHeroCard:{backgroundColor:t.primaryLight,borderRadius:16,borderWidth:1,borderColor:t.grayBorderSecondary,padding:20,alignItems:"center",marginTop:8,shadowColor:t.black,shadowOffset:{width:0,height:2},shadowOpacity:.03,shadowRadius:6,elevation:2},emptyIconCircle:{width:64,height:64,borderRadius:32,backgroundColor:`${t.purple}14`,borderWidth:1,borderColor:`${t.purple}25`,alignItems:"center",justifyContent:"center",marginBottom:12},emptyHeroTitle:{fontFamily:S.interBold,fontSize:16,color:t.grayTextStrong,textAlign:"center",marginBottom:6},emptyHeroSubtitle:{fontFamily:S.interRegular,fontSize:12,lineHeight:17,color:t.grayText,textAlign:"center",marginBottom:18,paddingHorizontal:8},emptyActionsGrid:{width:"100%",gap:8,marginBottom:16},emptyActionCard:{flexDirection:"row",alignItems:"center",backgroundColor:t.grayBackground,borderRadius:10,borderWidth:1,borderColor:t.grayBorderSecondary,padding:10,gap:12},actionCardIconBox:{width:38,height:38,borderRadius:8,alignItems:"center",justifyContent:"center"},actionCardTextBox:{flex:1,gap:1.5},actionCardTitle:{fontFamily:S.interBold,fontSize:12.5,color:t.grayTextStrong},actionCardDesc:{fontFamily:S.interRegular,fontSize:10.5,color:t.grayTextWeak},featurePillsRow:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,flexWrap:"wrap",paddingTop:4},featurePill:{backgroundColor:t.grayBackground,paddingHorizontal:8,paddingVertical:3.5,borderRadius:12,borderWidth:1,borderColor:t.grayBorderSecondary},featurePillText:{fontFamily:S.interMedium,fontSize:9.5,color:t.grayTextWeak}});