@buoy-gg/debug-borders 7.0.40 → 7.0.42

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 (39) hide show
  1. package/README.md +9 -63
  2. package/lib/commonjs/debug-borders/components/DebugBordersModal.js +1 -236
  3. package/lib/commonjs/debug-borders/components/DebugBordersStandaloneOverlay.js +1 -469
  4. package/lib/commonjs/debug-borders/index.js +1 -51
  5. package/lib/commonjs/debug-borders/types.js +1 -1
  6. package/lib/commonjs/debug-borders/utils/DebugBordersManager.js +1 -119
  7. package/lib/commonjs/debug-borders/utils/ViewTypeMapper.js +1 -264
  8. package/lib/commonjs/debug-borders/utils/colorGeneration.js +1 -76
  9. package/lib/commonjs/debug-borders/utils/componentInfo.js +1 -183
  10. package/lib/commonjs/debug-borders/utils/componentMeasurement.js +1 -111
  11. package/lib/commonjs/debug-borders/utils/fiberTreeTraversal.js +1 -309
  12. package/lib/commonjs/debug-borders/utils/labelPositioning.js +1 -202
  13. package/lib/commonjs/index.js +1 -42
  14. package/lib/commonjs/preset.js +1 -178
  15. package/lib/commonjs/sync/debugBordersSyncAdapter.js +1 -34
  16. package/lib/module/debug-borders/components/DebugBordersModal.js +1 -231
  17. package/lib/module/debug-borders/components/DebugBordersStandaloneOverlay.js +1 -464
  18. package/lib/module/debug-borders/index.js +1 -15
  19. package/lib/module/debug-borders/types.js +1 -1
  20. package/lib/module/debug-borders/utils/DebugBordersManager.js +1 -119
  21. package/lib/module/debug-borders/utils/ViewTypeMapper.js +1 -255
  22. package/lib/module/debug-borders/utils/colorGeneration.js +1 -76
  23. package/lib/module/debug-borders/utils/componentInfo.js +1 -183
  24. package/lib/module/debug-borders/utils/componentMeasurement.js +1 -111
  25. package/lib/module/debug-borders/utils/fiberTreeTraversal.js +1 -309
  26. package/lib/module/debug-borders/utils/labelPositioning.js +1 -202
  27. package/lib/module/index.js +1 -10
  28. package/lib/module/preset.js +1 -166
  29. package/lib/module/sync/debugBordersSyncAdapter.js +1 -30
  30. package/lib/web/index.mjs +1 -0
  31. package/package.json +34 -12
  32. package/lib/typescript/debug-borders/components/DebugBordersModal.d.ts.map +0 -1
  33. package/lib/typescript/debug-borders/components/DebugBordersStandaloneOverlay.d.ts.map +0 -1
  34. package/lib/typescript/debug-borders/index.d.ts.map +0 -1
  35. package/lib/typescript/debug-borders/types.d.ts.map +0 -1
  36. package/lib/typescript/debug-borders/utils/ViewTypeMapper.d.ts.map +0 -1
  37. package/lib/typescript/index.d.ts.map +0 -1
  38. package/lib/typescript/preset.d.ts.map +0 -1
  39. package/lib/typescript/sync/debugBordersSyncAdapter.d.ts.map +0 -1
