rn-backstage 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +41 -19
  2. package/lib/commonjs/Backstage.js +42 -31
  3. package/lib/commonjs/Backstage.js.map +1 -1
  4. package/lib/commonjs/ThemeContext.js +43 -0
  5. package/lib/commonjs/ThemeContext.js.map +1 -0
  6. package/lib/commonjs/components/BackstagePanel.js +38 -16
  7. package/lib/commonjs/components/BackstagePanel.js.map +1 -1
  8. package/lib/commonjs/components/FlagsTab.js +256 -0
  9. package/lib/commonjs/components/FlagsTab.js.map +1 -0
  10. package/lib/commonjs/components/FloatingPill.js +4 -2
  11. package/lib/commonjs/components/FloatingPill.js.map +1 -1
  12. package/lib/commonjs/components/InfoTab.js +73 -107
  13. package/lib/commonjs/components/InfoTab.js.map +1 -1
  14. package/lib/commonjs/components/JsonTreeView.js +39 -34
  15. package/lib/commonjs/components/JsonTreeView.js.map +1 -1
  16. package/lib/commonjs/components/LogItem.js +33 -29
  17. package/lib/commonjs/components/LogItem.js.map +1 -1
  18. package/lib/commonjs/components/LogsTab.js +37 -42
  19. package/lib/commonjs/components/LogsTab.js.map +1 -1
  20. package/lib/commonjs/components/NetworkItem.js +111 -135
  21. package/lib/commonjs/components/NetworkItem.js.map +1 -1
  22. package/lib/commonjs/components/NetworkTab.js +48 -49
  23. package/lib/commonjs/components/NetworkTab.js.map +1 -1
  24. package/lib/commonjs/components/TabBar.js +8 -5
  25. package/lib/commonjs/components/TabBar.js.map +1 -1
  26. package/lib/commonjs/constants.js +24 -1
  27. package/lib/commonjs/constants.js.map +1 -1
  28. package/lib/commonjs/index.js +19 -0
  29. package/lib/commonjs/index.js.map +1 -1
  30. package/lib/commonjs/types.js +1 -0
  31. package/lib/commonjs/types.js.map +1 -1
  32. package/lib/module/Backstage.js +42 -31
  33. package/lib/module/Backstage.js.map +1 -1
  34. package/lib/module/ThemeContext.js +37 -0
  35. package/lib/module/ThemeContext.js.map +1 -0
  36. package/lib/module/components/BackstagePanel.js +40 -18
  37. package/lib/module/components/BackstagePanel.js.map +1 -1
  38. package/lib/module/components/FlagsTab.js +251 -0
  39. package/lib/module/components/FlagsTab.js.map +1 -0
  40. package/lib/module/components/FloatingPill.js +5 -3
  41. package/lib/module/components/FloatingPill.js.map +1 -1
  42. package/lib/module/components/InfoTab.js +73 -107
  43. package/lib/module/components/InfoTab.js.map +1 -1
  44. package/lib/module/components/JsonTreeView.js +42 -38
  45. package/lib/module/components/JsonTreeView.js.map +1 -1
  46. package/lib/module/components/LogItem.js +35 -31
  47. package/lib/module/components/LogItem.js.map +1 -1
  48. package/lib/module/components/LogsTab.js +38 -43
  49. package/lib/module/components/LogsTab.js.map +1 -1
  50. package/lib/module/components/NetworkItem.js +113 -137
  51. package/lib/module/components/NetworkItem.js.map +1 -1
  52. package/lib/module/components/NetworkTab.js +49 -50
  53. package/lib/module/components/NetworkTab.js.map +1 -1
  54. package/lib/module/components/TabBar.js +10 -7
  55. package/lib/module/components/TabBar.js.map +1 -1
  56. package/lib/module/constants.js +23 -0
  57. package/lib/module/constants.js.map +1 -1
  58. package/lib/module/index.js +1 -0
  59. package/lib/module/index.js.map +1 -1
  60. package/lib/module/types.js +2 -0
  61. package/lib/module/types.js.map +1 -1
  62. package/lib/typescript/Backstage.d.ts.map +1 -1
  63. package/lib/typescript/ThemeContext.d.ts +11 -0
  64. package/lib/typescript/ThemeContext.d.ts.map +1 -0
  65. package/lib/typescript/components/BackstagePanel.d.ts +4 -1
  66. package/lib/typescript/components/BackstagePanel.d.ts.map +1 -1
  67. package/lib/typescript/components/FlagsTab.d.ts +9 -0
  68. package/lib/typescript/components/FlagsTab.d.ts.map +1 -0
  69. package/lib/typescript/components/FloatingPill.d.ts.map +1 -1
  70. package/lib/typescript/components/InfoTab.d.ts +1 -0
  71. package/lib/typescript/components/InfoTab.d.ts.map +1 -1
  72. package/lib/typescript/components/JsonTreeView.d.ts.map +1 -1
  73. package/lib/typescript/components/LogItem.d.ts +1 -0
  74. package/lib/typescript/components/LogItem.d.ts.map +1 -1
  75. package/lib/typescript/components/LogsTab.d.ts +1 -0
  76. package/lib/typescript/components/LogsTab.d.ts.map +1 -1
  77. package/lib/typescript/components/NetworkItem.d.ts +1 -0
  78. package/lib/typescript/components/NetworkItem.d.ts.map +1 -1
  79. package/lib/typescript/components/NetworkTab.d.ts +1 -0
  80. package/lib/typescript/components/NetworkTab.d.ts.map +1 -1
  81. package/lib/typescript/components/TabBar.d.ts.map +1 -1
  82. package/lib/typescript/constants.d.ts +1 -0
  83. package/lib/typescript/constants.d.ts.map +1 -1
  84. package/lib/typescript/index.d.ts +3 -1
  85. package/lib/typescript/index.d.ts.map +1 -1
  86. package/lib/typescript/types.d.ts +18 -0
  87. package/lib/typescript/types.d.ts.map +1 -1
  88. package/package.json +1 -1
  89. package/src/Backstage.tsx +41 -31
  90. package/src/ThemeContext.tsx +38 -0
  91. package/src/components/BackstagePanel.tsx +84 -56
  92. package/src/components/FlagsTab.tsx +198 -0
  93. package/src/components/FloatingPill.tsx +6 -3
  94. package/src/components/InfoTab.tsx +152 -186
  95. package/src/components/JsonTreeView.tsx +53 -73
  96. package/src/components/LogItem.tsx +55 -100
  97. package/src/components/LogsTab.tsx +110 -132
  98. package/src/components/NetworkItem.tsx +306 -417
  99. package/src/components/NetworkTab.tsx +129 -163
  100. package/src/components/TabBar.tsx +51 -47
  101. package/src/constants.ts +23 -0
  102. package/src/index.ts +3 -0
  103. package/src/types.ts +25 -0
