@buoy-gg/network 7.0.15 → 7.0.16

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 (107) hide show
  1. package/lib/commonjs/index.web.js +395 -0
  2. package/lib/commonjs/network/components/DataViewer.web.js +879 -0
  3. package/lib/commonjs/network/components/NetworkCopyScreen.web.js +48 -0
  4. package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +1242 -0
  5. package/lib/commonjs/network/components/NetworkDetailScreen.web.js +101 -0
  6. package/lib/commonjs/network/components/NetworkDetailStepper.web.js +296 -0
  7. package/lib/commonjs/network/components/NetworkEventDetailView.web.js +1498 -0
  8. package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +802 -0
  9. package/lib/commonjs/network/components/NetworkFilterScreen.web.js +55 -0
  10. package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1310 -0
  11. package/lib/commonjs/network/components/NetworkHeaderLive.web.js +604 -0
  12. package/lib/commonjs/network/components/NetworkListScreen.js +2 -1
  13. package/lib/commonjs/network/components/NetworkListScreen.web.js +607 -0
  14. package/lib/commonjs/network/components/NetworkModal.js +12 -3
  15. package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +232 -0
  16. package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +942 -0
  17. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +133 -0
  18. package/lib/commonjs/network/components/NetworkOverridesButton.web.js +143 -0
  19. package/lib/commonjs/network/components/NetworkOverridesScreen.js +160 -126
  20. package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +830 -0
  21. package/lib/commonjs/network/components/NetworkSavedScreen.web.js +459 -0
  22. package/lib/commonjs/network/components/response-editor/Explorer.web.js +1136 -0
  23. package/lib/commonjs/network/hooks/useNetworkEventList.js +12 -2
  24. package/lib/commonjs/network/overrides/applyToXhr.js +276 -15
  25. package/lib/commonjs/network/utils/generateNetworkCopyText.js +32 -5
  26. package/lib/commonjs/network/utils/networkEventStore.js +12 -4
  27. package/lib/commonjs/network/utils/networkListener.js +1 -16
  28. package/lib/module/index.web.js +81 -0
  29. package/lib/module/network/components/DataViewer.web.js +875 -0
  30. package/lib/module/network/components/NetworkCopyScreen.web.js +44 -0
  31. package/lib/module/network/components/NetworkCopySettingsView.web.js +1237 -0
  32. package/lib/module/network/components/NetworkDetailScreen.web.js +97 -0
  33. package/lib/module/network/components/NetworkDetailStepper.web.js +294 -0
  34. package/lib/module/network/components/NetworkEventDetailView.web.js +1496 -0
  35. package/lib/module/network/components/NetworkEventItemCompact.web.js +800 -0
  36. package/lib/module/network/components/NetworkFilterScreen.web.js +51 -0
  37. package/lib/module/network/components/NetworkFilterViewV3.web.js +1306 -0
  38. package/lib/module/network/components/NetworkHeaderLive.web.js +598 -0
  39. package/lib/module/network/components/NetworkListScreen.js +2 -1
  40. package/lib/module/network/components/NetworkListScreen.web.js +605 -0
  41. package/lib/module/network/components/NetworkModal.js +12 -3
  42. package/lib/module/network/components/NetworkNumberPrompt.web.js +230 -0
  43. package/lib/module/network/components/NetworkOverrideEditor.web.js +939 -0
  44. package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +131 -0
  45. package/lib/module/network/components/NetworkOverridesButton.web.js +141 -0
  46. package/lib/module/network/components/NetworkOverridesScreen.js +161 -127
  47. package/lib/module/network/components/NetworkOverridesScreen.web.js +826 -0
  48. package/lib/module/network/components/NetworkSavedScreen.web.js +457 -0
  49. package/lib/module/network/components/response-editor/Explorer.web.js +1133 -0
  50. package/lib/module/network/hooks/useNetworkEventList.js +12 -2
  51. package/lib/module/network/overrides/applyToXhr.js +275 -15
  52. package/lib/module/network/utils/generateNetworkCopyText.js +28 -1
  53. package/lib/module/network/utils/networkEventStore.js +12 -4
  54. package/lib/module/network/utils/networkListener.js +1 -16
  55. package/lib/typescript/index.web.d.ts +56 -0
  56. package/lib/typescript/index.web.d.ts.map +1 -0
  57. package/lib/typescript/network/components/DataViewer.web.d.ts +78 -0
  58. package/lib/typescript/network/components/DataViewer.web.d.ts.map +1 -0
  59. package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts +27 -0
  60. package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +1 -0
  61. package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts +68 -0
  62. package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +1 -0
  63. package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts +45 -0
  64. package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +1 -0
  65. package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts +40 -0
  66. package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +1 -0
  67. package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts +67 -0
  68. package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +1 -0
  69. package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts +58 -0
  70. package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +1 -0
  71. package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts +28 -0
  72. package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +1 -0
  73. package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts +74 -0
  74. package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +1 -0
  75. package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts +112 -0
  76. package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +1 -0
  77. package/lib/typescript/network/components/NetworkListScreen.d.ts.map +1 -1
  78. package/lib/typescript/network/components/NetworkListScreen.web.d.ts +63 -0
  79. package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +1 -0
  80. package/lib/typescript/network/components/NetworkModal.d.ts.map +1 -1
  81. package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts +38 -0
  82. package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +1 -0
  83. package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts +43 -0
  84. package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +1 -0
  85. package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts +32 -0
  86. package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +1 -0
  87. package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts +26 -0
  88. package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +1 -0
  89. package/lib/typescript/network/components/NetworkOverridesScreen.d.ts +9 -0
  90. package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +1 -1
  91. package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts +69 -0
  92. package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +1 -0
  93. package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts +67 -0
  94. package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +1 -0
  95. package/lib/typescript/network/components/response-editor/Explorer.web.d.ts +56 -0
  96. package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +1 -0
  97. package/lib/typescript/network/hooks/useNetworkEventList.d.ts +10 -0
  98. package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +1 -1
  99. package/lib/typescript/network/overrides/__tests__/applyToXhr.test.d.ts.map +1 -1
  100. package/lib/typescript/network/overrides/applyToXhr.d.ts +40 -14
  101. package/lib/typescript/network/overrides/applyToXhr.d.ts.map +1 -1
  102. package/lib/typescript/network/utils/generateNetworkCopyText.d.ts +34 -1
  103. package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +1 -1
  104. package/lib/typescript/network/utils/networkEventStore.d.ts.map +1 -1
  105. package/lib/typescript/network/utils/networkListener.d.ts +0 -1
  106. package/lib/typescript/network/utils/networkListener.d.ts.map +1 -1
  107. package/package.json +2 -2
