react-native-inapp-inspector 1.1.13 → 1.1.15

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 (250) hide show
  1. package/README.md +9 -34
  2. package/dist/commonjs/assets/svgAssets.d.ts +3 -0
  3. package/dist/commonjs/assets/svgAssets.js +17 -0
  4. package/dist/commonjs/components/AnalyticsEventCard.d.ts +1 -14
  5. package/dist/commonjs/components/AnalyticsEventCard.js +120 -50
  6. package/dist/commonjs/components/AnalyticsGraph.d.ts +2 -6
  7. package/dist/commonjs/components/AnalyticsGraph.js +8 -8
  8. package/dist/commonjs/components/AnalyticsTabView.d.ts +15 -0
  9. package/dist/commonjs/components/AnalyticsTabView.js +157 -0
  10. package/dist/commonjs/components/AnimatedEntrance.d.ts +1 -1
  11. package/dist/commonjs/components/AnimatedEntrance.js +2 -2
  12. package/dist/commonjs/components/ApiDetailView.d.ts +22 -0
  13. package/dist/commonjs/components/ApiDetailView.js +304 -0
  14. package/dist/commonjs/components/ApisTabView.d.ts +33 -0
  15. package/dist/commonjs/components/ApisTabView.js +235 -0
  16. package/dist/commonjs/components/CodeSnippet.d.ts +1 -5
  17. package/dist/commonjs/components/CodeSnippet.js +34 -34
  18. package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -8
  19. package/dist/commonjs/components/ConsoleLogCard.js +262 -442
  20. package/dist/commonjs/components/ConsoleLogDetailView.d.ts +9 -0
  21. package/dist/commonjs/components/ConsoleLogDetailView.js +278 -0
  22. package/dist/commonjs/components/ConsoleLogsTabView.d.ts +24 -0
  23. package/dist/commonjs/components/ConsoleLogsTabView.js +354 -0
  24. package/dist/commonjs/components/DiffViewer.js +4 -2
  25. package/dist/commonjs/components/DomainHeader.js +66 -41
  26. package/dist/commonjs/components/EmptyState.d.ts +2 -2
  27. package/dist/commonjs/components/EmptyState.js +2 -2
  28. package/dist/commonjs/components/EndOfListFooter.d.ts +8 -0
  29. package/dist/commonjs/components/EndOfListFooter.js +90 -0
  30. package/dist/commonjs/components/ErrorBoundary.d.ts +5 -14
  31. package/dist/commonjs/components/ErrorBoundary.js +28 -28
  32. package/dist/commonjs/components/FloatingBubble.d.ts +14 -0
  33. package/dist/commonjs/components/FloatingBubble.js +75 -0
  34. package/dist/commonjs/components/HeadersSection.js +5 -3
  35. package/dist/commonjs/components/HighlightText.d.ts +1 -1
  36. package/dist/commonjs/components/HighlightText.js +5 -7
  37. package/dist/commonjs/components/Inspector/AnalyticsTab.d.ts +3 -0
  38. package/dist/commonjs/components/Inspector/AnalyticsTab.js +232 -0
  39. package/dist/commonjs/components/Inspector/ConsoleTab.d.ts +3 -0
  40. package/dist/commonjs/components/Inspector/ConsoleTab.js +410 -0
  41. package/dist/commonjs/components/Inspector/FabLauncher.d.ts +3 -0
  42. package/dist/commonjs/components/Inspector/FabLauncher.js +54 -0
  43. package/dist/commonjs/components/Inspector/InsightsDashboard.d.ts +3 -0
  44. package/dist/commonjs/components/Inspector/InsightsDashboard.js +619 -0
  45. package/dist/commonjs/components/Inspector/InspectorContext.d.ts +5 -0
  46. package/dist/commonjs/components/Inspector/InspectorContext.js +18 -0
  47. package/dist/commonjs/components/Inspector/InspectorHeader.d.ts +3 -0
  48. package/dist/commonjs/components/Inspector/InspectorHeader.js +452 -0
  49. package/dist/commonjs/components/Inspector/LogDetail.d.ts +3 -0
  50. package/dist/commonjs/components/Inspector/LogDetail.js +963 -0
  51. package/dist/commonjs/components/Inspector/MainScreen.d.ts +3 -0
  52. package/dist/commonjs/components/Inspector/MainScreen.js +68 -0
  53. package/dist/commonjs/components/Inspector/NavigationTracker.d.ts +3 -0
  54. package/dist/commonjs/components/Inspector/NavigationTracker.js +12 -0
  55. package/dist/commonjs/components/Inspector/NetworkDetail.d.ts +3 -0
  56. package/dist/commonjs/components/Inspector/NetworkDetail.js +405 -0
  57. package/dist/commonjs/components/Inspector/NetworkTab.d.ts +3 -0
  58. package/dist/commonjs/components/Inspector/NetworkTab.js +281 -0
  59. package/dist/commonjs/components/Inspector/ReduxTab.d.ts +3 -0
  60. package/dist/commonjs/components/Inspector/ReduxTab.js +75 -0
  61. package/dist/commonjs/components/Inspector/SettingsPanel.d.ts +3 -0
  62. package/dist/commonjs/components/Inspector/SettingsPanel.js +1476 -0
  63. package/dist/commonjs/components/Inspector/TabBar.d.ts +3 -0
  64. package/dist/commonjs/components/Inspector/TabBar.js +95 -0
  65. package/dist/commonjs/components/Inspector/WebViewTab.d.ts +3 -0
  66. package/dist/commonjs/components/Inspector/WebViewTab.js +757 -0
  67. package/dist/commonjs/components/InspectorHeader.d.ts +19 -0
  68. package/dist/commonjs/components/InspectorHeader.js +329 -0
  69. package/dist/commonjs/components/InspectorTabBar.d.ts +16 -0
  70. package/dist/commonjs/components/InspectorTabBar.js +90 -0
  71. package/dist/commonjs/components/JsonViewer.d.ts +4 -1
  72. package/dist/commonjs/components/JsonViewer.js +110 -171
  73. package/dist/commonjs/components/LogCard.js +109 -86
  74. package/dist/commonjs/components/MetaAccordion.d.ts +1 -10
  75. package/dist/commonjs/components/MetaAccordion.js +23 -21
  76. package/dist/commonjs/components/NavigationTracker.d.ts +7 -0
  77. package/dist/commonjs/components/NavigationTracker.js +76 -0
  78. package/dist/commonjs/components/NetworkIcons.d.ts +6 -0
  79. package/dist/commonjs/components/NetworkIcons.js +54 -8
  80. package/dist/commonjs/components/ReduxTabView.d.ts +9 -0
  81. package/dist/commonjs/components/ReduxTabView.js +56 -0
  82. package/dist/commonjs/components/ReduxTreeView.js +241 -200
  83. package/dist/commonjs/components/SegmentedTabs.d.ts +15 -0
  84. package/dist/commonjs/components/SegmentedTabs.js +52 -0
  85. package/dist/commonjs/components/SettingsView.d.ts +13 -0
  86. package/dist/commonjs/components/SettingsView.js +328 -0
  87. package/dist/commonjs/components/TouchableScale.d.ts +2 -2
  88. package/dist/commonjs/components/TouchableScale.js +2 -2
  89. package/dist/commonjs/components/TreeNode.js +2 -2
  90. package/dist/commonjs/constants/index.js +1 -12
  91. package/dist/commonjs/constants/version.d.ts +1 -1
  92. package/dist/commonjs/constants/version.js +1 -1
  93. package/dist/commonjs/customHooks/analyticsLogger.d.ts +8 -0
  94. package/dist/commonjs/customHooks/analyticsLogger.js +42 -1
  95. package/dist/commonjs/customHooks/consoleLogger.js +137 -13
  96. package/dist/commonjs/customHooks/networkLogger.d.ts +0 -1
  97. package/dist/commonjs/customHooks/networkLogger.js +0 -1
  98. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -9
  99. package/dist/commonjs/enums/index.d.ts +39 -0
  100. package/dist/commonjs/enums/index.js +50 -0
  101. package/dist/commonjs/helpers/index.d.ts +27 -1
  102. package/dist/commonjs/helpers/index.js +187 -12
  103. package/dist/commonjs/helpers/settingsStore.d.ts +2 -24
  104. package/dist/commonjs/i18n/en.json +144 -0
  105. package/dist/commonjs/i18n/index.d.ts +2 -0
  106. package/dist/commonjs/i18n/index.js +27 -0
  107. package/dist/commonjs/i18n/locales/en.json +314 -0
  108. package/dist/commonjs/index.d.ts +2 -3
  109. package/dist/commonjs/index.js +207 -4927
  110. package/dist/commonjs/styles/AppColors.d.ts +148 -0
  111. package/dist/commonjs/styles/AppColors.js +176 -0
  112. package/dist/commonjs/styles/common.d.ts +3 -0
  113. package/dist/commonjs/styles/common.js +201 -0
  114. package/dist/commonjs/styles/index.d.ts +219 -435
  115. package/dist/commonjs/styles/index.js +312 -488
  116. package/dist/commonjs/types/enums.d.ts +9 -0
  117. package/dist/commonjs/types/enums.js +4 -0
  118. package/dist/commonjs/types/index.d.ts +4 -111
  119. package/dist/commonjs/types/index.js +16 -0
  120. package/dist/commonjs/types/interfaces.d.ts +337 -0
  121. package/dist/commonjs/types/interfaces.js +2 -0
  122. package/dist/esm/assets/svgAssets.d.ts +3 -0
  123. package/dist/esm/assets/svgAssets.js +14 -0
  124. package/dist/esm/components/AnalyticsEventCard.d.ts +1 -14
  125. package/dist/esm/components/AnalyticsEventCard.js +118 -48
  126. package/dist/esm/components/AnalyticsGraph.d.ts +2 -6
  127. package/dist/esm/components/AnalyticsGraph.js +8 -8
  128. package/dist/esm/components/AnalyticsTabView.d.ts +15 -0
  129. package/dist/esm/components/AnalyticsTabView.js +151 -0
  130. package/dist/esm/components/AnimatedEntrance.d.ts +1 -1
  131. package/dist/esm/components/AnimatedEntrance.js +2 -2
  132. package/dist/esm/components/ApiDetailView.d.ts +22 -0
  133. package/dist/esm/components/ApiDetailView.js +264 -0
  134. package/dist/esm/components/ApisTabView.d.ts +33 -0
  135. package/dist/esm/components/ApisTabView.js +196 -0
  136. package/dist/esm/components/CodeSnippet.d.ts +1 -5
  137. package/dist/esm/components/CodeSnippet.js +34 -34
  138. package/dist/esm/components/ConsoleLogCard.d.ts +1 -8
  139. package/dist/esm/components/ConsoleLogCard.js +262 -409
  140. package/dist/esm/components/ConsoleLogDetailView.d.ts +9 -0
  141. package/dist/esm/components/ConsoleLogDetailView.js +271 -0
  142. package/dist/esm/components/ConsoleLogsTabView.d.ts +24 -0
  143. package/dist/esm/components/ConsoleLogsTabView.js +348 -0
  144. package/dist/esm/components/DiffViewer.js +4 -2
  145. package/dist/esm/components/DomainHeader.js +66 -41
  146. package/dist/esm/components/EmptyState.d.ts +2 -2
  147. package/dist/esm/components/EmptyState.js +2 -2
  148. package/dist/esm/components/EndOfListFooter.d.ts +8 -0
  149. package/dist/esm/components/EndOfListFooter.js +83 -0
  150. package/dist/esm/components/ErrorBoundary.d.ts +5 -14
  151. package/dist/esm/components/ErrorBoundary.js +29 -29
  152. package/dist/esm/components/FloatingBubble.d.ts +14 -0
  153. package/dist/esm/components/FloatingBubble.js +68 -0
  154. package/dist/esm/components/HeadersSection.js +5 -3
  155. package/dist/esm/components/HighlightText.d.ts +1 -1
  156. package/dist/esm/components/HighlightText.js +5 -7
  157. package/dist/esm/components/Inspector/AnalyticsTab.d.ts +3 -0
  158. package/dist/esm/components/Inspector/AnalyticsTab.js +194 -0
  159. package/dist/esm/components/Inspector/ConsoleTab.d.ts +3 -0
  160. package/dist/esm/components/Inspector/ConsoleTab.js +372 -0
  161. package/dist/esm/components/Inspector/FabLauncher.d.ts +3 -0
  162. package/dist/esm/components/Inspector/FabLauncher.js +49 -0
  163. package/dist/esm/components/Inspector/InsightsDashboard.d.ts +3 -0
  164. package/dist/esm/components/Inspector/InsightsDashboard.js +614 -0
  165. package/dist/esm/components/Inspector/InspectorContext.d.ts +5 -0
  166. package/dist/esm/components/Inspector/InspectorContext.js +13 -0
  167. package/dist/esm/components/Inspector/InspectorHeader.d.ts +3 -0
  168. package/dist/esm/components/Inspector/InspectorHeader.js +447 -0
  169. package/dist/esm/components/Inspector/LogDetail.d.ts +3 -0
  170. package/dist/esm/components/Inspector/LogDetail.js +925 -0
  171. package/dist/esm/components/Inspector/MainScreen.d.ts +3 -0
  172. package/dist/esm/components/Inspector/MainScreen.js +63 -0
  173. package/dist/esm/components/Inspector/NavigationTracker.d.ts +3 -0
  174. package/dist/esm/components/Inspector/NavigationTracker.js +10 -0
  175. package/dist/esm/components/Inspector/NetworkDetail.d.ts +3 -0
  176. package/dist/esm/components/Inspector/NetworkDetail.js +367 -0
  177. package/dist/esm/components/Inspector/NetworkTab.d.ts +3 -0
  178. package/dist/esm/components/Inspector/NetworkTab.js +243 -0
  179. package/dist/esm/components/Inspector/ReduxTab.d.ts +3 -0
  180. package/dist/esm/components/Inspector/ReduxTab.js +70 -0
  181. package/dist/esm/components/Inspector/SettingsPanel.d.ts +3 -0
  182. package/dist/esm/components/Inspector/SettingsPanel.js +1438 -0
  183. package/dist/esm/components/Inspector/TabBar.d.ts +3 -0
  184. package/dist/esm/components/Inspector/TabBar.js +90 -0
  185. package/dist/esm/components/Inspector/WebViewTab.d.ts +3 -0
  186. package/dist/esm/components/Inspector/WebViewTab.js +752 -0
  187. package/dist/esm/components/InspectorHeader.d.ts +19 -0
  188. package/dist/esm/components/InspectorHeader.js +323 -0
  189. package/dist/esm/components/InspectorTabBar.d.ts +16 -0
  190. package/dist/esm/components/InspectorTabBar.js +84 -0
  191. package/dist/esm/components/JsonViewer.d.ts +4 -1
  192. package/dist/esm/components/JsonViewer.js +111 -172
  193. package/dist/esm/components/LogCard.js +111 -88
  194. package/dist/esm/components/MetaAccordion.d.ts +1 -10
  195. package/dist/esm/components/MetaAccordion.js +23 -21
  196. package/dist/esm/components/NavigationTracker.d.ts +7 -0
  197. package/dist/esm/components/NavigationTracker.js +39 -0
  198. package/dist/esm/components/NetworkIcons.d.ts +6 -0
  199. package/dist/esm/components/NetworkIcons.js +46 -6
  200. package/dist/esm/components/ReduxTabView.d.ts +9 -0
  201. package/dist/esm/components/ReduxTabView.js +50 -0
  202. package/dist/esm/components/ReduxTreeView.js +243 -202
  203. package/dist/esm/components/SegmentedTabs.d.ts +15 -0
  204. package/dist/esm/components/SegmentedTabs.js +47 -0
  205. package/dist/esm/components/SettingsView.d.ts +13 -0
  206. package/dist/esm/components/SettingsView.js +321 -0
  207. package/dist/esm/components/TouchableScale.d.ts +2 -2
  208. package/dist/esm/components/TouchableScale.js +2 -2
  209. package/dist/esm/components/TreeNode.js +2 -2
  210. package/dist/esm/constants/index.js +1 -12
  211. package/dist/esm/constants/version.d.ts +1 -1
  212. package/dist/esm/constants/version.js +1 -1
  213. package/dist/esm/customHooks/analyticsLogger.d.ts +8 -0
  214. package/dist/esm/customHooks/analyticsLogger.js +37 -0
  215. package/dist/esm/customHooks/consoleLogger.js +137 -13
  216. package/dist/esm/customHooks/networkLogger.d.ts +0 -1
  217. package/dist/esm/customHooks/networkLogger.js +0 -1
  218. package/dist/esm/customHooks/reduxLogger.d.ts +2 -9
  219. package/dist/esm/enums/index.d.ts +39 -0
  220. package/dist/esm/enums/index.js +47 -0
  221. package/dist/esm/helpers/index.d.ts +27 -1
  222. package/dist/esm/helpers/index.js +180 -11
  223. package/dist/esm/helpers/settingsStore.d.ts +2 -24
  224. package/dist/esm/i18n/en.json +144 -0
  225. package/dist/esm/i18n/index.d.ts +2 -0
  226. package/dist/esm/i18n/index.js +22 -0
  227. package/dist/esm/i18n/locales/en.json +314 -0
  228. package/dist/esm/index.d.ts +2 -3
  229. package/dist/esm/index.js +207 -4923
  230. package/dist/esm/styles/AppColors.d.ts +148 -0
  231. package/dist/esm/styles/AppColors.js +176 -0
  232. package/dist/esm/styles/common.d.ts +3 -0
  233. package/dist/esm/styles/common.js +197 -0
  234. package/dist/esm/styles/index.d.ts +219 -435
  235. package/dist/esm/styles/index.js +312 -488
  236. package/dist/esm/types/enums.d.ts +9 -0
  237. package/dist/esm/types/enums.js +3 -0
  238. package/dist/esm/types/index.d.ts +4 -111
  239. package/dist/esm/types/index.js +2 -1
  240. package/dist/esm/types/interfaces.d.ts +337 -0
  241. package/dist/esm/types/interfaces.js +1 -0
  242. package/example/App.tsx +88 -1
  243. package/example/android/app/build.gradle +29 -1
  244. package/example/android/app/src/main/java/com/example/MainApplication.kt +25 -0
  245. package/example/android/build.gradle +31 -4
  246. package/example/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  247. package/example/android/gradle.properties +1 -0
  248. package/example/android/settings.gradle +20 -1
  249. package/example/package-lock.json +1 -1
  250. package/package.json +3 -1
