@buoy-gg/floating-tools-core 2.1.9 → 2.1.11

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 (110) hide show
  1. package/lib/commonjs/FloatingToolsStore.js +501 -1
  2. package/lib/commonjs/colors.js +54 -1
  3. package/lib/commonjs/constants.js +31 -1
  4. package/lib/commonjs/devToolsState.js +325 -1
  5. package/lib/commonjs/dial.js +617 -1
  6. package/lib/commonjs/easing.js +69 -1
  7. package/lib/commonjs/icons/benchmark-icon.js +24 -1
  8. package/lib/commonjs/icons/env-icon.js +24 -1
  9. package/lib/commonjs/icons/events-icon.js +24 -1
  10. package/lib/commonjs/icons/highlight-icon.js +24 -1
  11. package/lib/commonjs/icons/icon-data.js +2268 -1
  12. package/lib/commonjs/icons/icon-factories.js +173 -1
  13. package/lib/commonjs/icons/icon-primitives.js +559 -1
  14. package/lib/commonjs/icons/icon-primitives.native.js +779 -1
  15. package/lib/commonjs/icons/icon-renderer.js +260 -1
  16. package/lib/commonjs/icons/network-icon.js +24 -1
  17. package/lib/commonjs/icons/query-icon.js +24 -1
  18. package/lib/commonjs/icons/redux-icon.js +85 -1
  19. package/lib/commonjs/icons/renders-icon.js +33 -1
  20. package/lib/commonjs/icons/routes-icon.js +49 -1
  21. package/lib/commonjs/icons/sentry-icon.js +24 -1
  22. package/lib/commonjs/icons/storage-icon.js +24 -1
  23. package/lib/commonjs/icons/wifi-icon.js +24 -1
  24. package/lib/commonjs/index.js +723 -1
  25. package/lib/commonjs/settings.js +599 -1
  26. package/lib/commonjs/utils.js +72 -1
  27. package/lib/module/FloatingToolsStore.js +496 -1
  28. package/lib/module/colors.js +49 -1
  29. package/lib/module/constants.js +27 -1
  30. package/lib/module/devToolsState.js +318 -1
  31. package/lib/module/dial.js +603 -1
  32. package/lib/module/easing.js +62 -1
  33. package/lib/module/icons/benchmark-icon.js +15 -1
  34. package/lib/module/icons/env-icon.js +15 -1
  35. package/lib/module/icons/events-icon.js +15 -1
  36. package/lib/module/icons/highlight-icon.js +15 -1
  37. package/lib/module/icons/icon-data.js +2264 -1
  38. package/lib/module/icons/icon-factories.js +163 -1
  39. package/lib/module/icons/icon-primitives.js +547 -1
  40. package/lib/module/icons/icon-primitives.native.js +767 -1
  41. package/lib/module/icons/icon-renderer.js +255 -1
  42. package/lib/module/icons/network-icon.js +15 -1
  43. package/lib/module/icons/query-icon.js +15 -1
  44. package/lib/module/icons/redux-icon.js +81 -1
  45. package/lib/module/icons/renders-icon.js +17 -1
  46. package/lib/module/icons/routes-icon.js +41 -1
  47. package/lib/module/icons/sentry-icon.js +15 -1
  48. package/lib/module/icons/storage-icon.js +15 -1
  49. package/lib/module/icons/wifi-icon.js +15 -1
  50. package/lib/module/index.js +103 -1
  51. package/lib/module/settings.js +587 -1
  52. package/lib/module/utils.js +66 -1
  53. package/lib/typescript/commonjs/FloatingToolsStore.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/colors.d.ts.map +1 -0
  55. package/lib/typescript/commonjs/constants.d.ts.map +1 -0
  56. package/lib/typescript/commonjs/devToolsState.d.ts.map +1 -0
  57. package/lib/typescript/commonjs/dial.d.ts.map +1 -0
  58. package/lib/typescript/commonjs/easing.d.ts.map +1 -0
  59. package/lib/typescript/commonjs/icons/benchmark-icon.d.ts.map +1 -0
  60. package/lib/typescript/commonjs/icons/env-icon.d.ts.map +1 -0
  61. package/lib/typescript/commonjs/icons/events-icon.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/icons/highlight-icon.d.ts.map +1 -0
  63. package/lib/typescript/commonjs/icons/icon-data.d.ts.map +1 -0
  64. package/lib/typescript/commonjs/icons/icon-factories.d.ts.map +1 -0
  65. package/lib/typescript/commonjs/icons/icon-primitives.d.ts.map +1 -0
  66. package/lib/typescript/commonjs/icons/icon-primitives.native.d.ts.map +1 -0
  67. package/lib/typescript/commonjs/icons/icon-renderer.d.ts.map +1 -0
  68. package/lib/typescript/commonjs/icons/network-icon.d.ts.map +1 -0
  69. package/lib/typescript/commonjs/icons/query-icon.d.ts.map +1 -0
  70. package/lib/typescript/commonjs/icons/redux-icon.d.ts.map +1 -0
  71. package/lib/typescript/commonjs/icons/renders-icon.d.ts.map +1 -0
  72. package/lib/typescript/commonjs/icons/routes-icon.d.ts.map +1 -0
  73. package/lib/typescript/commonjs/icons/sentry-icon.d.ts.map +1 -0
  74. package/lib/typescript/commonjs/icons/storage-icon.d.ts.map +1 -0
  75. package/lib/typescript/commonjs/icons/wifi-icon.d.ts.map +1 -0
  76. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  77. package/lib/typescript/commonjs/settings.d.ts +5 -0
  78. package/lib/typescript/commonjs/settings.d.ts.map +1 -0
  79. package/lib/typescript/commonjs/types.d.ts.map +1 -0
  80. package/lib/typescript/commonjs/utils.d.ts.map +1 -0
  81. package/lib/typescript/module/FloatingToolsStore.d.ts.map +1 -0
  82. package/lib/typescript/module/colors.d.ts.map +1 -0
  83. package/lib/typescript/module/constants.d.ts.map +1 -0
  84. package/lib/typescript/module/devToolsState.d.ts.map +1 -0
  85. package/lib/typescript/module/dial.d.ts.map +1 -0
  86. package/lib/typescript/module/easing.d.ts.map +1 -0
  87. package/lib/typescript/module/icons/benchmark-icon.d.ts.map +1 -0
  88. package/lib/typescript/module/icons/env-icon.d.ts.map +1 -0
  89. package/lib/typescript/module/icons/events-icon.d.ts.map +1 -0
  90. package/lib/typescript/module/icons/highlight-icon.d.ts.map +1 -0
  91. package/lib/typescript/module/icons/icon-data.d.ts.map +1 -0
  92. package/lib/typescript/module/icons/icon-factories.d.ts.map +1 -0
  93. package/lib/typescript/module/icons/icon-primitives.d.ts.map +1 -0
  94. package/lib/typescript/module/icons/icon-primitives.native.d.ts.map +1 -0
  95. package/lib/typescript/module/icons/icon-renderer.d.ts.map +1 -0
  96. package/lib/typescript/module/icons/network-icon.d.ts.map +1 -0
  97. package/lib/typescript/module/icons/query-icon.d.ts.map +1 -0
  98. package/lib/typescript/module/icons/redux-icon.d.ts.map +1 -0
  99. package/lib/typescript/module/icons/renders-icon.d.ts.map +1 -0
  100. package/lib/typescript/module/icons/routes-icon.d.ts.map +1 -0
  101. package/lib/typescript/module/icons/sentry-icon.d.ts.map +1 -0
  102. package/lib/typescript/module/icons/storage-icon.d.ts.map +1 -0
  103. package/lib/typescript/module/icons/wifi-icon.d.ts.map +1 -0
  104. package/lib/typescript/module/index.d.ts.map +1 -0
  105. package/lib/typescript/module/settings.d.ts +5 -0
  106. package/lib/typescript/module/settings.d.ts.map +1 -0
  107. package/lib/typescript/module/types.d.ts.map +1 -0
  108. package/lib/typescript/module/utils.d.ts.map +1 -0
  109. package/package.json +8 -8
  110. package/LICENSE +0 -58