@@ -1,178 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "DebugBordersStandaloneOverlay", {
7
- enumerable: true,
8
- get: function () {
9
- return _DebugBordersStandaloneOverlay.DebugBordersStandaloneOverlay;
10
- }
11
- });
12
- exports.createDebugBordersTool = createDebugBordersTool;
13
- exports.debugBordersToolPreset = void 0;
14
- var _react = _interopRequireWildcard(require("react"));
15
- var _sharedUi = require("@buoy-gg/shared-ui");
16
- var _jsxRuntime = require("react/jsx-runtime");
17
- var _DebugBordersStandaloneOverlay = require("./debug-borders/components/DebugBordersStandaloneOverlay");
18
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
- /**
20
- * Pre-configured debug borders tool for FloatingDevTools
21
- *
22
- * This preset provides a zero-config way to add visual layout debugging to your dev tools.
23
- * Just import and add it to your apps array! Tap the icon to cycle through modes:
24
- * - Off (gray icon)
25
- * - Borders only (green icon)
26
- * - Borders + Labels (cyan icon)
27
- *
28
- * @example
29
- * ```tsx
30
- * import { debugBordersToolPreset } from '@buoy-gg/debug-borders';
31
- *
32
- * const installedApps = [
33
- * debugBordersToolPreset, // That's it!
34
- * // ...other tools
35
- * ];
36
- * ```
37
- */
38
-
39
- const DebugBordersManager = require("./debug-borders/utils/DebugBordersManager");
40
- /**
41
- * Mode colors for the icon
42
- * - off: gray (disabled)
43
- * - borders: green (enabled, borders only)
44
- * - labels: cyan (enabled, with labels)
45
- */
46
- const MODE_COLORS = {
47
- off: "#6b7280",
48
- // Gray
49
- borders: "#10b981",
50
- // Green
51
- labels: "#06b6d4" // Cyan
52
- };
53
-
54
- /**
55
- * Icon component that changes color based on display mode.
56
- *
57
- * ⚠️ IMPORTANT - DO NOT MODIFY THIS COMPONENT ⚠️
58
- * This component MUST use useState and useEffect hooks to subscribe to the manager.
59
- * It is rendered as a JSX component (<IconComponent />) in FloatingMenu and DialIcon,
60
- * which allows hooks to work properly.
61
- *
62
- * If you remove the hooks or change this to read getMode() directly,
63
- * the icon color will NOT update when the toggle is pressed.
64
- */
65
- function BordersIcon({
66
- size
67
- }) {
68
- const [mode, setMode] = (0, _react.useState)(() => DebugBordersManager.getMode());
69
- (0, _react.useEffect)(() => {
70
- const unsubscribe = DebugBordersManager.subscribe(newMode => {
71
- setMode(newMode);
72
- });
73
- return unsubscribe;
74
- }, []);
75
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Layers, {
76
- size: size,
77
- color: MODE_COLORS[mode]
78
- });
79
- }
80
-
81
- /**
82
- * Empty component for toggle-only tools (no modal needed)
83
- */
84
- function EmptyComponent() {
85
- return null;
86
- }
87
-
88
- /**
89
- * Pre-configured debug borders tool for FloatingDevTools.
90
- * Tap the icon to cycle through modes: Off → Borders → Labels → Off
91
- *
92
- * Features:
93
- * - Visual layout debugging with colored borders
94
- * - Optional component labels showing testID, nativeID, component name, etc.
95
- * - Automatic component tracking
96
- * - Real-time updates every 2 seconds
97
- * - Icon changes color: gray (off), green (borders), cyan (labels)
98
- */
99
- const debugBordersToolPreset = exports.debugBordersToolPreset = {
100
- id: "debug-borders",
101
- name: "BORDERS",
102
- description: "Visual layout debugger - tap to cycle modes",
103
- slot: "row",
104
- icon: BordersIcon,
105
- component: EmptyComponent,
106
- props: {},
107
- launchMode: "toggle-only",
108
- onPress: () => {
109
- DebugBordersManager.cycle();
110
- // Icon updates automatically via subscription in BordersIcon component
111
- }
112
- };
113
-
114
- /**
115
- * Create a custom debug borders tool configuration.
116
- * Use this if you want to override default settings.
117
- *
118
- * @example
119
- * ```tsx
120
- * import { createDebugBordersTool } from '@buoy-gg/debug-borders';
121
- *
122
- * const myBordersTool = createDebugBordersTool({
123
- * name: "LAYOUT",
124
- * offColor: "#9ca3af",
125
- * bordersColor: "#ec4899",
126
- * labelsColor: "#8b5cf6",
127
- * });
128
- * ```
129
- */
130
- function createDebugBordersTool(options) {
131
- const colors = {
132
- off: options?.offColor || "#6b7280",
133
- borders: options?.bordersColor || "#10b981",
134
- labels: options?.labelsColor || "#06b6d4"
135
- };
136
-
137
- /**
138
- * Custom icon component with hooks - rendered as JSX component.
139
- *
140
- * ⚠️ IMPORTANT - DO NOT MODIFY THIS COMPONENT ⚠️
141
- * This component MUST use useState and useEffect hooks to subscribe to the manager.
142
- * See the comment on BordersIcon above for full explanation.
143
- */
144
- const CustomBordersIcon = ({
145
- size
146
- }) => {
147
- const [mode, setMode] = (0, _react.useState)(() => DebugBordersManager.getMode());
148
- (0, _react.useEffect)(() => {
149
- const unsubscribe = DebugBordersManager.subscribe(newMode => {
150
- setMode(newMode);
151
- });
152
- return unsubscribe;
153
- }, []);
154
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Layers, {
155
- size: size,
156
- color: colors[mode]
157
- });
158
- };
159
- return {
160
- id: options?.id || "debug-borders",
161
- name: options?.name || "BORDERS",
162
- description: options?.description || "Visual layout debugger - tap to cycle modes",
163
- slot: "row",
164
- icon: CustomBordersIcon,
165
- component: EmptyComponent,
166
- props: {},
167
- launchMode: "toggle-only",
168
- onPress: () => {
169
- DebugBordersManager.cycle();
170
- // Icon updates automatically via subscription
171
- }
172
- };
173
- }
174
-
175
- /**
176
- * Export the standalone overlay for manual integration
177
- * Use this if you want to control debug borders outside of FloatingDevTools
178
- */
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DebugBordersStandaloneOverlay",{enumerable:true,get:function(){return _DebugBordersStandaloneOverlay.DebugBordersStandaloneOverlay}});exports.createDebugBordersTool=createDebugBordersTool;exports.debugBordersToolPreset=void 0;var _react=_interopRequireWildcard(require("react"));var _sharedUi=require("@buoy-gg/shared-ui");var _jsxRuntime=require("react/jsx-runtime");var _DebugBordersStandaloneOverlay=require("./debug-borders/components/DebugBordersStandaloneOverlay");function _interopRequireWildcard(r,n){if("function"==typeof WeakMap)var u=new WeakMap,d=new WeakMap;return(_interopRequireWildcard=function(e,c){if(!c&&e&&e.__esModule)return e;var o,t,a={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return a;if(o=c?d:u){if(o.has(e))return o.get(e);o.set(e,a)}for(const s in e)"default"!==s&&{}.hasOwnProperty.call(e,s)&&((t=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,s))&&(t.get||t.set)?o(a,s,t):a[s]=e[s]);return a})(r,n)}const DebugBordersManager=require("./debug-borders/utils/DebugBordersManager");const MODE_COLORS={off:"#6b7280",borders:"#10b981",labels:"#06b6d4"};function BordersIcon({size:r}){const[n,u]=(0,_react.useState)(()=>DebugBordersManager.getMode());(0,_react.useEffect)(()=>{const d=DebugBordersManager.subscribe(e=>{u(e)});return d},[]);return(0,_jsxRuntime.jsx)(_sharedUi.Layers,{size:r,color:MODE_COLORS[n]})}function EmptyComponent(){return null}const debugBordersToolPreset=exports.debugBordersToolPreset={id:"debug-borders",name:"BORDERS",description:"Visual layout debugger - tap to cycle modes",slot:"row",icon:BordersIcon,component:EmptyComponent,props:{},launchMode:"toggle-only",onPress:()=>{DebugBordersManager.cycle()}};function createDebugBordersTool(r){const n={off:r?.offColor||"#6b7280",borders:r?.bordersColor||"#10b981",labels:r?.labelsColor||"#06b6d4"};const u=({size:d})=>{const[e,c]=(0,_react.useState)(()=>DebugBordersManager.getMode());(0,_react.useEffect)(()=>{const o=DebugBordersManager.subscribe(t=>{c(t)});return o},[]);return(0,_jsxRuntime.jsx)(_sharedUi.Layers,{size:d,color:n[e]})};return{id:r?.id||"debug-borders",name:r?.name||"BORDERS",description:r?.description||"Visual layout debugger - tap to cycle modes",slot:"row",icon:u,component:EmptyComponent,props:{},launchMode:"toggle-only",onPress:()=>{DebugBordersManager.cycle()}}}
@@ -1,34 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.debugBordersSyncAdapter = void 0;
7
- // CJS module (matches how preset.tsx loads it)
8
- // eslint-disable-next-line @typescript-eslint/no-var-requires
9
- const DebugBordersManager = require("../debug-borders/utils/DebugBordersManager");
10
- /**
11
- * Sync adapter for the debug-borders tool, consumed by @buoy-gg/external-sync's
12
- * `useExternalSync` (structurally matches its ToolSyncAdapter interface so
13
- * this package doesn't need a dependency on it).
14
- *
15
- * Debug borders draw on the DEVICE's UI — there is nothing to mirror on a
16
- * dashboard. This adapter is a remote control: the dashboard reads the
17
- * current mode from snapshots and drives it via actions.
18
- */
19
- const debugBordersSyncAdapter = exports.debugBordersSyncAdapter = {
20
- version: 1,
21
- getSnapshot: () => ({
22
- mode: DebugBordersManager.getMode()
23
- }),
24
- subscribe: onChange => DebugBordersManager.subscribe(onChange),
25
- actions: {
26
- /** off → borders → labels → off (labels is Pro-gated on device) */
27
- cycleMode: () => {
28
- DebugBordersManager.cycle();
29
- },
30
- setMode: params => {
31
- DebugBordersManager.setMode(params.mode);
32
- }
33
- }
34
- };
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.debugBordersSyncAdapter=void 0;const DebugBordersManager=require("../debug-borders/utils/DebugBordersManager");const debugBordersSyncAdapter=exports.debugBordersSyncAdapter={version:1,getSnapshot:()=>({mode:DebugBordersManager.getMode()}),subscribe:e=>DebugBordersManager.subscribe(e),actions:{cycleMode:()=>{DebugBordersManager.cycle()},setMode:e=>{DebugBordersManager.setMode(e.mode)}}};
@@ -1,231 +1 @@
1
- "use strict";
2
-
3
- import React, { useEffect, useState } from "react";
4
- import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
5
- import { night, Layers, StatusBadge, StatusIndicator } from "@buoy-gg/shared-ui";
6
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
- const DebugBordersManager = require("../utils/DebugBordersManager");
8
-
9
- /**
10
- * Modal component for controlling debug borders.
11
- * This allows developers to toggle visual layout debugging borders on/off.
12
- */
13
- export function DebugBordersModal({
14
- visible,
15
- onClose
16
- }) {
17
- const [enabled, setEnabled] = useState(false);
18
- const [componentCount, setComponentCount] = useState(0);
19
-
20
- // Subscribe to manager state
21
- useEffect(() => {
22
- const unsubscribe = DebugBordersManager.subscribe(setEnabled);
23
- setEnabled(DebugBordersManager.isEnabled());
24
- return unsubscribe;
25
- }, []);
26
-
27
- // Track component count when enabled
28
- useEffect(() => {
29
- if (!enabled) {
30
- setComponentCount(0);
31
- return;
32
- }
33
-
34
- // Update component count periodically
35
- const updateCount = () => {
36
- try {
37
- const {
38
- getAllHostComponentInstances
39
- } = require("../utils/fiberTreeTraversal");
40
- const instances = getAllHostComponentInstances();
41
- setComponentCount(instances.length);
42
- } catch (error) {
43
- console.error("[DebugBorders] Error getting component count:", error);
44
- }
45
- };
46
-
47
- // Initial count
48
- setTimeout(updateCount, 600);
49
-
50
- // Update every 2 seconds
51
- const interval = setInterval(updateCount, 2000);
52
- return () => clearInterval(interval);
53
- }, [enabled]);
54
- const handleToggle = () => {
55
- DebugBordersManager.toggle();
56
- };
57
- if (!visible) return null;
58
- return /*#__PURE__*/_jsx(View, {
59
- style: styles.container,
60
- children: /*#__PURE__*/_jsxs(View, {
61
- style: styles.content,
62
- children: [/*#__PURE__*/_jsx(Text, {
63
- style: styles.title,
64
- children: "Debug Borders"
65
- }), /*#__PURE__*/_jsx(Text, {
66
- style: styles.description,
67
- children: "Visualize component layout structure with colored borders"
68
- }), /*#__PURE__*/_jsxs(View, {
69
- style: styles.statusRow,
70
- children: [/*#__PURE__*/_jsx(Text, {
71
- style: styles.statusLabel,
72
- children: "Status:"
73
- }), /*#__PURE__*/_jsx(StatusBadge, {
74
- status: enabled ? "active" : "inactive"
75
- })]
76
- }), enabled && componentCount > 0 && /*#__PURE__*/_jsxs(View, {
77
- style: styles.statsRow,
78
- children: [/*#__PURE__*/_jsx(Text, {
79
- style: styles.statsLabel,
80
- children: "Components Tracked:"
81
- }), /*#__PURE__*/_jsx(Text, {
82
- style: styles.statsValue,
83
- children: componentCount
84
- })]
85
- }), /*#__PURE__*/_jsx(View, {
86
- style: styles.toggleContainer,
87
- children: /*#__PURE__*/_jsxs(TouchableOpacity, {
88
- style: [styles.button, enabled && styles.buttonActive],
89
- onPress: handleToggle,
90
- accessibilityRole: "button",
91
- accessibilityLabel: `Debug borders ${enabled ? "enabled" : "disabled"}`,
92
- accessibilityHint: "Tap to toggle debug borders",
93
- children: [/*#__PURE__*/_jsx(Layers, {
94
- size: 40,
95
- color: enabled ? night.color.accent : night.color.textSecondary
96
- }), /*#__PURE__*/_jsx(Text, {
97
- style: [styles.buttonText, enabled && styles.buttonTextActive],
98
- children: enabled ? "Disable Borders" : "Enable Borders"
99
- })]
100
- })
101
- }), /*#__PURE__*/_jsxs(View, {
102
- style: styles.infoBox,
103
- children: [/*#__PURE__*/_jsx(StatusIndicator, {
104
- status: enabled ? "success" : "info",
105
- size: "small"
106
- }), /*#__PURE__*/_jsx(Text, {
107
- style: styles.infoText,
108
- children: enabled ? "Borders update every 2 seconds. Tap button to disable." : "Tap button to show colored borders around all components."
109
- })]
110
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
111
- style: styles.closeButton,
112
- onPress: onClose,
113
- children: /*#__PURE__*/_jsx(Text, {
114
- style: styles.closeButtonText,
115
- children: "Close"
116
- })
117
- })]
118
- })
119
- });
120
- }
121
- const styles = StyleSheet.create({
122
- container: {
123
- flex: 1,
124
- justifyContent: "center",
125
- alignItems: "center",
126
- backgroundColor: "rgba(0, 0, 0, 0.5)"
127
- },
128
- content: {
129
- backgroundColor: night.color.surface,
130
- borderWidth: 1,
131
- borderColor: night.color.border,
132
- borderRadius: 16,
133
- padding: 32,
134
- width: "85%",
135
- maxWidth: 420,
136
- alignItems: "center"
137
- },
138
- title: {
139
- fontSize: 24,
140
- fontWeight: "700",
141
- color: night.color.text,
142
- marginBottom: 8
143
- },
144
- description: {
145
- fontSize: 14,
146
- color: night.color.textSecondary,
147
- textAlign: "center",
148
- marginBottom: 24
149
- },
150
- statusRow: {
151
- flexDirection: "row",
152
- alignItems: "center",
153
- marginBottom: 16,
154
- gap: 8
155
- },
156
- statusLabel: {
157
- fontSize: 14,
158
- color: night.color.textSecondary,
159
- fontWeight: "600"
160
- },
161
- statsRow: {
162
- flexDirection: "row",
163
- alignItems: "center",
164
- marginBottom: 16,
165
- gap: 8
166
- },
167
- statsLabel: {
168
- fontSize: 14,
169
- color: night.color.textSecondary,
170
- fontWeight: "600"
171
- },
172
- statsValue: {
173
- fontSize: 16,
174
- color: night.color.text,
175
- fontWeight: "700"
176
- },
177
- toggleContainer: {
178
- alignItems: "center",
179
- justifyContent: "center",
180
- marginBottom: 24
181
- },
182
- button: {
183
- alignItems: "center",
184
- justifyContent: "center",
185
- padding: 24,
186
- borderRadius: 16,
187
- backgroundColor: night.color.surfaceElevated,
188
- borderWidth: 2,
189
- borderColor: night.color.border,
190
- minWidth: 200
191
- },
192
- buttonActive: {
193
- borderColor: night.color.accentBorderStrong,
194
- backgroundColor: night.color.accentSoft
195
- },
196
- buttonText: {
197
- marginTop: 12,
198
- fontSize: 16,
199
- fontWeight: "600",
200
- color: night.color.textSecondary
201
- },
202
- buttonTextActive: {
203
- color: night.color.accent
204
- },
205
- infoBox: {
206
- flexDirection: "row",
207
- alignItems: "flex-start",
208
- backgroundColor: night.color.surfaceElevated,
209
- padding: 12,
210
- borderRadius: 8,
211
- marginBottom: 24,
212
- gap: 8
213
- },
214
- infoText: {
215
- flex: 1,
216
- fontSize: 12,
217
- color: night.color.textSecondary,
218
- lineHeight: 16
219
- },
220
- closeButton: {
221
- paddingVertical: 12,
222
- paddingHorizontal: 32,
223
- backgroundColor: night.color.accent,
224
- borderRadius: 8
225
- },
226
- closeButtonText: {
227
- color: night.color.onAccent,
228
- fontSize: 16,
229
- fontWeight: "600"
230
- }
231
- });
1
+ "use strict";import w,{useEffect as b,useState as f}from"react";import{View as s,Text as n,StyleSheet as S,TouchableOpacity as m}from"react-native";import{night as t,Layers as C,StatusBadge as T,StatusIndicator as v}from"@buoy-gg/shared-ui";import{jsx as o,jsxs as l}from"react/jsx-runtime";const a=require("../utils/DebugBordersManager");export function DebugBordersModal({visible:h,onClose:y}){const[r,d]=f(false);const[u,g]=f(0);b(()=>{const c=a.subscribe(d);d(a.isEnabled());return c},[]);b(()=>{if(!r){g(0);return}const c=()=>{try{const{getAllHostComponentInstances:i}=require("../utils/fiberTreeTraversal");const B=i();g(B.length)}catch(i){console.error("[DebugBorders] Error getting component count:",i)}};setTimeout(c,600);const p=setInterval(c,2e3);return()=>clearInterval(p)},[r]);const x=()=>{a.toggle()};if(!h)return null;return o(s,{style:e.container,children:l(s,{style:e.content,children:[o(n,{style:e.title,children:"Debug Borders"}),o(n,{style:e.description,children:"Visualize component layout structure with colored borders"}),l(s,{style:e.statusRow,children:[o(n,{style:e.statusLabel,children:"Status:"}),o(T,{status:r?"active":"inactive"})]}),r&&u>0&&l(s,{style:e.statsRow,children:[o(n,{style:e.statsLabel,children:"Components Tracked:"}),o(n,{style:e.statsValue,children:u})]}),o(s,{style:e.toggleContainer,children:l(m,{style:[e.button,r&&e.buttonActive],onPress:x,accessibilityRole:"button",accessibilityLabel:`Debug borders ${r?"enabled":"disabled"}`,accessibilityHint:"Tap to toggle debug borders",children:[o(C,{size:40,color:r?t.color.accent:t.color.textSecondary}),o(n,{style:[e.buttonText,r&&e.buttonTextActive],children:r?"Disable Borders":"Enable Borders"})]})}),l(s,{style:e.infoBox,children:[o(v,{status:r?"success":"info",size:"small"}),o(n,{style:e.infoText,children:r?"Borders update every 2 seconds. Tap button to disable.":"Tap button to show colored borders around all components."})]}),o(m,{style:e.closeButton,onPress:y,children:o(n,{style:e.closeButtonText,children:"Close"})})]})})}const e=S.create({container:{flex:1,justifyContent:"center",alignItems:"center",backgroundColor:"rgba(0, 0, 0, 0.5)"},content:{backgroundColor:t.color.surface,borderWidth:1,borderColor:t.color.border,borderRadius:16,padding:32,width:"85%",maxWidth:420,alignItems:"center"},title:{fontSize:24,fontWeight:"700",color:t.color.text,marginBottom:8},description:{fontSize:14,color:t.color.textSecondary,textAlign:"center",marginBottom:24},statusRow:{flexDirection:"row",alignItems:"center",marginBottom:16,gap:8},statusLabel:{fontSize:14,color:t.color.textSecondary,fontWeight:"600"},statsRow:{flexDirection:"row",alignItems:"center",marginBottom:16,gap:8},statsLabel:{fontSize:14,color:t.color.textSecondary,fontWeight:"600"},statsValue:{fontSize:16,color:t.color.text,fontWeight:"700"},toggleContainer:{alignItems:"center",justifyContent:"center",marginBottom:24},button:{alignItems:"center",justifyContent:"center",padding:24,borderRadius:16,backgroundColor:t.color.surfaceElevated,borderWidth:2,borderColor:t.color.border,minWidth:200},buttonActive:{borderColor:t.color.accentBorderStrong,backgroundColor:t.color.accentSoft},buttonText:{marginTop:12,fontSize:16,fontWeight:"600",color:t.color.textSecondary},buttonTextActive:{color:t.color.accent},infoBox:{flexDirection:"row",alignItems:"flex-start",backgroundColor:t.color.surfaceElevated,padding:12,borderRadius:8,marginBottom:24,gap:8},infoText:{flex:1,fontSize:12,color:t.color.textSecondary,lineHeight:16},closeButton:{paddingVertical:12,paddingHorizontal:32,backgroundColor:t.color.accent,borderRadius:8},closeButtonText:{color:t.color.onAccent,fontSize:16,fontWeight:"600"}});