@@ -45,6 +45,8 @@ const NetworkIcons_1 = require("./NetworkIcons");
45
45
  const JsonViewer_1 = __importDefault(require("./JsonViewer"));
46
46
  const DiffViewer_1 = __importDefault(require("./DiffViewer"));
47
47
  const TouchableScale_1 = __importDefault(require("./TouchableScale"));
48
+ const SegmentedTabs_1 = __importDefault(require("./SegmentedTabs"));
49
+ const CopyButton_1 = __importDefault(require("./CopyButton"));
48
50
  const helpers_1 = require("../helpers");
49
51
  const settingsStore_1 = require("../helpers/settingsStore");
50
52
  // Enable LayoutAnimation for Android
@@ -283,139 +285,192 @@ const ReduxTreeView = ({ state, actionHistory = [], lastActionMap = {}, search =
283
285
  const fieldsCount = typeof sliceData === 'object' && sliceData !== null
284
286
  ? Object.keys(sliceData).length
285
287
  : 1;
288
+ const sliceTabs = [
289
+ { key: 'live', label: 'Live State' },
290
+ ...(isPersisted
291
+ ? [{ key: 'persisted', label: `Persisted (${(0, helpers_1.getSize)(persistedData)})` }]
292
+ : []),
293
+ { key: 'metadata', label: 'Metadata' },
294
+ ];
286
295
  return (<react_native_1.View style={{ flex: 1 }}>
287
- {/* Non-scrollable header */}
288
- <react_native_1.View style={{ paddingHorizontal: 6, paddingTop: 4 }}>
289
- <react_native_1.View style={styles.apiLikeInfoBar}>
290
- <react_native_1.View style={styles.apiBadgeRow}>
296
+ {/* Detail info header bar */}
297
+ <react_native_1.View style={styles.apiLikeInfoBar}>
298
+ <react_native_1.View style={{
299
+ flexDirection: 'row',
300
+ alignItems: 'center',
301
+ justifyContent: 'space-between',
302
+ marginBottom: 8,
303
+ }}>
304
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
291
305
  <react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: AppColors_1.AppColors.purple }]}>