@@ -1 +1,587 @@
1
- "use strict";import{withAlpha}from"./colors.js";export const SETTINGS_STORAGE_KEY="@react_buoy_dev_tools_settings";export const MAX_SETTINGS_DIAL_SLOTS=6;export const settingsTabs=[{key:"dial",label:"DIAL"},{key:"floating",label:"FLOATING"},{key:"settings",label:"SETTINGS"},{key:"pro",label:"PRO"}];export const settingsColors={background:"rgba(8, 12, 21, 0.98)",panel:"rgba(16, 22, 35, 0.98)",backdrop:"rgba(0, 0, 0, 0.85)",cardBackground:"#0F172A",cardBorder:"#25324A",cardBorderHover:"#3b4c6b",text:"#E6EEFF",textSecondary:"#B8BFC9",textMuted:"#7F91B2",textDim:"#7A8599",success:"#4AFF9F",warning:"#FFEB3B",error:"#FF5252",info:"#00B8E6",toggleOnBg:e=>withAlpha(e,"33"),toggleOnBorder:e=>withAlpha(e,"88"),toggleOffBg:"#1b2334",toggleOffBorder:"#2a3550",toggleOffText:"#8CA2C8",tabActiveBg:"rgba(0, 184, 230, 0.13)",tabActiveBorder:"#00B8E6",tabInactiveBg:"transparent",tabInactiveText:"#7A8599"};export const toolColors={query:"#FF4154",env:"#4AFF9F",sentry:"#FF5252",storage:"#BA68C8",network:"#4AFF9F",wifi:"#4AFF9F",environment:"#4AFF9F","debug-borders":"#10b981","highlight-updates":"#10b981","highlight-updates-modal":"#10b981",benchmark:"#F59E0B","route-events":"#FF9F1C",routes:"#FF9F1C",renders:"#10b981"};export const getToolColor=e=>toolColors[e]||settingsColors.info;export const toolLabels={query:"QUERY",env:"ENV",sentry:"SENTRY",storage:"STORAGE",network:"NET",wifi:"WIFI",environment:"ENV BADGE","debug-borders":"DEBUG BORDERS","highlight-updates":"HIGHLIGHT","highlight-updates-modal":"HIGHLIGHT MODAL",benchmark:"BENCHMARK","route-events":"ROUTES",routes:"ROUTES",renders:"HIGHLIGHT"};export const getToolLabel=(e,t)=>{if(t){const o=t.find(t=>t.id===e);if(o?.name)return o.name}return toolLabels[e]||e.toUpperCase().replace(/_/g," ").replace(/-/g," ")};export const toolDescriptions={query:"React Query inspector",env:"Environment variables debugger",sentry:"Error tracking & monitoring",storage:"AsyncStorage browser",network:"Network request logger",wifi:"Network status toggle",environment:"Environment badge indicator","debug-borders":"Component layout borders","highlight-updates":"View component render tracking","highlight-updates-modal":"Render count inspector",benchmark:"Performance benchmarks","route-events":"Route tracking & navigation inspector",routes:"Route tracking & navigation inspector",renders:"View component render tracking modal"};export const getToolDescription=(e,t)=>{if(t){const o=t.find(t=>t.id===e);if(o?.description)return o.description}return toolDescriptions[e]||""};export const settingsStyles={card:{borderRadius:999,paddingVertical:10,paddingHorizontal:14,marginBottom:10,borderWidth:1},cardInner:{gap:10},iconContainer:{width:28,height:28},toolName:{fontSize:13,fontWeight:"800"},toolDescription:{fontSize:11},toggle:{paddingHorizontal:12,paddingVertical:6,borderRadius:999,borderWidth:1,fontSize:11,fontWeight:"700"},tab:{paddingHorizontal:8,paddingVertical:5,borderRadius:4,fontSize:12,fontWeight:"600",letterSpacing:.5},sectionHeader:{marginBottom:12,paddingHorizontal:4},sectionTitle:{fontSize:10,fontWeight:"700",letterSpacing:1,textTransform:"uppercase"},scrollContent:{paddingTop:16,paddingBottom:24},section:{marginHorizontal:16,marginBottom:24}};export const globalSettingsConfig=[{key:"enableSharedModalDimensions",label:"SHARED MODAL SIZE",category:"MODAL",shortDescription:"Sync dimensions across all tools",fullDescription:"When enabled, all tool modals will share the same size and position. Resizing one modal will affect all others. When disabled, each tool remembers its own size and position independently.",recommendation:"Keep OFF for the best experience. This allows you to customize each tool's modal size separately. Enable only if you prefer uniform modal sizes across all dev tools."}];export const enforceDialLimit=(e,t=6)=>{let o=t;const n={};for(const[t,r]of Object.entries(e))r&&o>0?(n[t]=!0,o-=1):n[t]=!1;return n};export const sanitizeFloatingSettings=(e,t)=>{const{userStatus:o,environment:n,...r}=e,i=t?Object.entries(r).filter(([e])=>t.includes(e)):Object.entries(r);return{...Object.fromEntries(i),environment:n??!1}};export const mergeSettingsWithDefaults=(e,t,o)=>{if(!t)return e;const n={...e.dialTools,...t.dialTools??{}},r=o?.allowedDialKeys?Object.entries(n).filter(([e])=>o.allowedDialKeys?.includes(e)):Object.entries(n);return{dialTools:enforceDialLimit(Object.fromEntries(r)),floatingTools:sanitizeFloatingSettings({...e.floatingTools,...t.floatingTools??{}},o?.allowedFloatingKeys),globalSettings:{enableSharedModalDimensions:!1,...t.globalSettings??{}}}};export const generateDefaultSettings=(e=[],t,o)=>{const n={},r={},i=new Set(t??[]),s=new Set(o??[]);for(const t of e){const{id:e,slot:o="both"}=t;"dial"!==o&&"both"!==o||(n[e]=s.has(e)),"row"!==o&&"both"!==o||(r[e]=i.has(e))}return{dialTools:enforceDialLimit(n),floatingTools:{...r,environment:i.has("environment")},globalSettings:{enableSharedModalDimensions:!1}}};export const countEnabledTools=e=>Object.values(e).filter(Boolean).length;export const canEnableDialTool=(e,t,o=6)=>{const n=countEnabledTools(e);return!!e[t]||n<o};export const getEnabledToolIds=e=>({floating:Object.entries(e.floatingTools).filter(([e,t])=>t).map(([e])=>e),dial:Object.entries(e.dialTools).filter(([e,t])=>t).map(([e])=>e)});export class SettingsEventBus{listeners=new Set;emit(e){this.listeners.forEach(t=>{try{t(e)}catch(e){console.error("Error emitting settings event:",e)}})}addListener(e){return this.listeners.add(e),()=>this.listeners.delete(e)}clear(){this.listeners.clear()}get listenerCount(){return this.listeners.size}}export const settingsEventBus=new SettingsEventBus;
1
+ "use strict";
2
+
3
+ /**
4
+ * Settings - Shared settings types, constants, and utilities.
5
+ *
6
+ * Pure configuration and logic functions for dev tools settings.
7
+ * No React or platform-specific code.
8
+ *
9
+ * This module provides:
10
+ * - Storage keys and constants
11
+ * - Tab configuration
12
+ * - Tool colors, labels, descriptions
13
+ * - Styling constants for cards and toggles
14
+ * - Settings logic (enforce limits, merge, etc.)
15
+ * - Event bus for cross-component sync
16
+ */
17
+
18
+ import { withAlpha } from "./colors.js";
19
+
20
+ // =============================
21
+ // Constants
22
+ // =============================
23
+
24
+ /** Storage key for dev tools settings */
25
+ export const SETTINGS_STORAGE_KEY = '@react_buoy_dev_tools_settings';
26
+
27
+ /** Maximum number of tools in the dial menu */
28
+ export const MAX_SETTINGS_DIAL_SLOTS = 6;
29
+
30
+ // =============================
31
+ // Tab Configuration
32
+ // =============================
33
+
34
+ /** Tab configuration - shared across mobile and web */
35
+ export const settingsTabs = [{
36
+ key: 'dial',
37
+ label: 'DIAL'
38
+ }, {
39
+ key: 'floating',
40
+ label: 'FLOATING'
41
+ }, {
42
+ key: 'settings',
43
+ label: 'SETTINGS'
44
+ }, {
45
+ key: 'pro',
46
+ label: 'PRO'
47
+ }];
48
+
49
+ // =============================
50
+ // Settings Colors
51
+ // =============================
52
+
53
+ /**
54
+ * Color palette for the settings modal.
55
+ * Matches the mobile implementation for consistency.
56
+ */
57
+ export const settingsColors = {
58
+ // Base colors
59
+ background: 'rgba(8, 12, 21, 0.98)',
60
+ panel: 'rgba(16, 22, 35, 0.98)',
61
+ backdrop: 'rgba(0, 0, 0, 0.85)',
62
+ // Card colors
63
+ cardBackground: '#0F172A',
64
+ cardBorder: '#25324A',
65
+ cardBorderHover: '#3b4c6b',
66
+ // Text colors
67
+ text: '#E6EEFF',
68
+ textSecondary: '#B8BFC9',
69
+ textMuted: '#7F91B2',
70
+ textDim: '#7A8599',
71
+ // Status colors
72
+ success: '#4AFF9F',
73
+ warning: '#FFEB3B',
74
+ error: '#FF5252',
75
+ info: '#00B8E6',
76
+ // Toggle states
77
+ toggleOnBg: color => withAlpha(color, '33'),
78
+ toggleOnBorder: color => withAlpha(color, '88'),
79
+ toggleOffBg: '#1b2334',
80
+ toggleOffBorder: '#2a3550',
81
+ toggleOffText: '#8CA2C8',
82
+ // Tab colors
83
+ tabActiveBg: 'rgba(0, 184, 230, 0.13)',
84
+ tabActiveBorder: '#00B8E6',
85
+ tabInactiveBg: 'transparent',
86
+ tabInactiveText: '#7A8599'
87
+ };
88
+ // =============================
89
+ // Tool Colors
90
+ // =============================
91
+
92
+ /**
93
+ * Color mapping for each tool type.
94
+ * Used for card accents, toggle states, and icons.
95
+ */
96
+ export const toolColors = {
97
+ // Core tools
98
+ query: '#FF4154',
99
+ // React Query red
100
+ env: '#4AFF9F',
101
+ // Green
102
+ sentry: '#FF5252',
103
+ // Red
104
+ storage: '#BA68C8',
105
+ // Purple
106
+ network: '#4AFF9F',
107
+ // Green (matches NETWORK_ICON_COLOR in shared-ui)
108
+ wifi: '#4AFF9F',
109
+ // Green
110
+
111
+ // Display tools
112
+ environment: '#4AFF9F',
113
+ // Green
114
+ 'debug-borders': '#10b981',
115
+ // Emerald
116
+ 'highlight-updates': '#10b981',
117
+ // Emerald
118
+ 'highlight-updates-modal': '#10b981',
119
+ // Emerald
120
+
121
+ // Performance
122
+ benchmark: '#F59E0B',
123
+ // Amber
124
+
125
+ // Navigation
126
+ 'route-events': '#FF9F1C',
127
+ // Orange
128
+ routes: '#FF9F1C',
129
+ // Orange
130
+
131
+ // Render tracking
132
+ renders: '#10b981' // Emerald
133
+ };
134
+
135
+ /**
136
+ * Get the color for a specific tool.
137
+ *
138
+ * @param toolId - Tool identifier
139
+ * @returns Color string for the tool
140
+ */
141
+ export const getToolColor = toolId => {
142
+ return toolColors[toolId] || settingsColors.info;
143
+ };
144
+
145
+ // =============================
146
+ // Tool Labels
147
+ // =============================
148
+
149
+ /**
150
+ * Display labels for each tool.
151
+ * These are shown in the settings card headers.
152
+ */
153
+ export const toolLabels = {
154
+ query: 'QUERY',
155
+ env: 'ENV',
156
+ sentry: 'SENTRY',
157
+ storage: 'STORAGE',
158
+ network: 'NET',
159
+ wifi: 'WIFI',
160
+ environment: 'ENV BADGE',
161
+ 'debug-borders': 'DEBUG BORDERS',
162
+ 'highlight-updates': 'HIGHLIGHT',
163
+ 'highlight-updates-modal': 'HIGHLIGHT MODAL',
164
+ benchmark: 'BENCHMARK',
165
+ 'route-events': 'ROUTES',
166
+ routes: 'ROUTES',
167
+ renders: 'HIGHLIGHT'
168
+ };
169
+
170
+ /**
171
+ * Get the display label for a tool.
172
+ *
173
+ * @param toolId - Tool identifier
174
+ * @param availableApps - Optional list of available apps to check for custom names
175
+ * @returns Display label for the tool
176
+ */
177
+ export const getToolLabel = (toolId, availableApps) => {
178
+ // Check available apps first for custom names
179
+ if (availableApps) {
180
+ const app = availableApps.find(a => a.id === toolId);
181
+ if (app?.name) return app.name;
182
+ }
183
+
184
+ // Use predefined label or format from ID
185
+ return toolLabels[toolId] || toolId.toUpperCase().replace(/_/g, ' ').replace(/-/g, ' ');
186
+ };
187
+
188
+ // =============================
189
+ // Tool Descriptions
190
+ // =============================
191
+
192
+ /**
193
+ * Descriptions for each tool.
194
+ * These are shown in the settings card subtitles.
195
+ */
196
+ export const toolDescriptions = {
197
+ query: 'React Query inspector',
198
+ env: 'Environment variables debugger',
199
+ sentry: 'Error tracking & monitoring',
200
+ storage: 'AsyncStorage browser',
201
+ network: 'Network request logger',
202
+ wifi: 'Network status toggle',
203
+ environment: 'Environment badge indicator',
204
+ 'debug-borders': 'Component layout borders',
205
+ 'highlight-updates': 'View component render tracking',
206
+ 'highlight-updates-modal': 'Render count inspector',
207
+ benchmark: 'Performance benchmarks',
208
+ 'route-events': 'Route tracking & navigation inspector',
209
+ routes: 'Route tracking & navigation inspector',
210
+ renders: 'View component render tracking modal'
211
+ };
212
+
213
+ /**
214
+ * Get the description for a tool.
215
+ *
216
+ * @param toolId - Tool identifier
217
+ * @param availableApps - Optional list of available apps to check for custom descriptions
218
+ * @returns Description for the tool
219
+ */
220
+ export const getToolDescription = (toolId, availableApps) => {
221
+ // Check available apps first for custom descriptions
222
+ if (availableApps) {
223
+ const app = availableApps.find(a => a.id === toolId);
224
+ if (app?.description) return app.description;
225
+ }
226
+
227
+ // Use predefined description
228
+ return toolDescriptions[toolId] || '';
229
+ };
230
+
231
+ // =============================
232
+ // Settings Styling
233
+ // =============================
234
+
235
+ /**
236
+ * Styling configuration for settings UI elements.
237
+ * All numeric values that affect appearance.
238
+ */
239
+ export const settingsStyles = {
240
+ // Card styling
241
+ card: {
242
+ borderRadius: 999,
243
+ // Pill shape
244
+ paddingVertical: 10,
245
+ paddingHorizontal: 14,
246
+ marginBottom: 10,
247
+ borderWidth: 1
248
+ },
249
+ // Card inner layout
250
+ cardInner: {
251
+ gap: 10
252
+ },
253
+ // Icon container
254
+ iconContainer: {
255
+ width: 28,
256
+ height: 28
257
+ },
258
+ // Tool name text
259
+ toolName: {
260
+ fontSize: 13,
261
+ fontWeight: '800'
262
+ },
263
+ // Tool description text
264
+ toolDescription: {
265
+ fontSize: 11
266
+ },
267
+ // Toggle pill button
268
+ toggle: {
269
+ paddingHorizontal: 12,
270
+ paddingVertical: 6,
271
+ borderRadius: 999,
272
+ borderWidth: 1,
273
+ fontSize: 11,
274
+ fontWeight: '700'
275
+ },
276
+ // Tab styling
277
+ tab: {
278
+ paddingHorizontal: 8,
279
+ paddingVertical: 5,
280
+ borderRadius: 4,
281
+ fontSize: 12,
282
+ fontWeight: '600',
283
+ letterSpacing: 0.5
284
+ },
285
+ // Section header
286
+ sectionHeader: {
287
+ marginBottom: 12,
288
+ paddingHorizontal: 4
289
+ },
290
+ // Section title
291
+ sectionTitle: {
292
+ fontSize: 10,
293
+ fontWeight: '700',
294
+ letterSpacing: 1,
295
+ textTransform: 'uppercase'
296
+ },
297
+ // Scroll content
298
+ scrollContent: {
299
+ paddingTop: 16,
300
+ paddingBottom: 24
301
+ },
302
+ // Section margins
303
+ section: {
304
+ marginHorizontal: 16,
305
+ marginBottom: 24
306
+ }
307
+ };
308
+
309
+ // =============================
310
+ // Global Settings Configuration
311
+ // =============================
312
+
313
+ /**
314
+ * Configuration for global settings cards.
315
+ */
316
+ export const globalSettingsConfig = [{
317
+ key: 'enableSharedModalDimensions',
318
+ label: 'SHARED MODAL SIZE',
319
+ category: 'MODAL',
320
+ shortDescription: 'Sync dimensions across all tools',
321
+ fullDescription: 'When enabled, all tool modals will share the same size and position. Resizing one modal will affect all others. When disabled, each tool remembers its own size and position independently.',
322
+ recommendation: 'Keep OFF for the best experience. This allows you to customize each tool\'s modal size separately. Enable only if you prefer uniform modal sizes across all dev tools.'
323
+ }, {
324
+ key: 'expandableWindowControls',
325
+ label: 'EXPAND CONTROLS',
326
+ category: 'MODAL',
327
+ shortDescription: 'iPad-style expandable window buttons',
328
+ fullDescription: 'When enabled, the window control buttons (minimize, toggle mode, close) start as small dots and expand into larger, easy-to-tap buttons when pressed — similar to iPad window controls. When disabled, buttons are directly tappable at their small size.',
329
+ recommendation: 'Keep ON for touch devices where the small buttons are hard to press. Turn OFF if you prefer direct single-tap access (e.g. when using a mouse or simulator).'
330
+ }];
331
+
332
+ // =============================
333
+ // Types
334
+ // =============================
335
+
336
+ /**
337
+ * Global settings that apply to all dev tools.
338
+ * These settings override individual tool configurations.
339
+ */
340
+
341
+ /**
342
+ * Serialized preferences that power the floating dev tools UI.
343
+ * Values persist across sessions via storage so teams can tailor
344
+ * which tools appear in the dial or floating row.
345
+ */
346
+
347
+ /**
348
+ * Configuration for an available tool/app.
349
+ * Note: name and description are optional - if not provided,
350
+ * getToolLabel() and getToolDescription() will use shared defaults.
351
+ */
352
+
353
+ /**
354
+ * Tool metadata for display in settings.
355
+ */
356
+
357
+ // =============================
358
+ // Utility Functions
359
+ // =============================
360
+
361
+ /**
362
+ * Enforces the dial slot limit by enabling only the first N tools.
363
+ * Tools are processed in order, so tools appearing first in the Record
364
+ * have priority when the limit is reached.
365
+ *
366
+ * @param dialTools - Map of tool ids to enabled state
367
+ * @param maxSlots - Maximum number of enabled tools (default: MAX_SETTINGS_DIAL_SLOTS)
368
+ * @returns New record with limit enforced
369
+ */
370
+ export const enforceDialLimit = (dialTools, maxSlots = MAX_SETTINGS_DIAL_SLOTS) => {
371
+ let remaining = maxSlots;
372
+ const limited = {};
373
+ for (const [id, enabled] of Object.entries(dialTools)) {
374
+ if (enabled && remaining > 0) {
375
+ limited[id] = true;
376
+ remaining -= 1;
377
+ } else {
378
+ limited[id] = false;
379
+ }
380
+ }
381
+ return limited;
382
+ };
383
+
384
+ /**
385
+ * Sanitizes floating tools settings by removing unknown keys and ensuring
386
+ * the environment field is always present.
387
+ *
388
+ * @param floating - Floating tools settings object
389
+ * @param allowedKeys - Optional list of allowed tool keys (environment is always allowed)
390
+ * @returns Sanitized floating tools settings
391
+ */
392
+ export const sanitizeFloatingSettings = (floating, allowedKeys) => {
393
+ const {
394
+ userStatus,
395
+ environment,
396
+ ...rest
397
+ } = floating;
398
+ const filteredEntries = allowedKeys ? Object.entries(rest).filter(([key]) => allowedKeys.includes(key)) : Object.entries(rest);
399
+ return {
400
+ ...Object.fromEntries(filteredEntries),
401
+ environment: environment ?? false
402
+ };
403
+ };
404
+
405
+ /**
406
+ * Options for merging settings with defaults.
407
+ */
408
+
409
+ /**
410
+ * Merges stored settings with defaults, ensuring all required fields exist
411
+ * and limits are enforced.
412
+ *
413
+ * @param defaults - Default settings to use as base
414
+ * @param stored - Stored settings to merge (optional)
415
+ * @param options - Optional filtering options
416
+ * @returns Merged settings with all fields and limits enforced
417
+ */
418
+ export const mergeSettingsWithDefaults = (defaults, stored, options) => {
419
+ if (!stored) return defaults;
420
+ const combinedDial = {
421
+ ...defaults.dialTools,
422
+ ...(stored.dialTools ?? {})
423
+ };
424
+ const dialEntries = options?.allowedDialKeys ? Object.entries(combinedDial).filter(([key]) => options.allowedDialKeys?.includes(key)) : Object.entries(combinedDial);
425
+ const mergedDial = enforceDialLimit(Object.fromEntries(dialEntries));
426
+ return {
427
+ dialTools: mergedDial,
428
+ floatingTools: sanitizeFloatingSettings({
429
+ ...defaults.floatingTools,
430
+ ...(stored.floatingTools ?? {})
431
+ }, options?.allowedFloatingKeys),
432
+ globalSettings: {
433
+ enableSharedModalDimensions: false,
434
+ // Default to false
435
+ expandableWindowControls: true,
436
+ // Default to true - expandable on touch devices
437
+ ...(stored.globalSettings ?? {})
438
+ }
439
+ };
440
+ };
441
+
442
+ /**
443
+ * Generates default settings based on available tools and optional team defaults.
444
+ *
445
+ * @param availableTools - List of available tools from auto-discovery
446
+ * @param defaultFloatingTools - Optional array of tool IDs to enable by default in floating bubble
447
+ * @param defaultDialTools - Optional array of tool IDs to enable by default in dial menu
448
+ * @returns Default settings with specified tools enabled
449
+ */
450
+ export const generateDefaultSettings = (availableTools = [], defaultFloatingTools, defaultDialTools) => {
451
+ const dialDefaults = {};
452
+ const floatingDefaults = {};
453
+
454
+ // Create sets for quick lookup of default-enabled tools
455
+ const enabledFloatingSet = new Set(defaultFloatingTools ?? []);
456
+ const enabledDialSet = new Set(defaultDialTools ?? []);
457
+ for (const tool of availableTools) {
458
+ const {
459
+ id,
460
+ slot = 'both'
461
+ } = tool;
462
+ if (slot === 'dial' || slot === 'both') {
463
+ // Enable if in defaultDialTools, otherwise false
464
+ dialDefaults[id] = enabledDialSet.has(id);
465
+ }
466
+ if (slot === 'row' || slot === 'both') {
467
+ // Enable if in defaultFloatingTools, otherwise false
468
+ floatingDefaults[id] = enabledFloatingSet.has(id);
469
+ }
470
+ }
471
+ return {
472
+ dialTools: enforceDialLimit(dialDefaults),
473
+ floatingTools: {
474
+ ...floatingDefaults,
475
+ // Special: environment badge - check if 'environment' is in the floating defaults
476
+ environment: enabledFloatingSet.has('environment')
477
+ },
478
+ globalSettings: {
479
+ enableSharedModalDimensions: false,
480
+ // Default to false - each modal has its own persistence
481
+ expandableWindowControls: true // Default to true - expandable on touch devices
482
+ }
483
+ };
484
+ };
485
+
486
+ /**
487
+ * Counts the number of enabled tools in a settings record.
488
+ *
489
+ * @param tools - Record of tool ids to enabled state
490
+ * @returns Count of enabled tools
491
+ */
492
+ export const countEnabledTools = tools => {
493
+ return Object.values(tools).filter(Boolean).length;
494
+ };
495
+
496
+ /**
497
+ * Checks if a dial tool can be enabled (respects slot limit).
498
+ *
499
+ * @param dialTools - Current dial tools settings
500
+ * @param toolId - ID of the tool to check
501
+ * @param maxSlots - Maximum number of slots (default: MAX_SETTINGS_DIAL_SLOTS)
502
+ * @returns true if the tool can be enabled
503
+ */
504
+ export const canEnableDialTool = (dialTools, toolId, maxSlots = MAX_SETTINGS_DIAL_SLOTS) => {
505
+ const currentEnabled = countEnabledTools(dialTools);
506
+ const isCurrentlyEnabled = dialTools[toolId];
507
+
508
+ // If already enabled, it can stay enabled
509
+ if (isCurrentlyEnabled) return true;
510
+
511
+ // If not enabled and at limit, cannot enable
512
+ return currentEnabled < maxSlots;
513
+ };
514
+
515
+ /**
516
+ * Extracts enabled tool IDs from a settings record.
517
+ *
518
+ * @param settings - DevTools settings
519
+ * @returns Object with arrays of enabled floating and dial tool IDs
520
+ */
521
+ export const getEnabledToolIds = settings => {
522
+ const enabledFloating = Object.entries(settings.floatingTools).filter(([_, enabled]) => enabled).map(([id]) => id);
523
+ const enabledDial = Object.entries(settings.dialTools).filter(([_, enabled]) => enabled).map(([id]) => id);
524
+ return {
525
+ floating: enabledFloating,
526
+ dial: enabledDial
527
+ };
528
+ };
529
+
530
+ // =============================
531
+ // Settings Event Bus
532
+ // =============================
533
+
534
+ /**
535
+ * Generic event bus for broadcasting settings changes.
536
+ * Platform-agnostic implementation for synchronizing settings
537
+ * across components.
538
+ */
539
+ export class SettingsEventBus {
540
+ listeners = new Set();
541
+
542
+ /**
543
+ * Emit a settings change to all listeners.
544
+ *
545
+ * @param payload - The new settings value
546
+ */
547
+ emit(payload) {
548
+ this.listeners.forEach(listener => {
549
+ try {
550
+ listener(payload);
551
+ } catch (e) {
552
+ console.error('Error emitting settings event:', e);
553
+ }
554
+ });
555
+ }
556
+
557
+ /**
558
+ * Add a listener for settings changes.
559
+ *
560
+ * @param listener - Callback function to invoke on changes
561
+ * @returns Unsubscribe function
562
+ */
563
+ addListener(listener) {
564
+ this.listeners.add(listener);
565
+ return () => this.listeners.delete(listener);
566
+ }
567
+
568
+ /**
569
+ * Remove all listeners.
570
+ */
571
+ clear() {
572
+ this.listeners.clear();
573
+ }
574
+
575
+ /**
576
+ * Get the number of active listeners.
577
+ */
578
+ get listenerCount() {
579
+ return this.listeners.size;
580
+ }
581
+ }
582
+
583
+ /**
584
+ * Default settings event bus instance.
585
+ * Use this for broadcasting settings changes across the app.
586
+ */
587
+ export const settingsEventBus = new SettingsEventBus();
@@ -1 +1,66 @@
1
- "use strict";export function getUserStatusConfig(t,o){switch(t){case"admin":return{label:"Admin",dotColor:o.success,textColor:o.success};case"internal":return{label:"Internal",dotColor:o.optional,textColor:o.optional};default:return{label:"User",dotColor:o.muted,textColor:o.secondary}}}export function getGripIconLayout(t){return{dotSize:Math.max(2,Math.round(t/6)),columnGap:Math.max(2,Math.round(t/12)),rowGap:Math.max(2,Math.round(t/12))}}export function filterValidChildren(t){return t.filter(t=>null!=t&&!1!==t)}
1
+ "use strict";
2
+
3
+ /**
4
+ * Shared utility functions for floating tools.
5
+ * Platform-agnostic - no React or DOM dependencies.
6
+ */
7
+
8
+ // =============================
9
+ // User Status Configuration
10
+ // =============================
11
+
12
+ /**
13
+ * Get display configuration for a user role.
14
+ * Used by both web and mobile renderers.
15
+ */
16
+ export function getUserStatusConfig(userRole, colors) {
17
+ switch (userRole) {
18
+ case 'admin':
19
+ return {
20
+ label: 'Admin',
21
+ dotColor: colors.success,
22
+ textColor: colors.success
23
+ };
24
+ case 'internal':
25
+ return {
26
+ label: 'Internal',
27
+ dotColor: colors.optional,
28
+ textColor: colors.optional
29
+ };
30
+ case 'user':
31
+ default:
32
+ return {
33
+ label: 'User',
34
+ dotColor: colors.muted,
35
+ textColor: colors.secondary
36
+ };
37
+ }
38
+ }
39
+
40
+ // =============================
41
+ // Grip Icon Layout
42
+ // =============================
43
+
44
+ /**
45
+ * Calculate grip icon layout dimensions based on size.
46
+ * Creates a 2x3 dot grid pattern.
47
+ */
48
+ export function getGripIconLayout(size) {
49
+ return {
50
+ dotSize: Math.max(2, Math.round(size / 6)),
51
+ columnGap: Math.max(2, Math.round(size / 12)),
52
+ rowGap: Math.max(2, Math.round(size / 12))
53
+ };
54
+ }
55
+
56
+ // =============================
57
+ // Children Utilities
58
+ // =============================
59
+
60
+ /**
61
+ * Filter valid React children (removes null, undefined, false).
62
+ * Works with both web and React Native.
63
+ */
64
+ export function filterValidChildren(children) {
65
+ return children.filter(child => child != null && child !== false);
66
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingToolsStore.d.ts","sourceRoot":"","sources":["../../../src/FloatingToolsStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EAEN,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACd,MAAM,SAAS,CAAC;AAUjB,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B,qBAAa,kBAAkB;IAE7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAO;IAGzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,yBAAyB,CAAU;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAiB;IAGjC,OAAO,CAAC,gBAAgB,CAAC,CAA+B;IACxD,OAAO,CAAC,cAAc,CAAC,CAA4B;IACnD,OAAO,CAAC,gBAAgB,CAAC,CAA8B;IAGvD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAyB;IAG9C,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,aAAa,CAAS;IAG9B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAAqB;gBAE9B,OAAO,EAAE,oBAAoB;IA4BzC,SAAS,GAAI,UAAU,QAAQ,KAAG,CAAC,MAAM,IAAI,CAAC,CAG5C;IAEF,WAAW,QAAO,kBAAkB,CAElC;IAEF,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,MAAM;IASd;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8CjC;;OAEG;IACH,SAAS,IAAI,MAAM;IASnB;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ;IAQzC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAMhC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQ/B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAWlD;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;YAQxB,YAAY;IAa1B,OAAO,CAAC,qBAAqB;IAS7B;;;OAGG;IACH,cAAc,IAAI;QAAE,cAAc,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE;IAkCjE;;OAEG;IACH,SAAS,IAAI;QAAE,cAAc,EAAE,QAAQ,CAAA;KAAE;IAezC;;OAEG;IACH,SAAS,IAAI;QAAE,cAAc,EAAE,QAAQ,CAAA;KAAE;IA2BzC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAM3C;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE;IAgCjF;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa;IA2DlD;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAUnC,OAAO,IAAI,IAAI;CAOhB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B,4BAA4B;;IAG5B,wCAAwC;;IAGxC,yBAAyB;;IAGzB,0CAA0C;;IAG1C,sCAAsC;;IAGtC,2CAA2C;;IAG3C,6BAA6B;;IAG7B,uCAAuC;;IAGvC,8DAA8D;;CAEtD,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAErE;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CASvE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sEAAsE;AACtE,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,6DAA6D;AAC7D,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,yCAAyC;AACzC,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,4CAA4C;AAC5C,eAAO,MAAM,YAAY;;;CAGf,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devToolsState.d.ts","sourceRoot":"","sources":["../../../src/devToolsState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,oCAAoC;IACpC,iBAAiB,EAAE,cAAc,CAAC;IAClC,qEAAqE;IACrE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAiB3B;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,GACrB,aAAa,CA2Bf;AAMD,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAA4B;gBAEjC,oBAAoB,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAQzD;;;OAGG;IACH,QAAQ,QAAO,aAAa,CAE1B;IAEF;;;OAGG;IACH,cAAc,QAAO,aAAa,CAEhC;IAEF;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,oBAAoB,IAAI,cAAc;IAQtC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAUtC;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAIzC;;;OAGG;IACH,UAAU,IAAI,IAAI;IAQlB;;;;;OAKG;IACH,SAAS,GAAI,UAAU,QAAQ,KAAG,CAAC,MAAM,IAAI,CAAC,CAK5C;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI;CAId;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dial.d.ts","sourceRoot":"","sources":["../../../src/dial.ts"],"names":[],"mappings":"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"}