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.
- package/README.ar.md +0 -8
- package/README.de.md +0 -8
- package/README.es.md +0 -8
- package/README.fr.md +0 -8
- package/README.hi.md +0 -8
- package/README.ja.md +0 -8
- package/README.ko.md +0 -8
- package/README.md +54 -26
- package/README.pt-BR.md +0 -8
- package/README.ru.md +0 -8
- package/README.zh-CN.md +0 -8
- package/dist/commonjs/components/ConsoleLogCard.js +32 -26
- package/dist/commonjs/components/ErrorBoundary.js +1 -1
- package/dist/commonjs/components/Inspector/ConsoleTab.js +19 -14
- package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +4 -4
- package/dist/commonjs/components/Inspector/InspectorHeader.js +73 -65
- package/dist/commonjs/components/Inspector/MainScreen.js +9 -6
- package/dist/commonjs/components/Inspector/MediaGalleryTab.js +187 -90
- package/dist/commonjs/components/Inspector/NetworkDetail.js +11 -8
- package/dist/commonjs/components/Inspector/NetworkTab.js +33 -31
- package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +2 -0
- package/dist/commonjs/components/Inspector/PerformanceTab.js +652 -0
- package/dist/commonjs/components/Inspector/SettingsPanel.js +346 -245
- package/dist/commonjs/components/Inspector/TabBar.js +17 -16
- package/dist/commonjs/components/LogCard.js +11 -8
- package/dist/commonjs/components/ModuleErrorBoundary.js +1 -1
- package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
- package/dist/commonjs/components/NetworkIcons.js +51 -6
- package/dist/commonjs/constants/index.d.ts +1 -0
- package/dist/commonjs/constants/index.js +1 -1
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/crashHandler.d.ts +9 -1
- package/dist/commonjs/customHooks/crashHandler.js +4 -4
- package/dist/commonjs/helpers/index.d.ts +3 -0
- package/dist/commonjs/helpers/index.js +8 -6
- package/dist/commonjs/helpers/performanceSampler.d.ts +88 -0
- package/dist/commonjs/helpers/performanceSampler.js +1 -0
- package/dist/commonjs/helpers/remoteConfig.d.ts +6 -0
- package/dist/commonjs/helpers/remoteConfig.js +1 -1
- package/dist/commonjs/helpers/telemetry.js +1 -1
- package/dist/commonjs/i18n/locales/ar.json +1 -1
- package/dist/commonjs/i18n/locales/bn.json +1 -1
- package/dist/commonjs/i18n/locales/de.json +1 -1
- package/dist/commonjs/i18n/locales/en.json +1 -1
- package/dist/commonjs/i18n/locales/es.json +1 -1
- package/dist/commonjs/i18n/locales/fr.json +1 -1
- package/dist/commonjs/i18n/locales/gu.json +1 -1
- package/dist/commonjs/i18n/locales/hi.json +1 -1
- package/dist/commonjs/i18n/locales/id.json +1 -1
- package/dist/commonjs/i18n/locales/it.json +1 -1
- package/dist/commonjs/i18n/locales/ja.json +1 -1
- package/dist/commonjs/i18n/locales/kn.json +1 -1
- package/dist/commonjs/i18n/locales/ko.json +1 -1
- package/dist/commonjs/i18n/locales/ml.json +1 -1
- package/dist/commonjs/i18n/locales/mr.json +1 -1
- package/dist/commonjs/i18n/locales/nl.json +1 -1
- package/dist/commonjs/i18n/locales/pa.json +1 -1
- package/dist/commonjs/i18n/locales/pl.json +1 -1
- package/dist/commonjs/i18n/locales/pt.json +1 -1
- package/dist/commonjs/i18n/locales/ru.json +1 -1
- package/dist/commonjs/i18n/locales/ta.json +1 -1
- package/dist/commonjs/i18n/locales/te.json +1 -1
- package/dist/commonjs/i18n/locales/tr.json +1 -1
- package/dist/commonjs/i18n/locales/vi.json +1 -1
- package/dist/commonjs/i18n/locales/zh.json +1 -1
- package/dist/commonjs/index.d.ts +4 -2
- package/dist/commonjs/index.js +3 -3
- package/dist/commonjs/styles/index.js +1 -1
- package/dist/commonjs/types/enums.d.ts +1 -0
- package/dist/commonjs/types/enums.js +1 -1
- package/dist/commonjs/types/interfaces.d.ts +28 -0
- package/dist/esm/components/ConsoleLogCard.js +67 -61
- package/dist/esm/components/ErrorBoundary.js +10 -10
- package/dist/esm/components/Inspector/ConsoleTab.js +33 -28
- package/dist/esm/components/Inspector/FloatingCaptureWidget.js +22 -22
- package/dist/esm/components/Inspector/InspectorHeader.js +194 -186
- package/dist/esm/components/Inspector/MainScreen.js +61 -58
- package/dist/esm/components/Inspector/MediaGalleryTab.js +254 -157
- package/dist/esm/components/Inspector/NetworkDetail.js +62 -59
- package/dist/esm/components/Inspector/NetworkTab.js +39 -37
- package/dist/esm/components/Inspector/PerformanceTab.d.ts +2 -0
- package/dist/esm/components/Inspector/PerformanceTab.js +652 -0
- package/dist/esm/components/Inspector/SettingsPanel.js +407 -306
- package/dist/esm/components/Inspector/TabBar.js +4 -3
- package/dist/esm/components/LogCard.js +37 -34
- package/dist/esm/components/ModuleErrorBoundary.js +1 -1
- package/dist/esm/components/NetworkIcons.d.ts +9 -0
- package/dist/esm/components/NetworkIcons.js +48 -3
- package/dist/esm/constants/index.d.ts +1 -0
- package/dist/esm/constants/index.js +1 -1
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/crashHandler.d.ts +9 -1
- package/dist/esm/customHooks/crashHandler.js +6 -6
- package/dist/esm/helpers/index.d.ts +3 -0
- package/dist/esm/helpers/index.js +8 -6
- package/dist/esm/helpers/performanceSampler.d.ts +88 -0
- package/dist/esm/helpers/performanceSampler.js +1 -0
- package/dist/esm/helpers/remoteConfig.d.ts +6 -0
- package/dist/esm/helpers/remoteConfig.js +1 -1
- package/dist/esm/helpers/telemetry.js +1 -1
- package/dist/esm/i18n/locales/ar.json +1 -1
- package/dist/esm/i18n/locales/bn.json +1 -1
- package/dist/esm/i18n/locales/de.json +1 -1
- package/dist/esm/i18n/locales/en.json +1 -1
- package/dist/esm/i18n/locales/es.json +1 -1
- package/dist/esm/i18n/locales/fr.json +1 -1
- package/dist/esm/i18n/locales/gu.json +1 -1
- package/dist/esm/i18n/locales/hi.json +1 -1
- package/dist/esm/i18n/locales/id.json +1 -1
- package/dist/esm/i18n/locales/it.json +1 -1
- package/dist/esm/i18n/locales/ja.json +1 -1
- package/dist/esm/i18n/locales/kn.json +1 -1
- package/dist/esm/i18n/locales/ko.json +1 -1
- package/dist/esm/i18n/locales/ml.json +1 -1
- package/dist/esm/i18n/locales/mr.json +1 -1
- package/dist/esm/i18n/locales/nl.json +1 -1
- package/dist/esm/i18n/locales/pa.json +1 -1
- package/dist/esm/i18n/locales/pl.json +1 -1
- package/dist/esm/i18n/locales/pt.json +1 -1
- package/dist/esm/i18n/locales/ru.json +1 -1
- package/dist/esm/i18n/locales/ta.json +1 -1
- package/dist/esm/i18n/locales/te.json +1 -1
- package/dist/esm/i18n/locales/tr.json +1 -1
- package/dist/esm/i18n/locales/vi.json +1 -1
- package/dist/esm/i18n/locales/zh.json +1 -1
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.js +8 -8
- package/dist/esm/styles/index.js +1 -1
- package/dist/esm/types/enums.d.ts +1 -0
- package/dist/esm/types/enums.js +1 -1
- package/dist/esm/types/interfaces.d.ts +28 -0
- package/package.json +24 -1
|
@@ -1,202 +1,299 @@
|
|
|
1
|
-
import{useState as
|
|
2
|
-
`);
|
|
3
|
-
<
|
|
4
|
-
{
|
|
5
|
-
{
|
|
6
|
-
</
|
|
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={()=>
|
|
10
|
-
{
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
</
|
|
40
|
-
<B onPress={()=>
|
|
41
|
-
<
|
|
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
|
-
</
|
|
44
|
-
</
|
|
45
|
-
</
|
|
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={()=>
|
|
48
|
-
{
|
|
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
|
-
<
|
|
53
|
-
{
|
|
54
|
-
{
|
|
55
|
-
</
|
|
56
|
-
{
|
|
57
|
-
<
|
|
58
|
-
</
|
|
59
|
-
</
|
|
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
|
-
<
|
|
63
|
-
<
|
|
64
|
-
{
|
|
65
|
-
</
|
|
66
|
-
<
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
</
|
|
83
|
-
</
|
|
90
|
+
</T>
|
|
91
|
+
</T>
|
|
84
92
|
|
|
85
93
|
|
|
86
|
-
<
|
|
87
|
-
<B onPress={()=>
|
|
88
|
-
<
|
|
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={()=>
|
|
92
|
-
<
|
|
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={()=>
|
|
96
|
-
<
|
|
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
|
-
</
|
|
99
|
-
</
|
|
106
|
+
</T>
|
|
107
|
+
</G>};return<T style={o.container}>
|
|
100
108
|
|
|
101
|
-
<
|
|
102
|
-
<B onPress={()=>
|
|
103
|
-
<
|
|
104
|
-
<
|
|
105
|
-
{
|
|
106
|
-
</
|
|
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
|
-
<
|
|
110
|
-
<
|
|
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
|
-
</
|
|
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
|
-
<
|
|
116
|
-
<
|
|
117
|
-
{["all","
|
|
118
|
-
{
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
</
|
|
181
|
+
</T>
|
|
124
182
|
|
|
125
183
|
|
|
126
|
-
<
|
|
127
|
-
<B onPress={
|
|
128
|
-
<
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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&&<
|
|
148
|
-
<
|
|
149
|
-
<
|
|
150
|
-
{
|
|
151
|
-
</
|
|
152
|
-
</
|
|
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
|
-
<
|
|
155
|
-
{
|
|
156
|
-
<B onPress={
|
|
157
|
-
<
|
|
158
|
-
<
|
|
159
|
-
|
|
160
|
-
</
|
|
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={
|
|
164
|
-
<
|
|
165
|
-
<
|
|
166
|
-
|
|
167
|
-
</
|
|
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={
|
|
171
|
-
<
|
|
172
|
-
<
|
|
173
|
-
|
|
174
|
-
</
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
<
|
|
189
|
-
<
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
</
|
|
196
|
-
|
|
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
|
-
<
|
|
295
|
+
<Vt item={xe}visible={!!xe}onClose={()=>W(null)}onDelete={Ve}onConvertToGif={Qe}/>
|
|
200
296
|
|
|
201
|
-
|
|
202
|
-
|
|
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}});
|