292
306
  <react_native_1.Text style={styles.apiMethodBadgeText}>REDUX</react_native_1.Text>
293
307
  </react_native_1.View>
294
- <react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: AppColors_1.AppColors.purpleShade50, borderWidth: 1, borderColor: AppColors_1.AppColors.purple + '30' }]}>
295
- <react_native_1.Text style={[styles.apiMethodBadgeText, { color: AppColors_1.AppColors.purple }]}>SLICE</react_native_1.Text>
308
+ <react_native_1.View style={[
309
+ styles.apiMethodBadge,
310
+ {
311
+ backgroundColor: `${AppColors_1.AppColors.brandPurple}18`,
312
+ borderWidth: 1,
313
+ borderColor: `${AppColors_1.AppColors.brandPurple}40`,
314
+ },
315
+ ]}>
316
+ <react_native_1.Text style={[styles.apiMethodBadgeText, { color: AppColors_1.AppColors.brandPurple }]}>
317
+ SLICE
318
+ </react_native_1.Text>
296
319
  </react_native_1.View>
297
- {isPersisted && (<react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: '#10B981' }]}>
320
+ {isPersisted && (<react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: AppColors_1.AppColors.emerald500 }]}>
298
321
  <react_native_1.Text style={styles.apiMethodBadgeText}>PERSISTED</react_native_1.Text>