@@ -1 +1 @@
1
- {"version":3,"file":"LogsTab.d.ts","sourceRoot":"","sources":["../../../src/components/LogsTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAG7D,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAMjE,UAAU,YAAY;IACpB,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,CAAC,EAAE,uBAAuB,CAAA;CACjC;AAID,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAmH1C,CAAA"}
1
+ {"version":3,"file":"LogsTab.d.ts","sourceRoot":"","sources":["../../../src/components/LogsTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAI7D,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAkB,MAAM,UAAU,CAAA;AAMjF,UAAU,YAAY;IACpB,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,uBAAuB,CAAA;CACjC;AAID,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAiH1C,CAAA"}
@@ -3,6 +3,7 @@ import type { NetworkEntry } from '../types';
3
3
  interface NetworkItemProps {
4
4
  item: NetworkEntry;
5
5
  onCopy?: (text: string) => void;
6
+ jsonMaxDepth?: number;
6
7
  }
7
8
  export declare const NetworkItem: React.FC<NetworkItemProps>;
8
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkItem.d.ts","sourceRoot":"","sources":["../../../src/components/NetworkItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAIpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAO5C,UAAU,gBAAgB;IACxB,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAoID,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAwLjD,CAAA"}
1
+ {"version":3,"file":"NetworkItem.d.ts","sourceRoot":"","sources":["../../../src/components/NetworkItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAK7D,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,UAAU,CAAA;AAO5D,UAAU,gBAAgB;IACxB,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AA+GD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAkMlD,CAAA"}
@@ -5,6 +5,7 @@ interface NetworkTabProps {
5
5
  onRefresh: () => void;
6
6
  onClear: () => void;
7
7
  onCopy?: (text: string) => void;
8
+ jsonMaxDepth?: number;
8
9
  }
9
10
  export declare const NetworkTab: React.FC<NetworkTabProps>;
10
11
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkTab.d.ts","sourceRoot":"","sources":["../../../src/components/NetworkTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAK5C,UAAU,eAAe;IACvB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAID,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA2HhD,CAAA"}
1
+ {"version":3,"file":"NetworkTab.d.ts","sourceRoot":"","sources":["../../../src/components/NetworkTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAK7D,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,UAAU,CAAA;AAK5D,UAAU,eAAe;IACvB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAID,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA6HhD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../src/components/TabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAc7D,UAAU,GAAG;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAID,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAyExC,CAAA"}
1
+ {"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../src/components/TabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;AAetE,UAAU,GAAG;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAID,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA2ExC,CAAA"}
@@ -12,6 +12,7 @@ export declare const Metrics: {
12
12
  contentPadding: number;
13
13
  };
14
14
  export declare const DarkTheme: BackstageTheme;
15
+ export declare const LightTheme: BackstageTheme;
15
16
  export declare const DEFAULT_MAX_LOGS = 500;
16
17
  export declare const DEFAULT_MAX_NETWORK_ENTRIES = 500;
17
18
  export declare const DEFAULT_MAX_NETWORK_BODY_SIZE = 65536;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,OAAO;;;;;;;;;;;CAWnB,CAAA;AAID,eAAO,MAAM,SAAS,EAAE,cAmBvB,CAAA;AAED,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAInC,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAC9C,eAAO,MAAM,6BAA6B,QAAQ,CAAA;AAIlD,eAAO,MAAM,aAAa,QAGxB,CAAA;AAIF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BnB,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,OAAO;;;;;;;;;;;CAWnB,CAAA;AAID,eAAO,MAAM,SAAS,EAAE,cAmBvB,CAAA;AAID,eAAO,MAAM,UAAU,EAAE,cAmBxB,CAAA;AAED,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAInC,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAC9C,eAAO,MAAM,6BAA6B,QAAQ,CAAA;AAIlD,eAAO,MAAM,aAAa,QAGxB,CAAA;AAIF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BnB,CAAA"}
@@ -1,4 +1,6 @@
1
1
  export { Backstage } from './Backstage';
2
- export type { BackstageProps, BackstageRef, BackstageTab, BackstageStyleOverrides, BackstageTheme, QuickAction, AppInfoItem, LogEntry, NetworkEntry, } from './types';
2
+ export type { BackstageProps, BackstageRef, BackstageTab, BackstageStyleOverrides, BackstageTheme, QuickAction, FeatureFlag, AppInfoItem, LogEntry, NetworkEntry, } from './types';
3
3
  export { LogLevel, NetworkState } from './types';
4
+ export { TestIDs, DarkTheme, LightTheme } from './constants';
5
+ export type { ThemePreference } from './ThemeContext';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
@@ -48,6 +48,16 @@ export interface QuickAction {
48
48
  destructive?: boolean;
49
49
  testID?: string;
50
50
  }
51
+ export interface FeatureFlag {
52
+ /** Unique key for this flag */
53
+ key: string;
54
+ /** Display label */
55
+ label: string;
56
+ /** Current value */
57
+ value: boolean;
58
+ /** Optional description shown below the label */
59
+ description?: string;
60
+ }
51
61
  export interface BackstageTab {
52
62
  key: string;
53
63
  title: string;
@@ -77,6 +87,8 @@ export interface BackstageTheme {
77
87
  export interface BackstageProps {
78
88
  /** Whether the floating pill trigger is visible. Default: true */
79
89
  visible?: boolean;
90
+ /** Theme preference: 'light', 'dark', or 'auto' (follows device setting). Default: 'auto' */
91
+ theme?: 'light' | 'dark' | 'auto';
80
92
  /** App version string (e.g., "1.2.3") */
81
93
  appVersion?: string;
82
94
  /** Build number (e.g., "42") */
@@ -89,6 +101,10 @@ export interface BackstageProps {
89
101
  state?: Record<string, unknown>;
90
102
  /** Custom action buttons in the Info tab */
91
103
  quickActions?: QuickAction[];
104
+ /** Feature flags to display with toggle switches */
105
+ featureFlags?: FeatureFlag[];
106
+ /** Callback when a feature flag is toggled */
107
+ onToggleFeatureFlag?: (key: string, value: boolean) => void;
92
108
  /** Maximum number of logs to retain in memory. Default: 500 */
93
109
  maxLogs?: number;
94
110
  /** Log messages containing these strings will be excluded */
@@ -117,6 +133,8 @@ export interface BackstageProps {
117
133
  networkFilters?: string[];
118
134
  /** Auto-filter console.logs from network callbacks (e.g., Axios interceptors) out of the Logs tab. Default: true */
119
135
  autoFilterNetworkLogs?: boolean;
136
+ /** Max nesting depth for JSON tree views (state tree, log data, network bodies). Default: 10 */
137
+ jsonMaxDepth?: number;
120
138
  }
121
139
  export interface BackstageStyleOverrides {
122
140
  pillStyle?: StyleProp<ViewStyle>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAInE,oBAAY,QAAQ;IAClB,GAAG,QAAQ;IACX,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAID,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,CAAA;CACpB;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,SAAS,CAAA;CACxB;AAID,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAID,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;IAE1B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAE5B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IAErB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAEnC,kDAAkD;IAClD,SAAS,CAAC,EAAE,YAAY,EAAE,CAAA;IAE1B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAA;IAEpB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,uBAAuB,CAAA;IAEhC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,oEAAoE;IACpE,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAEhC,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IAEzB,oHAAoH;IACpH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACjC,gBAAgB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACvC,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACxC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACxC,sBAAsB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC7C,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACxC,eAAe,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CACvC;AAID,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,gCAAgC;IAChC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rn-backstage",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "A zero-dependency developer/QA debug panel for React Native apps",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/Backstage.tsx CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  } from './network-interceptor'
17
17
  import { FloatingPill } from './components/FloatingPill'
18
18
  import { BackstagePanel } from './components/BackstagePanel'
19
+ import { BackstageThemeProvider } from './ThemeContext'
19
20
  import type { BackstageProps, BackstageRef, LogEntry, NetworkEntry } from './types'
20
21
 
21
22
  // ─── Component ───────────────────────────────────────────────────────────────
@@ -24,12 +25,15 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
24
25
  (
25
26
  {
26
27
  visible = true,
28
+ theme: themePreference = 'auto',
27
29
  appVersion,
28
30
  buildNumber,
29
31
  bundleId,
30
32
  deviceInfo,
31
33
  state,
32
34
  quickActions,
35
+ featureFlags,
36
+ onToggleFeatureFlag,
33
37
  maxLogs = DEFAULT_MAX_LOGS,
34
38
  logFilters,
35
39
  onCopyLogs,
@@ -44,6 +48,7 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
44
48
  maxNetworkBodySize,
45
49
  networkFilters,
46
50
  autoFilterNetworkLogs = true,
51
+ jsonMaxDepth,
47
52
  },
48
53
  ref,
49
54
  ) => {
@@ -151,37 +156,42 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
151
156
  const displayText = pillText || (appVersion ? `v${appVersion}` : 'DEV')
152
157
 
153
158
  return (
154
- <View style={styles.container} pointerEvents="box-none">
155
- <FloatingPill
156
- text={displayText}
157
- hasError={hasError}
158
- onPress={openPanel}
159
- initialX={initialX}
160
- initialY={initialY}
161
- styles={propStyles}
162
- />
163
- <BackstagePanel
164
- visible={panelVisible}
165
- onClose={closePanel}
166
- appVersion={appVersion}
167
- buildNumber={buildNumber}
168
- bundleId={bundleId}
169
- deviceInfo={deviceInfo}
170
- state={state}
171
- quickActions={quickActions}
172
- logs={logs}
173
- onRefreshLogs={refreshLogs}
174
- onCopyLogs={onCopyLogs}
175
- networkEntries={networkEntries}
176
- onRefreshNetwork={refreshNetwork}
177
- onClearNetwork={clearNetwork}
178
- onCopyNetwork={onCopyLogs}
179
- extraTabs={extraTabs}
180
- styles={propStyles}
181
- >
182
- {children}
183
- </BackstagePanel>
184
- </View>
159
+ <BackstageThemeProvider preference={themePreference}>
160
+ <View style={styles.container} pointerEvents="box-none">
161
+ <FloatingPill
162
+ text={displayText}
163
+ hasError={hasError}
164
+ onPress={openPanel}
165
+ initialX={initialX}
166
+ initialY={initialY}
167
+ styles={propStyles}
168
+ />
169
+ <BackstagePanel
170
+ visible={panelVisible}
171
+ onClose={closePanel}
172
+ appVersion={appVersion}
173
+ buildNumber={buildNumber}
174
+ bundleId={bundleId}
175
+ deviceInfo={deviceInfo}
176
+ state={state}
177
+ quickActions={quickActions}
178
+ featureFlags={featureFlags}
179
+ onToggleFeatureFlag={onToggleFeatureFlag}
180
+ logs={logs}
181
+ onRefreshLogs={refreshLogs}
182
+ onCopyLogs={onCopyLogs}
183
+ networkEntries={networkEntries}
184
+ onRefreshNetwork={refreshNetwork}
185
+ onClearNetwork={clearNetwork}
186
+ onCopyNetwork={onCopyLogs}
187
+ extraTabs={extraTabs}
188
+ jsonMaxDepth={jsonMaxDepth}
189
+ styles={propStyles}
190
+ >
191
+ {children}
192
+ </BackstagePanel>
193
+ </View>
194
+ </BackstageThemeProvider>
185
195
  )
186
196
  },
187
197
  )
@@ -0,0 +1,38 @@
1
+ import React, { createContext, useContext, useMemo } from 'react'
2
+ import { useColorScheme } from 'react-native'
3
+ import { DarkTheme, LightTheme } from './constants'
4
+ import type { BackstageTheme } from './types'
5
+
6
+ // ─── Theme Preference ────────────────────────────────────────────────────────
7
+
8
+ export type ThemePreference = 'light' | 'dark' | 'auto'
9
+
10
+ // ─── Context ─────────────────────────────────────────────────────────────────
11
+
12
+ const ThemeContext = createContext<BackstageTheme>(DarkTheme)
13
+
14
+ // ─── Provider ────────────────────────────────────────────────────────────────
15
+
16
+ interface ThemeProviderProps {
17
+ preference: ThemePreference
18
+ children: React.ReactNode
19
+ }
20
+
21
+ export const BackstageThemeProvider: React.FC<ThemeProviderProps> = ({ preference, children }) => {
22
+ const systemScheme = useColorScheme()
23
+
24
+ const theme = useMemo(() => {
25
+ if (preference === 'light') return LightTheme
26
+ if (preference === 'dark') return DarkTheme
27
+ // 'auto' — follow system, fallback to dark
28
+ return systemScheme === 'light' ? LightTheme : DarkTheme
29
+ }, [preference, systemScheme])
30
+
31
+ return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>
32
+ }
33
+
34
+ // ─── Hook ────────────────────────────────────────────────────────────────────
35
+
36
+ export function useBackstageTheme(): BackstageTheme {
37
+ return useContext(ThemeContext)
38
+ }
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react'
1
+ import React, { useMemo, useState } from 'react'
2
2
  import {
3
3
  Modal,
4
4
  SafeAreaView,
@@ -8,15 +8,18 @@ import {
8
8
  TouchableOpacity,
9
9
  View,
10
10
  } from 'react-native'
11
- import { DarkTheme, MonospaceFont, TestIDs } from '../constants'
11
+ import { MonospaceFont, TestIDs } from '../constants'
12
+ import { useBackstageTheme } from '../ThemeContext'
12
13
  import { TabBar } from './TabBar'
13
14
  import { InfoTab } from './InfoTab'
14
15
  import { LogsTab } from './LogsTab'
15
16
  import { NetworkTab } from './NetworkTab'
17
+ import { FlagsTab } from './FlagsTab'
16
18
  import type {
17
19
  AppInfoItem,
18
20
  BackstageStyleOverrides,
19
21
  BackstageTab,
22
+ FeatureFlag,
20
23
  LogEntry,
21
24
  NetworkEntry,
22
25
  QuickAction,
@@ -35,6 +38,8 @@ interface BackstagePanelProps {
35
38
  deviceInfo?: AppInfoItem[]
36
39
  state?: Record<string, unknown>
37
40
  quickActions?: QuickAction[]
41
+ featureFlags?: FeatureFlag[]
42
+ onToggleFeatureFlag?: (key: string, value: boolean) => void
38
43
 
39
44
  // Logs tab props
40
45
  logs: LogEntry[]
@@ -50,19 +55,25 @@ interface BackstagePanelProps {
50
55
  // Extensibility
51
56
  extraTabs?: BackstageTab[]
52
57
 
58
+ // JSON tree
59
+ jsonMaxDepth?: number
60
+
53
61
  // Styling
54
62
  styles?: BackstageStyleOverrides
55
63
  children?: React.ReactNode
56
64
  }
57
65
 
58
- // ─── Built-in Tab Definitions ────────────────────────────────────────────────
66
+ // ─── Built-in Tab Definitions ────────────────────────────────────────────
59
67
 
60
- const BUILT_IN_TABS = [
68
+ const ALWAYS_ON_TABS = [
61
69
  { key: 'info', title: 'Info', icon: 'ℹ️' },
62
70
  { key: 'network', title: 'Network', icon: '🌐' },
63
- { key: 'logs', title: 'Logs', icon: '📋' },
64
71
  ]
65
72
 
73
+ const FLAGS_TAB = { key: 'flags', title: 'Flags', icon: '🎚' }
74
+
75
+ const LOGS_TAB = { key: 'logs', title: 'Logs', icon: '📋' }
76
+
66
77
  // ─── Component ───────────────────────────────────────────────────────────────
67
78
 
68
79
  export const BackstagePanel: React.FC<BackstagePanelProps> = ({
@@ -74,6 +85,8 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
74
85
  deviceInfo,
75
86
  state,
76
87
  quickActions,
88
+ featureFlags,
89
+ onToggleFeatureFlag,
77
90
  logs,
78
91
  onRefreshLogs,
79
92
  onCopyLogs,
@@ -82,14 +95,20 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
82
95
  onClearNetwork,
83
96
  onCopyNetwork,
84
97
  extraTabs = [],
98
+ jsonMaxDepth,
85
99
  styles: propStyles,
86
100
  children,
87
101
  }) => {
88
102
  const [activeTab, setActiveTab] = useState('info')
103
+ const theme = useBackstageTheme()
104
+ const styles = useMemo(() => createStyles(theme), [theme])
89
105
 
90
- // Compose all tabs: built-in + extra
106
+ // Compose all tabs: built-in (conditionally including Flags) + extra
107
+ const hasFlags = featureFlags && featureFlags.length > 0
91
108
  const allTabs = [
92
- ...BUILT_IN_TABS,
109
+ ...ALWAYS_ON_TABS,
110
+ ...(hasFlags ? [FLAGS_TAB] : []),
111
+ LOGS_TAB,
93
112
  ...extraTabs.map(t => ({ key: t.key, title: t.title, icon: t.icon })),
94
113
  ]
95
114
 
@@ -105,12 +124,15 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
105
124
  deviceInfo={deviceInfo}
106
125
  state={state}
107
126
  quickActions={quickActions}
127
+ jsonMaxDepth={jsonMaxDepth}
108
128
  onClosePanel={onClose}
109
129
  styles={propStyles}
110
130
  >
111
131
  {children}
112
132
  </InfoTab>
113
133
  )
134
+ case 'flags':
135
+ return <FlagsTab flags={featureFlags ?? []} onToggle={onToggleFeatureFlag} />
114
136
  case 'network':
115
137
  return (
116
138
  <NetworkTab
@@ -118,6 +140,7 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
118
140
  onRefresh={onRefreshNetwork}
119
141
  onClear={onClearNetwork}
120
142
  onCopy={onCopyNetwork}
143
+ jsonMaxDepth={jsonMaxDepth}
121
144
  />
122
145
  )
123
146
  case 'logs':
@@ -126,6 +149,7 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
126
149
  logs={logs}
127
150
  onRefresh={onRefreshLogs}
128
151
  onCopyLogs={onCopyLogs}
152
+ jsonMaxDepth={jsonMaxDepth}
129
153
  styles={propStyles}
130
154
  />
131
155
  )
@@ -149,7 +173,10 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
149
173
  onRequestClose={onClose}
150
174
  statusBarTranslucent
151
175
  >
152
- <StatusBar barStyle="light-content" backgroundColor={DarkTheme.background} />
176
+ <StatusBar
177
+ barStyle={theme.background < '#888' ? 'light-content' : 'dark-content'}
178
+ backgroundColor={theme.background}
179
+ />
153
180
  <SafeAreaView style={[styles.safeArea, propStyles?.panelStyle]}>
154
181
  {/* ── Header ──────────────────────────────────────────── */}
155
182
  <View style={styles.header}>
@@ -180,51 +207,52 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
180
207
 
181
208
  // ─── Styles ──────────────────────────────────────────────────────────────────
182
209
 
183
- const styles = StyleSheet.create({
184
- safeArea: {
185
- flex: 1,
186
- backgroundColor: DarkTheme.background,
187
- },
188
- header: {
189
- flexDirection: 'row',
190
- alignItems: 'center',
191
- justifyContent: 'space-between',
192
- paddingHorizontal: 16,
193
- paddingVertical: 12,
194
- borderBottomWidth: 1,
195
- borderBottomColor: DarkTheme.border,
196
- },
197
- headerLeft: {
198
- flexDirection: 'row',
199
- alignItems: 'center',
200
- },
201
- headerBrand: {
202
- fontSize: 20,
203
- marginRight: 8,
204
- },
205
- headerTitle: {
206
- fontFamily: MonospaceFont,
207
- fontSize: 18,
208
- fontWeight: '800',
209
- color: DarkTheme.text,
210
- letterSpacing: 1,
211
- },
212
- closeButton: {
213
- width: 32,
214
- height: 32,
215
- borderRadius: 16,
216
- backgroundColor: DarkTheme.surfaceElevated,
217
- borderWidth: 1,
218
- borderColor: DarkTheme.border,
219
- alignItems: 'center',
220
- justifyContent: 'center',
221
- },
222
- closeButtonText: {
223
- fontSize: 14,
224
- color: DarkTheme.textSecondary,
225
- fontWeight: '700',
226
- },
227
- content: {
228
- flex: 1,
229
- },
230
- })
210
+ const createStyles = (t: import('../types').BackstageTheme) =>
211
+ StyleSheet.create({
212
+ safeArea: {
213
+ flex: 1,
214
+ backgroundColor: t.background,
215
+ },
216
+ header: {
217
+ flexDirection: 'row',
218
+ alignItems: 'center',
219
+ justifyContent: 'space-between',
220
+ paddingHorizontal: 16,
221
+ paddingVertical: 12,
222
+ borderBottomWidth: 1,
223
+ borderBottomColor: t.border,
224
+ },
225
+ headerLeft: {
226
+ flexDirection: 'row',
227
+ alignItems: 'center',
228
+ },
229
+ headerBrand: {
230
+ fontSize: 20,
231
+ marginRight: 8,
232
+ },
233
+ headerTitle: {
234
+ fontFamily: MonospaceFont,
235
+ fontSize: 18,
236
+ fontWeight: '800',
237
+ color: t.text,
238
+ letterSpacing: 1,
239
+ },
240
+ closeButton: {
241
+ width: 32,
242
+ height: 32,
243
+ borderRadius: 16,
244
+ backgroundColor: t.surfaceElevated,
245
+ borderWidth: 1,
246
+ borderColor: t.border,
247
+ alignItems: 'center',
248
+ justifyContent: 'center',
249
+ },
250
+ closeButtonText: {
251
+ fontSize: 14,
252
+ color: t.textSecondary,
253
+ fontWeight: '700',
254
+ },
255
+ content: {
256
+ flex: 1,
257
+ },
258
+ })