@@ -0,0 +1,459 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NetworkSavedScreen = NetworkSavedScreen;
7
+ var _react = require("react");
8
+ var _NetworkEventItemCompact = require("./NetworkEventItemCompact.web");
9
+ var _DataViewer = require("./DataViewer.web");
10
+ var _generateNetworkCopyText = require("../utils/generateNetworkCopyText");
11
+ var _selectSavedEvents = require("../utils/selectSavedEvents");
12
+ var _useNetworkSaved = require("../hooks/useNetworkSaved");
13
+ var _networkSavedStore = require("../utils/networkSavedStore");
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ /**
16
+ * NetworkSavedScreen.web — DOM twin of NetworkSavedScreen.tsx.
17
+ *
18
+ * The SAVED screen — the network tool's favorites list. Everything here is
19
+ * read from the persisted saved store, never from the live event store: these
20
+ * requests survive a Clear, the 500-event cap, and an app restart. Identical
21
+ * prop contract, hook usage and derivation order as the native file — the
22
+ * data layer is REUSED, not forked (`useNetworkSaved`, `selectSavedEvents`,
23
+ * `generateNetworkCopyText` are all platform-free).
24
+ *
25
+ * Rows are the same row component the live list uses
26
+ * (`NetworkEventItemCompact.web`), so a saved request looks exactly like the
27
+ * request it was. Long-press here UNSAVES rather than pins — in this list
28
+ * "get rid of it" is the action the row affords (pinning stays on the detail
29
+ * header). Row tap opens the detail view via `onEventPress` — hosts wire it
30
+ * to `networkSelectionStore.select` and pass `fromSaved` to the detail
31
+ * screen, so the prev/next footer steps through THIS list (native behavior;
32
+ * `NetworkDetailStepper.web` already derives it from `selectSavedEvents`).
33
+ *
34
+ * Stable-tree contract (rule4): hooks run unconditionally, then the
35
+ * component returns null when not visible.
36
+ *
37
+ * shared-ui RN chrome is replicated as DOM with provenance (web consumers
38
+ * resolve `@buoy-gg/shared-ui` to a minimal shim):
39
+ * - `macOSColors` / `buoyColors` — inlined verbatim subsets from
40
+ * shared/src/ui/gameUI/constants/.
41
+ * - Icons — inline lucide SVGs (shared-ui's icons are lucide re-exports).
42
+ * - `CopyButton` — the DOM twin exported by DataViewer.web (same lazy
43
+ * function-value contract, colors and 1500ms feedback as native).
44
+ * - `NetworkUpgradeBanner` — inlined DOM twin, values from
45
+ * NetworkUpgradeBanner.tsx + license/FeatureGate.tsx `proBadge` styles
46
+ * (static gold-less "PRO" — the Weekend Pass variant reads
47
+ * `useProAccess` from @buoy-gg/license, not part of the web port).
48
+ *
49
+ * Intentional deviations (all logged):
50
+ * - FlatList virtualization → a plain scrolled div (same deal as
51
+ * NetworkListScreen.web: MAX_SAVED caps the list at 50 rows, and the
52
+ * window/batch tuning + `extraData` are FlatList-only concerns).
53
+ * - `CopySettings` is imported from the platform-free
54
+ * `generateNetworkCopyText` module (the native screen imports it from
55
+ * NetworkCopySettingsView.tsx, which would drag react-native in).
56
+ *
57
+ * @platform React DOM Web
58
+ */
59
+
60
+ // =============================
61
+ // Native palettes (provenance)
62
+ // =============================
63
+
64
+ /** macOSColors subset — shared/src/ui/gameUI/constants/macOSDesignSystemColors.ts, verbatim. */const macOSColors = {
65
+ background: {
66
+ input: "#26262A"
67
+ },
68
+ border: {
69
+ default: "#2D2D2F"
70
+ },
71
+ text: {
72
+ primary: "#F5F5F7",
73
+ secondary: "#A1A1A6",
74
+ muted: "#8E8E93",
75
+ disabled: "#9E9EA0"
76
+ },
77
+ semantic: {
78
+ success: "#34C759",
79
+ error: "#FF453A",
80
+ debug: "#BF5AF2"
81
+ }
82
+ };
83
+
84
+ /** buoyColors subset — shared/src/ui/gameUI/constants/gameUIColors.ts (macOS theme), verbatim. */
85
+ const buoy = {
86
+ card: "#1A1A1A",
87
+ text: "#E0E0E0",
88
+ textMuted: "#888888",
89
+ primary: "#20C997"
90
+ };
91
+
92
+ // =============================
93
+ // Inline lucide icons (shared-ui icons are lucide re-exports)
94
+ // =============================
95
+
96
+ function Svg({
97
+ size = 14,
98
+ color = "currentColor",
99
+ children
100
+ }) {
101
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
102
+ width: size,
103
+ height: size,
104
+ viewBox: "0 0 24 24",
105
+ fill: "none",
106
+ stroke: color,
107
+ strokeWidth: 2,
108
+ strokeLinecap: "round",
109
+ strokeLinejoin: "round",
110
+ style: {
111
+ flexShrink: 0,
112
+ display: "block"
113
+ },
114
+ children: children
115
+ });
116
+ }
117
+ const Bookmark = p => /*#__PURE__*/(0, _jsxRuntime.jsx)(Svg, {
118
+ ...p,
119
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
120
+ d: "m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z"
121
+ })
122
+ });
123
+ const Search = p => /*#__PURE__*/(0, _jsxRuntime.jsxs)(Svg, {
124
+ ...p,
125
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("circle", {
126
+ cx: "11",
127
+ cy: "11",
128
+ r: "8"
129
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
130
+ d: "m21 21-4.3-4.3"
131
+ })]
132
+ });
133
+ const Zap = p => /*#__PURE__*/(0, _jsxRuntime.jsx)(Svg, {
134
+ ...p,
135
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("polygon", {
136
+ points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2"
137
+ })
138
+ });
139
+
140
+ // =============================
141
+ // NetworkUpgradeBanner DOM twin (provenance: NetworkUpgradeBanner.tsx +
142
+ // license/FeatureGate.tsx proBadge styles — see the deviations log)
143
+ // =============================
144
+
145
+ function NetworkUpgradeBannerWeb({
146
+ title,
147
+ subtitle,
148
+ onPress
149
+ }) {
150
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("button", {
151
+ type: "button",
152
+ style: styles.upgradeBanner,
153
+ onClick: onPress,
154
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
155
+ style: styles.upgradeContent,
156
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
157
+ style: styles.upgradeLeft,
158
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Zap, {
159
+ size: 16,
160
+ color: buoy.primary
161
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
162
+ style: styles.upgradeTitle,
163
+ children: title
164
+ })]
165
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
166
+ style: styles.proBadge,
167
+ children: "PRO"
168
+ })]
169
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
170
+ style: styles.upgradeSubtitle,
171
+ children: subtitle
172
+ })]
173
+ });
174
+ }
175
+
176
+ // =============================
177
+ // Screen (structure mirrors the native file 1:1)
178
+ // =============================
179
+
180
+ function EmptyState() {
181
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
182
+ style: styles.emptyState,
183
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Bookmark, {
184
+ size: 32,
185
+ color: macOSColors.text.muted
186
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
187
+ style: styles.emptyTitle,
188
+ children: "No saved requests"
189
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
190
+ style: styles.emptyText,
191
+ children: "Open a request and tap the bookmark to keep it here \u2014 saved requests survive Clear and app restarts."
192
+ })]
193
+ });
194
+ }
195
+ function NetworkSavedScreen({
196
+ visible,
197
+ isPro,
198
+ copySettings,
199
+ search: searchProp,
200
+ onSearchChange,
201
+ onEventPress,
202
+ onUpgradePress
203
+ }) {
204
+ const {
205
+ savedRecords,
206
+ pinnedLiveIds,
207
+ toggleSave,
208
+ clearSaved
209
+ } = (0, _useNetworkSaved.useNetworkSaved)();
210
+ const [searchState, setSearchState] = (0, _react.useState)("");
211
+ const controlled = searchProp != null && onSearchChange != null;
212
+ const search = controlled ? searchProp : searchState;
213
+ const setSearch = controlled ? onSearchChange : setSearchState;
214
+ if (!visible) return null;
215
+
216
+ // Shared with the detail footer, so "Next" can't disagree with the row below.
217
+ const {
218
+ events: filtered,
219
+ lockedCount
220
+ } = (0, _selectSavedEvents.selectSavedEvents)(savedRecords, isPro, search);
221
+ const handleLongPress = event => {
222
+ toggleSave(event);
223
+ };
224
+ const renderListFooter = () => {
225
+ if (lockedCount === 0) return null;
226
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(NetworkUpgradeBannerWeb, {
227
+ title: `${lockedCount} saved ${lockedCount === 1 ? "request" : "requests"} locked`,
228
+ subtitle: `Free keeps ${_networkSavedStore.FREE_TIER_SAVED_LIMIT}. Upgrade to Pro to unlock the rest.`,
229
+ onPress: onUpgradePress
230
+ });
231
+ };
232
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
233
+ style: styles.root,
234
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
235
+ style: styles.toolbar,
236
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Bookmark, {
237
+ size: 11,
238
+ color: macOSColors.semantic.debug
239
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
240
+ style: styles.toolbarTitle,
241
+ children: ["SAVED \xB7 ", savedRecords.length, isPro ? "" : `/${_networkSavedStore.FREE_TIER_SAVED_LIMIT}`]
242
+ }), isPro ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_DataViewer.CopyButton
243
+ // Lazy value, resolved at press time — no string is built per
244
+ // render, and it always reflects the current list.
245
+ , {
246
+ value: () => (0, _generateNetworkCopyText.generateNetworkCopyText)(filtered, copySettings),
247
+ size: 13,
248
+ buttonStyle: {
249
+ ...styles.toolbarButton,
250
+ ...(filtered.length === 0 ? styles.toolbarButtonDisabled : null)
251
+ },
252
+ colors: {
253
+ idle: macOSColors.text.secondary,
254
+ success: macOSColors.semantic.success,
255
+ error: macOSColors.semantic.error
256
+ },
257
+ "aria-label": "Copy saved requests"
258
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
259
+ type: "button",
260
+ onClick: clearSaved,
261
+ style: styles.toolbarClear,
262
+ disabled: savedRecords.length === 0,
263
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
264
+ style: {
265
+ ...styles.toolbarClearText,
266
+ ...(savedRecords.length === 0 ? styles.toolbarClearTextDisabled : null)
267
+ },
268
+ children: "Clear all"
269
+ })
270
+ })]
271
+ }), savedRecords.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
272
+ style: styles.searchRow,
273
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Search, {
274
+ size: 13,
275
+ color: macOSColors.text.secondary
276
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
277
+ style: styles.searchInput,
278
+ placeholder: "Search saved requests\u2026",
279
+ value: search,
280
+ onChange: e => setSearch(e.target.value),
281
+ "aria-label": "Search saved requests",
282
+ autoCapitalize: "none",
283
+ autoCorrect: "off",
284
+ autoComplete: "off",
285
+ spellCheck: false
286
+ })]
287
+ }) : null, savedRecords.length === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(EmptyState, {}) :
288
+ /*#__PURE__*/
289
+ // DEVIATION: FlatList → plain scrolled div (see file header). The
290
+ // list still OWNS scrolling — hosts render this screen without a
291
+ // scroll wrapper, same as native.
292
+ (0, _jsxRuntime.jsx)("div", {
293
+ style: styles.list,
294
+ "aria-label": "Saved requests list",
295
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
296
+ style: styles.listContent,
297
+ children: [filtered.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkEventItemCompact.NetworkEventItemCompact, {
298
+ event: item,
299
+ onPress: onEventPress,
300
+ onLongPress: handleLongPress,
301
+ saved: true,
302
+ pinned: pinnedLiveIds.has(item.id)
303
+ }, item.id)), renderListFooter()]
304
+ })
305
+ })]
306
+ });
307
+ }
308
+
309
+ // Values mirror the native StyleSheet block 1:1.
310
+ const styles = {
311
+ root: {
312
+ display: "flex",
313
+ flexDirection: "column",
314
+ flex: 1,
315
+ minHeight: 0
316
+ },
317
+ toolbar: {
318
+ display: "flex",
319
+ flexDirection: "row",
320
+ alignItems: "center",
321
+ gap: 6,
322
+ padding: "10px 20px 6px"
323
+ },
324
+ toolbarTitle: {
325
+ flex: 1,
326
+ color: macOSColors.semantic.debug,
327
+ fontSize: 10,
328
+ fontWeight: 700,
329
+ letterSpacing: 0.6,
330
+ fontFamily: "ui-monospace, Menlo, monospace",
331
+ textAlign: "left"
332
+ },
333
+ toolbarButton: {
334
+ width: 26,
335
+ height: 26,
336
+ boxSizing: "border-box",
337
+ borderRadius: 6,
338
+ alignItems: "center",
339
+ justifyContent: "center"
340
+ },
341
+ /** Native passes `disabled` to CopyButton; the DOM twin has no disabled
342
+ * prop, so the toolbar dims + inerts it the same way native renders it. */
343
+ toolbarButtonDisabled: {
344
+ opacity: 0.55,
345
+ pointerEvents: "none"
346
+ },
347
+ toolbarClear: {
348
+ padding: "2px 6px",
349
+ background: "none",
350
+ border: "none",
351
+ cursor: "pointer",
352
+ margin: 0
353
+ },
354
+ toolbarClearText: {
355
+ color: macOSColors.text.muted,
356
+ fontSize: 10
357
+ },
358
+ toolbarClearTextDisabled: {
359
+ color: macOSColors.text.disabled
360
+ },
361
+ searchRow: {
362
+ display: "flex",
363
+ flexDirection: "row",
364
+ alignItems: "center",
365
+ gap: 6,
366
+ margin: "0 12px 8px",
367
+ padding: "5px 10px",
368
+ backgroundColor: macOSColors.background.input,
369
+ borderRadius: 10,
370
+ border: `1px solid ${macOSColors.border.default}`
371
+ },
372
+ searchInput: {
373
+ flex: 1,
374
+ minWidth: 0,
375
+ color: macOSColors.text.primary,
376
+ fontSize: 13,
377
+ padding: "2px 0",
378
+ border: "none",
379
+ outline: "none",
380
+ background: "transparent",
381
+ fontFamily: "inherit"
382
+ },
383
+ list: {
384
+ flex: 1,
385
+ minHeight: 0,
386
+ overflowY: "auto"
387
+ },
388
+ listContent: {
389
+ paddingTop: 4
390
+ },
391
+ emptyState: {
392
+ display: "flex",
393
+ flexDirection: "column",
394
+ alignItems: "center",
395
+ padding: "40px 24px"
396
+ },
397
+ emptyTitle: {
398
+ color: macOSColors.text.primary,
399
+ fontSize: 14,
400
+ fontWeight: 600,
401
+ marginTop: 12,
402
+ marginBottom: 6
403
+ },
404
+ emptyText: {
405
+ color: macOSColors.text.muted,
406
+ fontSize: 12,
407
+ textAlign: "center",
408
+ lineHeight: "17px"
409
+ },
410
+ // NetworkUpgradeBanner.tsx values (buoyColors), verbatim.
411
+ upgradeBanner: {
412
+ display: "block",
413
+ width: "calc(100% - 24px)",
414
+ boxSizing: "border-box",
415
+ backgroundColor: buoy.card,
416
+ borderRadius: 10,
417
+ border: `1px solid ${buoy.primary}40`,
418
+ padding: 12,
419
+ margin: "12px 12px 34px",
420
+ textAlign: "left",
421
+ cursor: "pointer",
422
+ fontFamily: "inherit"
423
+ },
424
+ upgradeContent: {
425
+ display: "flex",
426
+ flexDirection: "row",
427
+ alignItems: "center",
428
+ justifyContent: "space-between",
429
+ marginBottom: 4
430
+ },
431
+ upgradeLeft: {
432
+ display: "inline-flex",
433
+ flexDirection: "row",
434
+ alignItems: "center",
435
+ gap: 8
436
+ },
437
+ upgradeTitle: {
438
+ color: buoy.text,
439
+ fontSize: 13,
440
+ fontWeight: 600
441
+ },
442
+ upgradeSubtitle: {
443
+ display: "block",
444
+ color: buoy.textMuted,
445
+ fontSize: 11
446
+ },
447
+ // license/FeatureGate.tsx `proBadge`/`proBadgeText`, verbatim.
448
+ proBadge: {
449
+ display: "inline-flex",
450
+ backgroundColor: `${buoy.primary}15`,
451
+ borderRadius: 4,
452
+ border: `1px solid ${buoy.primary}40`,
453
+ padding: "2px 6px",
454
+ fontSize: 10,
455
+ fontWeight: 700,
456
+ color: buoy.primary,
457
+ letterSpacing: 0.5
458
+ }
459
+ };