299
322
  </react_native_1.View>)}
300
323
  <react_native_1.View style={styles.apiChip}>
301
324
  <react_native_1.Text style={styles.apiChipText}>{(0, helpers_1.getSize)(sliceData)}</react_native_1.Text>
302
325
  </react_native_1.View>
303
326
  <react_native_1.View style={styles.apiChip}>
304
- <react_native_1.Text style={styles.apiChipText}>{fieldsCount} {fieldsCount === 1 ? 'field' : 'fields'}</react_native_1.Text>
327
+ <react_native_1.Text style={styles.apiChipText}>
328
+ {fieldsCount} {fieldsCount === 1 ? 'field' : 'fields'}
329
+ </react_native_1.Text>
305
330
  </react_native_1.View>
306
331
  </react_native_1.View>
307
332
 
308
- <react_native_1.Text style={styles.apiTitleText} selectable={true}>{activeSliceKey}</react_native_1.Text>
333
+ <CopyButton_1.default value={JSON.stringify(sliceDetailTab === 'live' ? sliceData : persistedData, null, 2)} label={`Slice '${activeSliceKey}'`}/>
334
+ </react_native_1.View>
309
335
 
310
- <react_native_1.View style={styles.apiMetaRow}>
311
- <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={10}/>
312
- <react_native_1.Text style={styles.apiMetaText}>
313
- Last updated: {lastActionMap[activeSliceKey] ? lastActionMap[activeSliceKey].timestamp : 'Initial'}
314
- </react_native_1.Text>
315
- </react_native_1.View>
336
+ <react_native_1.Text style={styles.apiTitleText} selectable={true}>
337
+ {activeSliceKey}
338
+ </react_native_1.Text>
339
+
340
+ <react_native_1.View style={styles.apiMetaRow}>
341
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={11}/>
342
+ <react_native_1.Text style={styles.apiMetaText}>
343
+ Last updated: {lastActionMap[activeSliceKey] ? lastActionMap[activeSliceKey].timestamp : 'Initial'}
344
+ </react_native_1.Text>
316
345
  </react_native_1.View>
317
346
  </react_native_1.View>
318
347
 
319
- {/* Segment Control */}
320
- <react_native_1.View style={{
348
+ {/* Back button row + sub-tabs */}
349
+ <react_native_1.View style={{ paddingHorizontal: 12, paddingTop: 8, paddingBottom: 4 }}>
350
+ <react_native_1.View style={{
321
351
  flexDirection: 'row',
322
- backgroundColor: AppColors_1.AppColors.grayBackground,
323
- borderRadius: 10,
324
- padding: 3,
325
- marginHorizontal: 6,
326
- marginBottom: 10,
327
- marginTop: 6,
328
- borderWidth: 1,
329
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
352
+ alignItems: 'center',
353
+ justifyContent: 'space-between',
354
+ marginBottom: 8,
330
355
  }}>
331
- {(isPersisted ? ['live', 'persisted'] : ['live']).map(tab => {
332
- const isActive = sliceDetailTab === tab;
333
- const getLabel = () => {
334
- if (tab === 'live')
335
- return 'Live State';
336
- return `Persisted (${(0, helpers_1.getSize)(persistedData)})`;
337
- };
338
- const getIcon = () => {
339
- const iconColor = isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText;
340
- if (tab === 'live')
341
- return <NetworkIcons_1.LayersIcon color={iconColor} size={11}/>;
342
- return <NetworkIcons_1.CalendarIcon color={iconColor} size={11}/>;
343
- };
344
- return (<react_native_1.Pressable key={tab} onPress={() => {
345
- animateLayout();
346
- setSliceDetailTab(tab);
347
- }} style={{
348
- flex: 1,
349
- paddingVertical: 6,
350
- flexDirection: 'row',
351
- alignItems: 'center',
352
- justifyContent: 'center',
353
- borderRadius: 8,
354
- backgroundColor: isActive ? AppColors_1.AppColors.purple : 'transparent',
355
- gap: 4,
356
- }}>
357
- {getIcon()}
358
- <react_native_1.Text style={{
359
- fontFamily: AppFonts_1.AppFonts.interBold,
360
- fontSize: 10,
361
- color: isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText,
362
- }}>
363
- {getLabel()}
364
- </react_native_1.Text>
365
- </react_native_1.Pressable>);
366
- })}
367
- </react_native_1.View>
368
-
369
- {/* Scrollable Tab Content */}
370
- <react_native_1.View style={{ flex: 1, paddingHorizontal: 6 }}>
371
- {/* Back button + controls */}
372
- <react_native_1.View style={styles.contentDetailSubHeader}>
373
356
  <TouchableScale_1.default onPress={handleGoBackSlice} style={styles.backBtn} hitSlop={12}>
374
- <BackChevronIcon color={AppColors_1.AppColors.purple} size={11}/>
357
+ <BackChevronIcon color={AppColors_1.AppColors.purple} size={12}/>
375
358
  <react_native_1.Text style={styles.backBtnText}>State Slices</react_native_1.Text>
376
359
  </TouchableScale_1.default>
377
360
 
378
- <react_native_1.View style={styles.detailHeaderActions}>
379
- {isPersisted && sliceDetailTab === 'persisted' && (<TouchableScale_1.default onPress={handleClearPersistence} style={[styles.detailHeaderBtn, { marginRight: 8 }]} hitSlop={8}>
380
- <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={14}/>
381
- </TouchableScale_1.default>)}
361
+ {isPersisted && sliceDetailTab === 'persisted' && (<TouchableScale_1.default onPress={handleClearPersistence} style={[styles.detailHeaderBtn, { borderColor: `${AppColors_1.AppColors.errorColor}40` }]} hitSlop={8}>
362
+ <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={14}/>
363
+ </TouchableScale_1.default>)}
364
+ </react_native_1.View>
382
365
 
383
- <TouchableScale_1.default onPress={() => {
366
+ <SegmentedTabs_1.default tabs={sliceTabs} activeKey={sliceDetailTab} onChange={key => {
384
367
  animateLayout();
385
- setSliceForceOpen(prev => (prev === true ? false : prev === false ? undefined : true));
386
- }} style={styles.detailHeaderBtn} hitSlop={8}>
387
- <NetworkIcons_1.ExpandCollapseIcon expanded={sliceForceOpen !== false} color={AppColors_1.AppColors.purple} size={14}/>
388
- </TouchableScale_1.default>
368
+ setSliceDetailTab(key);
369
+ }}/>
370
+ </react_native_1.View>
389
371
 
390
- <TouchableScale_1.default onPress={() => {
391
- const dataToCopy = sliceDetailTab === 'live' ? sliceData : persistedData;
392
- (0, helpers_1.copyToClipboard)(dataToCopy, `Redux Slice '${activeSliceKey}' (${sliceDetailTab})`);
393
- }} style={styles.detailHeaderBtn} hitSlop={8}>
394
- <NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.purple} size={14}/>
395
- </TouchableScale_1.default>
372
+ {/* Search row (for live/persisted tabs) */}
373
+ {sliceDetailTab !== 'metadata' && (<react_native_1.View style={{ paddingHorizontal: 12, paddingTop: 4, paddingBottom: 4 }}>
374
+ <react_native_1.View style={{
375
+ flexDirection: 'row',
376
+ alignItems: 'center',
377
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
378
+ borderRadius: 8,
379
+ paddingHorizontal: 10,
380
+ borderWidth: 1,
381
+ borderColor: AppColors_1.AppColors.dividerColor,
382
+ height: 36,
383
+ }}>
384
+ <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
385
+ <react_native_1.TextInput placeholder="Search in slice keys or values..." placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={onSearchChange} style={{
386
+ flex: 1,
387
+ fontFamily: AppFonts_1.AppFonts.interRegular,
388
+ fontSize: 12,
389
+ color: AppColors_1.AppColors.grayTextStrong,
390
+ paddingHorizontal: 8,
391
+ paddingVertical: 0,
392
+ }} autoCorrect={false} autoCapitalize="none"/>
393
+ {search.length > 0 && (<react_native_1.Pressable onPress={() => onSearchChange?.('')} hitSlop={10}>
394
+ <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={13}/>
395
+ </react_native_1.Pressable>)}
396
396
  </react_native_1.View>
397
- </react_native_1.View>
397
+ </react_native_1.View>)}
398
398
 
399
- <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ paddingBottom: 24 }} showsVerticalScrollIndicator={true}>
400
- <react_native_1.View style={{ padding: 12 }}>
401
- <JsonViewer_1.default data={sliceDetailTab === 'live' ? sliceData : (persistedData ?? 'No persisted data')} search={search} forceOpen={sliceForceOpen !== undefined ? sliceForceOpen : (isSearching ? true : undefined)} fullHeight={true}/>
402
- </react_native_1.View>
403
- </react_native_1.ScrollView>
404
- </react_native_1.View>
399
+ {/* Scrollable Tab Content */}
400
+ <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ paddingHorizontal: 12, paddingTop: 6, paddingBottom: 28, flexGrow: 1 }} showsVerticalScrollIndicator={true} keyboardShouldPersistTaps="handled">
401
+ {sliceDetailTab === 'metadata' ? (<react_native_1.View style={{
402
+ backgroundColor: AppColors_1.AppColors.primaryLight,
403
+ borderRadius: 10,
404
+ borderWidth: 1,
405
+ borderColor: AppColors_1.AppColors.dividerColor,
406
+ overflow: 'hidden',
407
+ paddingHorizontal: 12,
408
+ paddingVertical: 4,
409
+ }}>
410
+ {[
411
+ { label: 'Slice Name', value: activeSliceKey },
412
+ { label: 'Fields Count', value: `${fieldsCount} root keys` },
413
+ { label: 'State Size', value: (0, helpers_1.getSize)(sliceData) },
414
+ {
415
+ label: 'Persistence',
416
+ value: isPersisted ? `Persisted (${(0, helpers_1.getSize)(persistedData)})` : 'Not Persisted',
417
+ },
418
+ {
419
+ label: 'Last Dispatched Action',
420
+ value: lastActionMap[activeSliceKey] ? lastActionMap[activeSliceKey].type : 'None',
421
+ },
422
+ {
423
+ label: 'Last Updated At',
424
+ value: lastActionMap[activeSliceKey] ? lastActionMap[activeSliceKey].timestamp : 'Initial',
425
+ },
426
+ ].map((row, rIdx) => (<react_native_1.View key={rIdx} style={{
427
+ flexDirection: 'row',
428
+ justifyContent: 'space-between',
429
+ alignItems: 'center',
430
+ paddingVertical: 9,
431
+ borderBottomWidth: rIdx < 5 ? 1 : 0,
432
+ borderBottomColor: AppColors_1.AppColors.grayBorderSecondary,
433
+ }}>
434
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interMedium, fontSize: 11.5, color: AppColors_1.AppColors.grayTextWeak }}>
435
+ {row.label}
436
+ </react_native_1.Text>
437
+ <react_native_1.Text selectable style={{
438
+ fontFamily: AppFonts_1.AppFonts.interBold,
439
+ fontSize: 11.5,
440
+ color: AppColors_1.AppColors.primaryBlack,
441
+ maxWidth: '60%',
442
+ textAlign: 'right',
443
+ }}>
444
+ {row.value}
445
+ </react_native_1.Text>
446
+ </react_native_1.View>))}
447
+ </react_native_1.View>) : (<JsonViewer_1.default data={sliceDetailTab === 'live' ? sliceData : (persistedData ?? 'No persisted data')} search={search} forceOpen={sliceForceOpen !== undefined ? sliceForceOpen : (isSearching ? true : undefined)} fullHeight={true}/>)}
448
+ </react_native_1.ScrollView>
405
449
  </react_native_1.View>);
406
450
  }
407
451
  // ── Render Detail View: Timeline Action ──
408
452
  if (activeTab === 'timeline' && selectedAction !== null) {
409
453
  const affectedSlices = selectedAction.affectedSlices || [];
454
+ const actionTabs = [
455
+ { key: 'payload', label: 'Payload' },
456
+ { key: 'diff', label: 'Diff Changes' },
457
+ { key: 'state', label: 'Snapshot' },
458
+ { key: 'metadata', label: 'Metadata' },
459
+ ];
410
460
  return (<react_native_1.View style={{ flex: 1 }}>
411
- {/* Non-scrollable header */}
412
- <react_native_1.View style={{ paddingHorizontal: 6, paddingTop: 4 }}>
413
- <react_native_1.View style={styles.apiLikeInfoBar}>
414
- <react_native_1.View style={styles.apiBadgeRow}>
461
+ {/* Detail info header bar */}
462
+ <react_native_1.View style={styles.apiLikeInfoBar}>
463
+ <react_native_1.View style={{
464
+ flexDirection: 'row',
465
+ alignItems: 'center',
466
+ justifyContent: 'space-between',
467
+ marginBottom: 8,
468
+ }}>
469
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
415
470
  <react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: AppColors_1.AppColors.purple }]}>
416
471
  <react_native_1.Text style={styles.apiMethodBadgeText}>REDUX</react_native_1.Text>
417
472
  </react_native_1.View>
418
- <react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: '#F59E0B' }]}>
473
+ <react_native_1.View style={[styles.apiMethodBadge, { backgroundColor: AppColors_1.AppColors.amber500 }]}>
419
474
  <react_native_1.Text style={styles.apiMethodBadgeText}>ACTION</react_native_1.Text>
420
475
  </react_native_1.View>
421
476
  <react_native_1.View style={styles.apiChip}>
@@ -426,119 +481,105 @@ const ReduxTreeView = ({ state, actionHistory = [], lastActionMap = {}, search =
426
481
  </react_native_1.View>
427
482
  </react_native_1.View>
428
483
 
429
- <react_native_1.Text style={styles.apiTitleText} selectable={true}>{selectedAction.type}</react_native_1.Text>
484
+ <CopyButton_1.default value={JSON.stringify(actionSubTab === 'payload'
485
+ ? selectedAction.payload
486
+ : actionSubTab === 'diff'
487
+ ? { prev: selectedAction.prevState, next: selectedAction.nextState }
488
+ : selectedAction.nextState, null, 2)} label={actionSubTab === 'payload' ? 'Action Payload' : 'State Snapshot'}/>
489
+ </react_native_1.View>
430
490
 
431
- <react_native_1.View style={styles.apiMetaRow}>
432
- <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={10}/>
433
- <react_native_1.Text style={styles.apiMetaText}>Dispatched: {selectedAction.timestamp}</react_native_1.Text>
434
- </react_native_1.View>
491
+ <react_native_1.Text style={styles.apiTitleText} selectable={true}>
492
+ {selectedAction.type}
493
+ </react_native_1.Text>
494
+
495
+ <react_native_1.View style={styles.apiMetaRow}>
496
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={11}/>
497
+ <react_native_1.Text style={styles.apiMetaText}>
498
+ Dispatched: {selectedAction.timestamp}
499
+ </react_native_1.Text>
435
500
  </react_native_1.View>
436
- </react_native_1.View>
437
501
 
438
- {/* Affected Slices Tags list */}
439
- {affectedSlices.length > 0 && (<react_native_1.View style={styles.detailAffectedTags}>
440
- <react_native_1.Text style={styles.affectedTagsLabel}>AFFECTED SLICES:</react_native_1.Text>
441
- <react_native_1.View style={styles.detailTagsList}>
442
- {affectedSlices.map(slice => (<react_native_1.View key={slice} style={styles.sliceTag}>
443
- <react_native_1.Text style={styles.sliceTagText}>{slice}</react_native_1.Text>
444
- </react_native_1.View>))}
445
- </react_native_1.View>
446
- </react_native_1.View>)}
502
+ {/* Affected Slices Tags list */}
503
+ {affectedSlices.length > 0 && (<react_native_1.View style={[styles.detailAffectedTags, { marginTop: 6, paddingHorizontal: 0, paddingBottom: 0 }]}>
504
+ <react_native_1.Text style={styles.affectedTagsLabel}>AFFECTED SLICES:</react_native_1.Text>
505
+ <react_native_1.View style={styles.detailTagsList}>
506
+ {affectedSlices.map(slice => (<react_native_1.View key={slice} style={styles.sliceTag}>
507
+ <react_native_1.Text style={styles.sliceTagText}>{slice}</react_native_1.Text>
508
+ </react_native_1.View>))}
509
+ </react_native_1.View>
510
+ </react_native_1.View>)}
511
+ </react_native_1.View>
447
512
 
448
- {/* Segment Control */}
449
- <react_native_1.View style={{
513
+ {/* Back button row + sub-tabs */}
514
+ <react_native_1.View style={{ paddingHorizontal: 12, paddingTop: 8, paddingBottom: 4 }}>
515
+ <react_native_1.View style={{
450
516
  flexDirection: 'row',
451
- backgroundColor: AppColors_1.AppColors.grayBackground,
452
- borderRadius: 10,
453
- padding: 3,
454
- marginHorizontal: 6,
455
- marginBottom: 10,
456
- marginTop: 6,
457
- borderWidth: 1,
458
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
517
+ alignItems: 'center',
518
+ justifyContent: 'space-between',
519
+ marginBottom: 8,
459
520
  }}>
460
- {['payload', 'diff', 'state'].map(tab => {
461
- const isActive = actionSubTab === tab;
462
- const getLabel = () => {
463
- if (tab === 'payload')
464
- return 'Payload';
465
- if (tab === 'diff')
466
- return 'Diff Changes';
467
- return 'Snapshot';
468
- };
469
- const getIcon = () => {
470
- const iconColor = isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText;
471
- if (tab === 'payload')
472
- return <NetworkIcons_1.RequestIcon color={iconColor} size={11}/>;
473
- if (tab === 'diff')
474
- return <NetworkIcons_1.DiffIcon color={iconColor} size={11}/>;
475
- return <NetworkIcons_1.LayersIcon color={iconColor} size={11}/>;
476
- };
477
- return (<react_native_1.Pressable key={tab} onPress={() => {
478
- animateLayout();
479
- setActionSubTab(tab);
480
- }} style={{
481
- flex: 1,
482
- paddingVertical: 6,
483
- flexDirection: 'row',
484
- alignItems: 'center',
485
- justifyContent: 'center',
486
- borderRadius: 8,
487
- backgroundColor: isActive ? AppColors_1.AppColors.purple : 'transparent',
488
- gap: 4,
489
- }}>
490
- {getIcon()}
491
- <react_native_1.Text style={{
492
- fontFamily: AppFonts_1.AppFonts.interBold,
493
- fontSize: 10,
494
- color: isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText,
495
- }}>
496
- {getLabel()}
497
- </react_native_1.Text>
498
- </react_native_1.Pressable>);
499
- })}
500
- </react_native_1.View>
501
-
502
- {/* Scrollable Tab Content */}
503
- <react_native_1.View style={{ flex: 1, paddingHorizontal: 6 }}>
504
- {/* Back button + controls */}
505
- <react_native_1.View style={styles.contentDetailSubHeader}>
506
521
  <TouchableScale_1.default onPress={handleGoBackAction} style={styles.backBtn} hitSlop={12}>
507
- <BackChevronIcon color={AppColors_1.AppColors.purple} size={11}/>
508
- <react_native_1.Text style={styles.backBtnText}>Actions</react_native_1.Text>
522
+ <BackChevronIcon color={AppColors_1.AppColors.purple} size={12}/>
523
+ <react_native_1.Text style={styles.backBtnText}>Actions Timeline</react_native_1.Text>
509
524
  </TouchableScale_1.default>
525
+ </react_native_1.View>
510
526
 
511
- {(actionSubTab === 'payload' || actionSubTab === 'state') && (<react_native_1.View style={styles.detailHeaderActions}>
512
- <TouchableScale_1.default onPress={() => {
513
- animateLayout();
514
- setActionForceOpen(prev => (prev === true ? false : prev === false ? undefined : true));
515
- }} style={styles.detailHeaderBtn} hitSlop={8}>
516
- <NetworkIcons_1.ExpandCollapseIcon expanded={actionForceOpen !== false} color={AppColors_1.AppColors.purple} size={14}/>
517
- </TouchableScale_1.default>
527
+ <SegmentedTabs_1.default tabs={actionTabs} activeKey={actionSubTab} onChange={key => {
528
+ animateLayout();
529
+ setActionSubTab(key);
530
+ }}/>
531
+ </react_native_1.View>
518
532
 
519
- <TouchableScale_1.default onPress={() => {
520
- const dataToCopy = actionSubTab === 'payload' ? selectedAction.payload : selectedAction.nextState;
521
- (0, helpers_1.copyToClipboard)(dataToCopy, actionSubTab === 'payload' ? 'Action payload' : 'State snapshot');
522
- }} style={styles.detailHeaderBtn} hitSlop={8}>
523
- <NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.purple} size={14}/>
524
- </TouchableScale_1.default>
525
- </react_native_1.View>)}
526
- </react_native_1.View>
533
+ {/* Scrollable Tab Content */}
534
+ <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ paddingHorizontal: 12, paddingTop: 6, paddingBottom: 28, flexGrow: 1 }} showsVerticalScrollIndicator={true} keyboardShouldPersistTaps="handled">
535
+ {actionSubTab === 'payload' && (<JsonViewer_1.default data={selectedAction.payload ?? 'No payload data'} wrap forceOpen={actionForceOpen !== undefined ? actionForceOpen : undefined} fullHeight={true}/>)}
527
536
 
528
- <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ paddingBottom: 24 }} showsVerticalScrollIndicator={true}>
529
- {actionSubTab === 'payload' && (<react_native_1.View style={{ padding: 12 }}>
530
- <JsonViewer_1.default data={selectedAction.payload ?? 'No payload data'} wrap forceOpen={actionForceOpen !== undefined ? actionForceOpen : undefined} fullHeight={true}/>
531
- </react_native_1.View>)}
537
+ {actionSubTab === 'diff' && (<DiffViewer_1.default oldData={selectedAction.prevState} newData={selectedAction.nextState}/>)}
532
538
 
533
- {actionSubTab === 'diff' && (<react_native_1.View style={{ padding: 12 }}>
534
- <DiffViewer_1.default oldData={selectedAction.prevState} newData={selectedAction.nextState}/>
535
- </react_native_1.View>)}
539
+ {actionSubTab === 'state' && (<JsonViewer_1.default data={selectedAction.nextState} wrap forceOpen={actionForceOpen !== undefined ? actionForceOpen : undefined} fullHeight={true}/>)}
536
540
 
537
- {actionSubTab === 'state' && (<react_native_1.View style={{ padding: 12 }}>
538
- <JsonViewer_1.default data={selectedAction.nextState} wrap forceOpen={actionForceOpen !== undefined ? actionForceOpen : undefined} fullHeight={true}/>
539
- </react_native_1.View>)}
540
- </react_native_1.ScrollView>
541
- </react_native_1.View>
541
+ {actionSubTab === 'metadata' && (<react_native_1.View style={{
542
+ backgroundColor: AppColors_1.AppColors.primaryLight,
543
+ borderRadius: 10,
544
+ borderWidth: 1,
545
+ borderColor: AppColors_1.AppColors.dividerColor,
546
+ overflow: 'hidden',
547
+ paddingHorizontal: 12,
548
+ paddingVertical: 4,
549
+ }}>
550
+ {[
551
+ { label: 'Action Type', value: selectedAction.type },
552
+ { label: 'Action ID', value: `#${selectedAction.id}` },
553
+ { label: 'Dispatched At', value: selectedAction.timestamp },
554
+ { label: 'Payload Size', value: (0, helpers_1.getSize)(selectedAction.payload) },
555
+ { label: 'Snapshot Size', value: (0, helpers_1.getSize)(selectedAction.nextState) },
556
+ {
557
+ label: 'Affected Slices',
558
+ value: affectedSlices.length > 0 ? affectedSlices.join(', ') : 'None',
559
+ },
560
+ ].map((row, rIdx) => (<react_native_1.View key={rIdx} style={{
561
+ flexDirection: 'row',
562
+ justifyContent: 'space-between',
563
+ alignItems: 'center',
564
+ paddingVertical: 9,
565
+ borderBottomWidth: rIdx < 5 ? 1 : 0,
566
+ borderBottomColor: AppColors_1.AppColors.grayBorderSecondary,
567
+ }}>
568
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interMedium, fontSize: 11.5, color: AppColors_1.AppColors.grayTextWeak }}>
569
+ {row.label}
570
+ </react_native_1.Text>
571
+ <react_native_1.Text selectable style={{
572
+ fontFamily: AppFonts_1.AppFonts.interBold,
573
+ fontSize: 11.5,
574
+ color: AppColors_1.AppColors.primaryBlack,
575
+ maxWidth: '60%',
576
+ textAlign: 'right',
577
+ }}>
578
+ {row.value}
579
+ </react_native_1.Text>
580
+ </react_native_1.View>))}
581
+ </react_native_1.View>)}
582
+ </react_native_1.ScrollView>
542
583
  </react_native_1.View>);
543
584
  }
544
585
  // ── Render List Views (Default) ──
@@ -676,7 +717,7 @@ const ReduxTreeView = ({ state, actionHistory = [], lastActionMap = {}, search =
676
717
  ? 'No actions match your search.'
677
718
  : 'No actions dispatched yet. Trigger an action in the app to populate history.'}
678
719
  </react_native_1.Text>
679
- </react_native_1.View>) : (filteredActionHistory.map((action, index) => {
720
+ </react_native_1.View>) : (filteredActionHistory.map(action => {
680
721
  const id = action.id;
681
722
  const affectedSlices = action.affectedSlices || [];
682
723
  return (<TouchableScale_1.default key={id} onPress={() => {
@@ -1120,7 +1161,7 @@ const styles = react_native_1.StyleSheet.create({
1120
1161
  color: AppColors_1.AppColors.grayText,
1121
1162
  },
1122
1163
  subTabPillTextActive: {
1123
- color: '#FFFFFF',
1164
+ color: AppColors_1.AppColors.white,
1124
1165
  fontFamily: AppFonts_1.AppFonts.interBold,
1125
1166
  },
1126
1167
  detailScrollContent: {
@@ -1170,16 +1211,16 @@ const styles = react_native_1.StyleSheet.create({
1170
1211
  apiMethodBadgeText: {
1171
1212
  fontFamily: AppFonts_1.AppFonts.interBold,
1172
1213
  fontSize: 9.5,
1173
- color: '#FFFFFF',
1214
+ color: AppColors_1.AppColors.white,
1174
1215
  letterSpacing: 0.5,
1175
1216
  },
1176
1217
  apiChip: {
1177
1218
  paddingHorizontal: 7,
1178
1219
  paddingVertical: 2,
1179
1220
  borderRadius: 4,
1180
- backgroundColor: 'rgba(104,75,155,0.06)',
1221
+ backgroundColor: `${AppColors_1.AppColors.purple}0F`,
1181
1222
  borderWidth: 1,
1182
- borderColor: 'rgba(104,75,155,0.15)',
1223
+ borderColor: `${AppColors_1.AppColors.purple}26`,
1183
1224
  alignItems: 'center',
1184
1225
  justifyContent: 'center',
1185
1226
  },
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { ViewStyle } from 'react-native';
3
+ export interface SegmentedTab {
4
+ key: string;
5
+ label: string;
6
+ icon?: (isActive: boolean) => React.ReactNode;
7
+ }
8
+ interface SegmentedTabsProps {
9
+ tabs: SegmentedTab[];
10
+ activeKey: string;
11
+ onChange: (key: string) => void;
12
+ style?: ViewStyle | ViewStyle[];
13
+ }
14
+ declare const SegmentedTabs: ({ tabs, activeKey, onChange, style }: SegmentedTabsProps) => React.JSX.Element;
15
+ export default SegmentedTabs;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const react_native_1 = require("react-native");
8
+ const AppColors_1 = require("../styles/AppColors");
9
+ const AppFonts_1 = require("../styles/AppFonts");
10
+ const SegmentedTabs = ({ tabs, activeKey, onChange, style }) => (<react_native_1.View style={[
11
+ {
12
+ flexDirection: 'row',
13
+ borderRadius: 8,
14
+ overflow: 'hidden',
15
+ borderWidth: 1,
16
+ borderColor: AppColors_1.AppColors.dividerColor,
17
+ backgroundColor: AppColors_1.AppColors.primaryLight,
18
+ },
19
+ style,
20
+ ]}>
21
+ {tabs.map((tab, index) => {
22
+ const isActive = activeKey === tab.key;
23
+ return (<react_native_1.Pressable key={tab.key} onPress={() => onChange(tab.key)} style={{
24
+ flex: 1,
25
+ paddingVertical: 8,
26
+ paddingHorizontal: 8,
27
+ backgroundColor: isActive
28
+ ? AppColors_1.AppColors.brandPurple
29
+ : AppColors_1.AppColors.primaryLight,
30
+ borderRightWidth: index < tabs.length - 1 ? 1 : 0,
31
+ borderRightColor: AppColors_1.AppColors.dividerColor,
32
+ alignItems: 'center',
33
+ justifyContent: 'center',
34
+ gap: 4,
35
+ flexDirection: 'row',
36
+ }}>
37
+ {tab.icon ? tab.icon(isActive) : null}
38
+ <react_native_1.Text style={{
39
+ fontFamily: AppFonts_1.AppFonts.interBold,
40
+ fontSize: 10,
41
+ color: isActive
42
+ ? AppColors_1.AppColors.white
43
+ : AppColors_1.AppColors.grayTextWeak,
44
+ textTransform: 'capitalize',
45
+ letterSpacing: 0.3,
46
+ }}>
47
+ {tab.label}
48
+ </react_native_1.Text>
49
+ </react_native_1.Pressable>);
50
+ })}
51
+ </react_native_1.View>);
52
+ exports.default = SegmentedTabs;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { ActiveTab } from '../types';
3
+ interface SettingsViewProps {
4
+ headerTopPadding: number;
5
+ activeTab?: ActiveTab;
6
+ defaultTab: ActiveTab;
7
+ tabVisibility: Record<string, boolean>;
8
+ onCloseSettings: () => void;
9
+ onUpdateTabVisibility: (key: ActiveTab, val: boolean) => void;
10
+ onSetDefaultTab: (key: ActiveTab) => void;
11
+ }
12
+ export declare const SettingsView: React.FC<SettingsViewProps>;
13
+ export default SettingsView;