@buoy-gg/shared-ui 2.1.1 → 2.1.2

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 (56) hide show
  1. package/lib/commonjs/clipboard/clipboard-impl.js +1 -1
  2. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +20 -23
  3. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  4. package/lib/commonjs/index.js +0 -7
  5. package/lib/commonjs/license/DeviceLimitModal.js +479 -0
  6. package/lib/commonjs/license/FeatureGate.js +4 -9
  7. package/lib/commonjs/license/LicenseEntryModal.js +205 -770
  8. package/lib/commonjs/license/index.js +0 -7
  9. package/lib/commonjs/ui/components/PowerToggleButton.js +73 -0
  10. package/lib/commonjs/ui/components/index.js +7 -0
  11. package/lib/module/JsModal.js +1 -1
  12. package/lib/module/clipboard/clipboard-impl.js +1 -1
  13. package/lib/module/dataViewer/VirtualizedDataExplorer.js +20 -23
  14. package/lib/module/hooks/safe-area-impl.js +1 -1
  15. package/lib/module/index.js +1 -1
  16. package/lib/module/license/DeviceLimitModal.js +473 -0
  17. package/lib/module/license/FeatureGate.js +4 -9
  18. package/lib/module/license/LicenseEntryModal.js +209 -773
  19. package/lib/module/license/index.js +0 -1
  20. package/lib/module/ui/components/PowerToggleButton.js +69 -0
  21. package/lib/module/ui/components/index.js +1 -0
  22. package/lib/typescript/commonjs/JsModal.d.ts.map +1 -1
  23. package/lib/typescript/commonjs/clipboard/clipboard-impl.d.ts +1 -1
  24. package/lib/typescript/commonjs/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  25. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  26. package/lib/typescript/commonjs/index.d.ts +2 -2
  27. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts +23 -0
  29. package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts.map +1 -0
  30. package/lib/typescript/commonjs/license/FeatureGate.d.ts.map +1 -1
  31. package/lib/typescript/commonjs/license/LicenseEntryModal.d.ts +10 -62
  32. package/lib/typescript/commonjs/license/LicenseEntryModal.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/license/index.d.ts +0 -2
  34. package/lib/typescript/commonjs/license/index.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/ui/components/PowerToggleButton.d.ts +32 -0
  36. package/lib/typescript/commonjs/ui/components/PowerToggleButton.d.ts.map +1 -0
  37. package/lib/typescript/commonjs/ui/components/index.d.ts +2 -0
  38. package/lib/typescript/commonjs/ui/components/index.d.ts.map +1 -1
  39. package/lib/typescript/module/JsModal.d.ts.map +1 -1
  40. package/lib/typescript/module/clipboard/clipboard-impl.d.ts +1 -1
  41. package/lib/typescript/module/dataViewer/VirtualizedDataExplorer.d.ts.map +1 -1
  42. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  43. package/lib/typescript/module/index.d.ts +2 -2
  44. package/lib/typescript/module/index.d.ts.map +1 -1
  45. package/lib/typescript/module/license/DeviceLimitModal.d.ts +23 -0
  46. package/lib/typescript/module/license/DeviceLimitModal.d.ts.map +1 -0
  47. package/lib/typescript/module/license/FeatureGate.d.ts.map +1 -1
  48. package/lib/typescript/module/license/LicenseEntryModal.d.ts +10 -62
  49. package/lib/typescript/module/license/LicenseEntryModal.d.ts.map +1 -1
  50. package/lib/typescript/module/license/index.d.ts +0 -2
  51. package/lib/typescript/module/license/index.d.ts.map +1 -1
  52. package/lib/typescript/module/ui/components/PowerToggleButton.d.ts +32 -0
  53. package/lib/typescript/module/ui/components/PowerToggleButton.d.ts.map +1 -0
  54. package/lib/typescript/module/ui/components/index.d.ts +2 -0
  55. package/lib/typescript/module/ui/components/index.d.ts.map +1 -1
  56. package/package.json +3 -3
@@ -11,578 +11,182 @@ var _lucideIcons = require("../icons/lucide-icons.js");
11
11
  var _jsxRuntime = require("react/jsx-runtime");
12
12
  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); }
13
13
  /**
14
- * LicenseEntryModal - Modal for entering and activating a license key
14
+ * LicenseEntryModal - Modal showing how to activate a license
15
15
  *
16
- * Flow:
17
- * 1. Enter license key
18
- * 2. Validate key - check if device registration needed
19
- * 3a. If existing devices, show selection (claim or register new)
20
- * 3b. If no devices, prompt for device name
21
- * 4. Register device with user-provided name
22
- * 5. Success!
16
+ * Shows two options:
17
+ * 1. Get a license (link to pricing)
18
+ * 2. Already have one? Add Buoy.init() to your code
23
19
  */
24
20
 
25
- /**
26
- * Registered device interface
27
- */
28
-
29
- /**
30
- * License validation result from the license package
31
- */
21
+ // For clipboard functionality
22
+ let Clipboard = null;
23
+ try {
24
+ Clipboard = require("@react-native-clipboard/clipboard").default;
25
+ } catch {
26
+ // Clipboard not available
27
+ }
32
28
 
33
- /**
34
- * Result of device registration
35
- */
29
+ // Keep these for backwards compatibility but they're no longer used
36
30
 
37
- /**
38
- * License state interface for prop injection
39
- */
31
+ const CODE_SNIPPET = `import { Buoy } from '@buoy-gg/core';
40
32
 
41
- // Lazy load license hooks to avoid circular dependencies
42
- let _useLicense = null;
43
- function getUseLicense() {
44
- if (!_useLicense) {
45
- try {
46
- const mod = require("@buoy-gg/license");
47
- _useLicense = mod.useLicense;
48
- } catch {
49
- // License package not available - will use injected license prop
50
- }
51
- }
52
- return _useLicense;
53
- }
54
- const LICENSE_KEY_REGEX = /^[A-Z0-9]{6}-[A-Z0-9]{6}-[A-Z0-9]{6}-[A-Z0-9]{6}-[A-Z0-9]{6}-[A-Z0-9]{2,6}$/;
55
- const MIN_KEY_LENGTH = 37;
56
- function validateLicenseKeyFormat(key) {
57
- const trimmedKey = key.trim().toUpperCase();
58
- if (trimmedKey.length === 0) {
59
- return {
60
- isValid: false,
61
- error: null
62
- };
63
- }
64
- if (!/^[A-Z0-9-]+$/.test(trimmedKey)) {
65
- return {
66
- isValid: false,
67
- error: "Invalid characters in key"
68
- };
69
- }
70
- if (LICENSE_KEY_REGEX.test(trimmedKey)) {
71
- return {
72
- isValid: true,
73
- error: null
74
- };
75
- }
76
- if (trimmedKey.length < MIN_KEY_LENGTH) {
77
- return {
78
- isValid: false,
79
- error: "Key is incomplete"
80
- };
81
- }
82
- return {
83
- isValid: false,
84
- error: "Invalid key format"
85
- };
86
- }
33
+ Buoy.init({
34
+ licenseKey: 'YOUR_LICENSE_KEY',
35
+ });`;
87
36
  const LicenseEntryModal = ({
88
37
  visible,
89
38
  onClose,
90
- onSuccess,
91
- purchaseUrl = "https://buoy.gg/pricing",
92
- license: injectedLicense,
93
- startAtDeviceRegistration = false,
94
- initialExistingDevices = [],
95
- initialMaxDevices,
96
- initialCurrentDeviceCount
39
+ purchaseUrl = "https://buoy.gg/pricing"
97
40
  }) => {
98
- const [licenseKey, setLicenseKey] = (0, _react.useState)("");
99
- const [deviceName, setDeviceName] = (0, _react.useState)("");
100
- const [modalState, setModalState] = (0, _react.useState)("entry");
101
- const [errorMessage, setErrorMessage] = (0, _react.useState)(null);
102
- const [isFocused, setIsFocused] = (0, _react.useState)(false);
103
- const [isDeviceNameFocused, setIsDeviceNameFocused] = (0, _react.useState)(false);
104
- const [existingDevices, setExistingDevices] = (0, _react.useState)([]);
105
- const [maxDevices, setMaxDevices] = (0, _react.useState)();
106
- const [currentDeviceCount, setCurrentDeviceCount] = (0, _react.useState)();
107
- const [hasInitialized, setHasInitialized] = (0, _react.useState)(false);
108
-
109
- // Ref to track reset timeout to prevent race condition on quick close/open
110
- const resetTimeoutRef = (0, _react.useRef)(null);
111
-
112
- // Use injected license if provided, otherwise try to load from @buoy-gg/license
113
- const useLicenseHook = getUseLicense();
114
- const hookLicense = useLicenseHook?.();
115
- const license = injectedLicense ?? hookLicense;
116
-
117
- // Handle initial state when modal becomes visible
118
- _react.default.useEffect(() => {
119
- if (visible && startAtDeviceRegistration && !hasInitialized) {
120
- // Set device count info from props when starting at device registration
121
- if (initialMaxDevices !== undefined) {
122
- setMaxDevices(initialMaxDevices);
123
- }
124
- if (initialCurrentDeviceCount !== undefined) {
125
- setCurrentDeviceCount(initialCurrentDeviceCount);
126
- }
127
- if (initialExistingDevices.length > 0) {
128
- setExistingDevices(initialExistingDevices);
129
- setModalState("device_select");
130
- } else {
131
- setModalState("device_name");
132
- }
133
- setHasInitialized(true);
134
- }
135
- // Reset initialization flag when modal closes
136
- if (!visible) {
137
- setHasInitialized(false);
138
- }
139
- }, [visible, startAtDeviceRegistration, initialExistingDevices, initialMaxDevices, initialCurrentDeviceCount, hasInitialized]);
140
-
141
- // Validate key format in real-time
142
- const validation = (0, _react.useMemo)(() => validateLicenseKeyFormat(licenseKey), [licenseKey]);
143
- const canActivate = validation.isValid && licenseKey.trim().length > 0;
144
- const canRegister = deviceName.trim().length >= 2;
145
- const handleValidate = (0, _react.useCallback)(async () => {
146
- if (!canActivate) return;
147
- if (!license) {
148
- setModalState("error");
149
- setErrorMessage("License system unavailable.");
150
- return;
151
- }
152
- setModalState("validating");
153
- setErrorMessage(null);
154
- try {
155
- // Check if the new validateLicenseKey method is available
156
- if (license.validateLicenseKey) {
157
- const result = await license.validateLicenseKey(licenseKey.trim());
158
- if (!result.valid) {
159
- setModalState("error");
160
- setErrorMessage(result.error || "Invalid license key");
161
- return;
162
- }
163
- setMaxDevices(result.maxDevices);
164
- setCurrentDeviceCount(result.currentDeviceCount);
165
- if (!result.needsDeviceRegistration) {
166
- // Already registered or simulator - success!
167
- setModalState("success");
168
- setTimeout(() => {
169
- onSuccess?.();
170
- onClose();
171
- resetState();
172
- }, 1500);
173
- return;
174
- }
175
-
176
- // Device registration needed
177
- if (result.existingDevices.length > 0) {
178
- setExistingDevices(result.existingDevices);
179
- setModalState("device_select");
180
- } else {
181
- setModalState("device_name");
182
- }
183
- } else {
184
- // Fallback to legacy setLicenseKey
185
- const success = await license.setLicenseKey(licenseKey.trim());
186
- if (success) {
187
- setModalState("success");
188
- setTimeout(() => {
189
- onSuccess?.();
190
- onClose();
191
- resetState();
192
- }, 1500);
193
- } else {
194
- setModalState("error");
195
- setErrorMessage(license.error || "Invalid license key");
196
- }
197
- }
198
- } catch (err) {
199
- setModalState("error");
200
- setErrorMessage(err instanceof Error ? err.message : "Validation failed");
201
- }
202
- }, [licenseKey, license, onSuccess, onClose, canActivate]);
203
- const handleRegisterDevice = (0, _react.useCallback)(async () => {
204
- if (!canRegister || !license?.registerDevice) {
205
- // Fallback if registerDevice not available
206
- if (license?.setLicenseKey) {
207
- const success = await license.setLicenseKey(licenseKey.trim());
208
- if (success) {
209
- setModalState("success");
210
- setTimeout(() => {
211
- onSuccess?.();
212
- onClose();
213
- resetState();
214
- }, 1500);
215
- } else {
216
- setModalState("error");
217
- setErrorMessage(license.error || "Registration failed");
218
- }
219
- }
220
- return;
221
- }
222
- setModalState("registering");
223
- setErrorMessage(null);
224
- try {
225
- const result = await license.registerDevice(deviceName.trim());
226
- if (result.success) {
227
- setModalState("success");
228
- setTimeout(() => {
229
- onSuccess?.();
230
- onClose();
231
- resetState();
232
- }, 1500);
233
- } else {
234
- setModalState("error");
235
- setErrorMessage(result.error || "Device registration failed");
236
- }
237
- } catch (err) {
238
- setModalState("error");
239
- setErrorMessage(err instanceof Error ? err.message : "Registration failed");
240
- }
241
- }, [deviceName, license, licenseKey, onSuccess, onClose, canRegister]);
242
- const handleClaimDevice = (0, _react.useCallback)(async device => {
243
- if (!license?.claimDevice) {
244
- setModalState("error");
245
- setErrorMessage("Claim device not available");
246
- return;
247
- }
248
- setModalState("registering");
249
- setErrorMessage(null);
250
- try {
251
- const success = await license.claimDevice(device.id, existingDevices);
252
- if (success) {
253
- setModalState("success");
254
- setTimeout(() => {
255
- onSuccess?.();
256
- onClose();
257
- resetState();
258
- }, 1500);
259
- } else {
260
- setModalState("error");
261
- setErrorMessage(license.error || "Failed to claim device");
262
- }
263
- } catch (err) {
264
- setModalState("error");
265
- setErrorMessage(err instanceof Error ? err.message : "Failed to claim device");
266
- }
267
- }, [license, existingDevices, onSuccess, onClose]);
268
- const handleRegisterNew = (0, _react.useCallback)(() => {
269
- setModalState("device_name");
270
- }, []);
41
+ const [copied, setCopied] = _react.default.useState(false);
271
42
  const handleGetLicense = (0, _react.useCallback)(() => {
272
43
  _reactNative.Linking.openURL(purchaseUrl);
273
44
  }, [purchaseUrl]);
274
- const resetState = (0, _react.useCallback)(() => {
275
- setLicenseKey("");
276
- setDeviceName("");
277
- setModalState("entry");
278
- setErrorMessage(null);
279
- setIsFocused(false);
280
- setIsDeviceNameFocused(false);
281
- setExistingDevices([]);
282
- setMaxDevices(undefined);
283
- setCurrentDeviceCount(undefined);
284
- }, []);
285
- const handleClose = (0, _react.useCallback)(() => {
286
- onClose();
287
- // Store the timeout ref so it can be cancelled if modal reopens quickly
288
- resetTimeoutRef.current = setTimeout(resetState, 300);
289
- }, [onClose, resetState]);
290
-
291
- // Cancel pending reset if modal becomes visible (prevents race condition)
292
- (0, _react.useEffect)(() => {
293
- if (visible && resetTimeoutRef.current) {
294
- clearTimeout(resetTimeoutRef.current);
295
- resetTimeoutRef.current = null;
45
+ const handleCopyCode = (0, _react.useCallback)(() => {
46
+ if (Clipboard?.setString) {
47
+ Clipboard.setString(CODE_SNIPPET);
48
+ setCopied(true);
49
+ setTimeout(() => setCopied(false), 2000);
296
50
  }
297
- }, [visible]);
298
- const formatLicenseKey = text => {
299
- return text.toUpperCase().replace(/[^A-Z0-9-]/g, "");
300
- };
301
- const renderContent = () => {
302
- switch (modalState) {
303
- case "validating":
304
- case "registering":
305
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
306
- style: styles.stateContainer,
51
+ }, []);
52
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Modal, {
53
+ visible: visible,
54
+ transparent: true,
55
+ animationType: "fade",
56
+ onRequestClose: onClose,
57
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
58
+ style: styles.overlay,
59
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
60
+ style: styles.backdrop,
61
+ activeOpacity: 1,
62
+ onPress: onClose
63
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
64
+ style: styles.modal,
65
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
66
+ style: styles.closeButton,
67
+ onPress: onClose,
68
+ activeOpacity: 0.7,
69
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.X, {
70
+ size: 18,
71
+ color: _macOSDesignSystemColors.macOSColors.text.muted
72
+ })
73
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
74
+ style: styles.header,
307
75
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
308
- style: styles.loaderContainer,
309
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
310
- size: "large",
76
+ style: styles.iconContainer,
77
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Key, {
78
+ size: 20,
311
79
  color: _macOSDesignSystemColors.macOSColors.semantic.info
312
80
  })
313
81
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
314
- style: styles.stateText,
315
- children: modalState === "validating" ? "Validating license..." : "Registering device..."
82
+ style: styles.title,
83
+ children: "Unlock Pro Features"
316
84
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
317
- style: styles.stateSubtext,
318
- children: "Please wait"
85
+ style: styles.subtitle,
86
+ children: "Get access to all Buoy DevTools features"
319
87
  })]
320
- });
321
- case "success":
322
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
323
- style: styles.stateContainer,
324
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
325
- style: [styles.statusIconContainer, styles.successIconContainer],
326
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.CheckCircle, {
327
- size: 32,
328
- color: _macOSDesignSystemColors.macOSColors.semantic.success
329
- })
330
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
331
- style: styles.successText,
332
- children: "License Activated!"
333
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
334
- style: styles.stateSubtext,
335
- children: "Pro features are now unlocked"
88
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
89
+ style: styles.primaryButton,
90
+ onPress: handleGetLicense,
91
+ activeOpacity: 0.8,
92
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
93
+ style: styles.primaryButtonText,
94
+ children: "Get a License"
95
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Link, {
96
+ size: 14,
97
+ color: "#000"
336
98
  })]
337
- });
338
- case "error":
339
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
340
- style: styles.stateContainer,
99
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
100
+ style: styles.divider,
341
101
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
342
- style: [styles.statusIconContainer, styles.errorIconContainer],
343
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.AlertCircle, {
344
- size: 32,
345
- color: _macOSDesignSystemColors.macOSColors.semantic.error
346
- })
347
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
348
- style: styles.errorText,
349
- children: "Activation Failed"
102
+ style: styles.dividerLine
350
103
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
351
- style: styles.stateSubtext,
352
- children: errorMessage
353
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
354
- style: styles.secondaryButton,
355
- onPress: () => setModalState("entry"),
356
- activeOpacity: 0.8,
357
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
358
- style: styles.secondaryButtonText,
359
- children: "Try Again"
360
- })
104
+ style: styles.dividerText,
105
+ children: "already have one?"
106
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
107
+ style: styles.dividerLine
361
108
  })]
362
- });
363
- case "device_name":
364
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
109
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
110
+ style: styles.instructionsContainer,
365
111
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
366
- style: styles.header,
367
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
368
- style: styles.iconContainer,
369
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Smartphone, {
370
- size: 20,
371
- color: _macOSDesignSystemColors.macOSColors.semantic.info
372
- })
373
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
374
- style: styles.title,
375
- children: "Name This Device"
112
+ style: styles.instructionsHeader,
113
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.FileCode, {
114
+ size: 14,
115
+ color: _macOSDesignSystemColors.macOSColors.text.secondary
376
116
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
377
- style: styles.subtitle,
378
- children: "Give this device a name so you can identify it later"
117
+ style: styles.instructionsTitle,
118
+ children: "Add to your App.tsx"
379
119
  })]
380
120
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
381
- style: styles.inputWrapper,
382
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
383
- style: [styles.inputContainer, isDeviceNameFocused && styles.inputContainerFocused],
384
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
385
- style: [styles.input, {
386
- fontFamily: undefined,
387
- letterSpacing: 0
388
- }],
389
- value: deviceName,
390
- onChangeText: setDeviceName,
391
- placeholder: "e.g., My iPhone, Work iPad",
392
- placeholderTextColor: _macOSDesignSystemColors.macOSColors.text.muted,
393
- autoFocus: true,
394
- onFocus: () => setIsDeviceNameFocused(true),
395
- onBlur: () => setIsDeviceNameFocused(false)
396
- })
397
- }), maxDevices && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
398
- style: styles.deviceCount,
399
- children: [currentDeviceCount ?? 0, " of ", maxDevices, " devices used"]
400
- })]
401
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
402
- style: [styles.activateButton, !canRegister && styles.activateButtonDisabled],
403
- onPress: handleRegisterDevice,
404
- disabled: !canRegister,
405
- activeOpacity: 0.8,
406
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
407
- style: [styles.activateButtonText, !canRegister && styles.activateButtonTextDisabled],
408
- children: "Register Device"
409
- })
410
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
411
- style: styles.backButton,
412
- onPress: () => setModalState("entry"),
413
- activeOpacity: 0.8,
414
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
415
- style: styles.backButtonText,
416
- children: "Back"
417
- })
418
- })]
419
- });
420
- case "device_select":
421
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
422
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
423
- style: styles.header,
424
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
425
- style: styles.iconContainer,
426
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Smartphone, {
427
- size: 20,
428
- color: _macOSDesignSystemColors.macOSColors.semantic.info
429
- })
430
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
431
- style: styles.title,
432
- children: "Select Device"
433
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
434
- style: styles.subtitle,
435
- children: "Claim an existing device or register a new one"
436
- }), maxDevices && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
437
- style: styles.deviceCountHeader,
438
- children: [currentDeviceCount ?? 0, " of ", maxDevices, " devices used"]
439
- })]
440
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
441
- style: styles.deviceList,
442
- showsVerticalScrollIndicator: false,
443
- children: existingDevices.map(device => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
444
- style: styles.deviceItem,
445
- onPress: () => handleClaimDevice(device),
446
- activeOpacity: 0.8,
447
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
448
- style: styles.deviceIcon,
449
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Smartphone, {
450
- size: 18,
451
- color: _macOSDesignSystemColors.macOSColors.text.secondary
452
- })
453
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
454
- style: styles.deviceInfo,
455
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
456
- style: styles.deviceName,
457
- children: device.name
458
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
459
- style: styles.devicePlatform,
460
- children: device.platform
461
- })]
121
+ style: styles.codeBlock,
122
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
123
+ style: styles.codeText,
124
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
125
+ style: styles.codeKeyword,
126
+ children: "import"
127
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
128
+ style: styles.codePunctuation,
129
+ children: " { "
130
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
131
+ style: styles.codeVariable,
132
+ children: "Buoy"
133
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
134
+ style: styles.codePunctuation,
135
+ children: " } "
136
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
137
+ style: styles.codeKeyword,
138
+ children: "from"
139
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
140
+ style: styles.codeString,
141
+ children: " '@buoy-gg/core'"
142
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
143
+ style: styles.codePunctuation,
144
+ children: ";"
145
+ }), "\n\n", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
146
+ style: styles.codeVariable,
147
+ children: "Buoy"
148
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
149
+ style: styles.codePunctuation,
150
+ children: "."
151
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
152
+ style: styles.codeFunction,
153
+ children: "init"
154
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
155
+ style: styles.codePunctuation,
156
+ children: "({"
157
+ }), "\n", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
158
+ style: styles.codeProperty,
159
+ children: " licenseKey"
160
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
161
+ style: styles.codePunctuation,
162
+ children: ": "
462
163
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
463
- style: styles.claimText,
464
- children: "Claim"
164
+ style: styles.codeString,
165
+ children: "'YOUR_KEY'"
166
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
167
+ style: styles.codePunctuation,
168
+ children: ","
169
+ }), "\n", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
170
+ style: styles.codePunctuation,
171
+ children: "});"
172
+ })]
173
+ }), Clipboard?.setString && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
174
+ style: styles.copyButton,
175
+ onPress: handleCopyCode,
176
+ activeOpacity: 0.7,
177
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Copy, {
178
+ size: 12,
179
+ color: copied ? _macOSDesignSystemColors.macOSColors.semantic.success : _macOSDesignSystemColors.macOSColors.text.muted
180
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
181
+ style: [styles.copyText, copied && styles.copyTextSuccess],
182
+ children: copied ? "Copied!" : "Copy"
465
183
  })]
466
- }, device.id))
467
- }), (!maxDevices || (currentDeviceCount ?? 0) < maxDevices) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
468
- style: styles.registerNewButton,
469
- onPress: handleRegisterNew,
470
- activeOpacity: 0.8,
471
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Plus, {
472
- size: 16,
473
- color: _macOSDesignSystemColors.macOSColors.semantic.info
474
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
475
- style: styles.registerNewText,
476
- children: "Register New Device"
477
- })]
478
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
479
- style: styles.backButton,
480
- onPress: () => setModalState("entry"),
481
- activeOpacity: 0.8,
482
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
483
- style: styles.backButtonText,
484
- children: "Back"
485
- })
486
- })]
487
- });
488
- default:
489
- // entry
490
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
491
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
492
- style: styles.header,
493
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
494
- style: styles.iconContainer,
495
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Key, {
496
- size: 20,
497
- color: _macOSDesignSystemColors.macOSColors.semantic.info
498
- })
499
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
500
- style: styles.title,
501
- children: "Enter License Key"
502
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
503
- style: styles.subtitle,
504
- children: "Unlock Pro features by entering your license key"
505
- })]
506
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
507
- style: styles.inputWrapper,
508
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
509
- style: [styles.inputContainer, isFocused && styles.inputContainerFocused, validation.error && licenseKey.length > 0 && styles.inputContainerError, validation.isValid && licenseKey.length > 0 && styles.inputContainerValid],
510
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
511
- style: styles.input,
512
- value: licenseKey,
513
- onChangeText: text => setLicenseKey(formatLicenseKey(text)),
514
- placeholder: "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-V3",
515
- placeholderTextColor: _macOSDesignSystemColors.macOSColors.text.muted,
516
- autoCapitalize: "characters",
517
- autoCorrect: false,
518
- autoComplete: "off",
519
- onFocus: () => setIsFocused(true),
520
- onBlur: () => setIsFocused(false)
521
- })
522
- }), validation.error && licenseKey.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
523
- style: styles.validationError,
524
- children: validation.error
525
- }), validation.isValid && licenseKey.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
526
- style: styles.validationSuccess,
527
- children: "Valid format"
528
- })]
529
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
530
- style: [styles.activateButton, !canActivate && styles.activateButtonDisabled],
531
- onPress: handleValidate,
532
- disabled: !canActivate,
533
- activeOpacity: 0.8,
534
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
535
- style: [styles.activateButtonText, !canActivate && styles.activateButtonTextDisabled],
536
- children: "Activate License"
537
- })
538
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
539
- style: styles.divider,
540
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
541
- style: styles.dividerLine
542
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
543
- style: styles.dividerText,
544
- children: "or"
545
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
546
- style: styles.dividerLine
547
- })]
548
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
549
- style: styles.purchaseButton,
550
- onPress: handleGetLicense,
551
- activeOpacity: 0.8,
552
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
553
- style: styles.purchaseButtonText,
554
- children: "Get a License"
555
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.Link, {
556
- size: 14,
557
- color: _macOSDesignSystemColors.macOSColors.semantic.info
558
184
  })]
185
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
186
+ style: styles.instructionsNote,
187
+ children: "Replace YOUR_KEY with your license key"
559
188
  })]
560
- });
561
- }
562
- };
563
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Modal, {
564
- visible: visible,
565
- transparent: true,
566
- animationType: "fade",
567
- onRequestClose: handleClose,
568
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.KeyboardAvoidingView, {
569
- behavior: _reactNative.Platform.OS === "ios" ? "padding" : "height",
570
- style: styles.overlay,
571
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
572
- style: styles.backdrop,
573
- activeOpacity: 1,
574
- onPress: handleClose
575
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
576
- style: styles.modal,
577
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
578
- style: styles.closeButton,
579
- onPress: handleClose,
580
- activeOpacity: 0.7,
581
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lucideIcons.X, {
582
- size: 18,
583
- color: _macOSDesignSystemColors.macOSColors.text.muted
584
- })
585
- }), renderContent()]
189
+ })]
586
190
  })]
587
191
  })
588
192
  });
@@ -604,7 +208,7 @@ const styles = _reactNative.StyleSheet.create({
604
208
  padding: 24,
605
209
  width: "90%",
606
210
  maxWidth: 380,
607
- maxHeight: "80%",
211
+ maxHeight: "85%",
608
212
  borderWidth: 1,
609
213
  borderColor: _macOSDesignSystemColors.macOSColors.semantic.info + "50",
610
214
  shadowColor: _macOSDesignSystemColors.macOSColors.semantic.info,
@@ -663,61 +267,14 @@ const styles = _reactNative.StyleSheet.create({
663
267
  textAlign: "center",
664
268
  lineHeight: 18
665
269
  },
666
- inputWrapper: {
667
- marginBottom: 16
668
- },
669
- inputContainer: {
670
- backgroundColor: _macOSDesignSystemColors.macOSColors.background.input,
671
- borderRadius: 8,
672
- borderWidth: 1,
673
- borderColor: _macOSDesignSystemColors.macOSColors.border.input,
674
- overflow: "hidden"
675
- },
676
- inputContainerFocused: {
677
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.info + "60",
678
- shadowColor: _macOSDesignSystemColors.macOSColors.semantic.info,
679
- shadowOffset: {
680
- width: 0,
681
- height: 0
682
- },
683
- shadowOpacity: 0.15,
684
- shadowRadius: 8
685
- },
686
- inputContainerError: {
687
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.error + "60",
688
- shadowColor: _macOSDesignSystemColors.macOSColors.semantic.error,
689
- shadowOffset: {
690
- width: 0,
691
- height: 0
692
- },
693
- shadowOpacity: 0.15,
694
- shadowRadius: 8
695
- },
696
- inputContainerValid: {
697
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.success + "60",
698
- shadowColor: _macOSDesignSystemColors.macOSColors.semantic.success,
699
- shadowOffset: {
700
- width: 0,
701
- height: 0
702
- },
703
- shadowOpacity: 0.15,
704
- shadowRadius: 8
705
- },
706
- input: {
707
- paddingHorizontal: 12,
708
- paddingVertical: 12,
709
- fontSize: 12,
710
- color: _macOSDesignSystemColors.macOSColors.text.primary,
711
- fontFamily: _reactNative.Platform.OS === "ios" ? "Menlo" : "monospace",
712
- textAlign: "center",
713
- letterSpacing: 0.3,
714
- width: "100%"
715
- },
716
- activateButton: {
270
+ primaryButton: {
271
+ flexDirection: "row",
272
+ alignItems: "center",
273
+ justifyContent: "center",
274
+ gap: 8,
717
275
  backgroundColor: _macOSDesignSystemColors.macOSColors.semantic.info,
718
276
  borderRadius: 8,
719
- paddingVertical: 12,
720
- alignItems: "center",
277
+ paddingVertical: 14,
721
278
  shadowColor: _macOSDesignSystemColors.macOSColors.semantic.info,
722
279
  shadowOffset: {
723
280
  width: 0,
@@ -726,18 +283,11 @@ const styles = _reactNative.StyleSheet.create({
726
283
  shadowOpacity: 0.3,
727
284
  shadowRadius: 8
728
285
  },
729
- activateButtonDisabled: {
730
- backgroundColor: _macOSDesignSystemColors.macOSColors.background.hover,
731
- shadowOpacity: 0
732
- },
733
- activateButtonText: {
734
- fontSize: 14,
286
+ primaryButtonText: {
287
+ fontSize: 15,
735
288
  fontWeight: "600",
736
289
  color: "#000"
737
290
  },
738
- activateButtonTextDisabled: {
739
- color: _macOSDesignSystemColors.macOSColors.text.muted
740
- },
741
291
  divider: {
742
292
  flexDirection: "row",
743
293
  alignItems: "center",
@@ -755,196 +305,81 @@ const styles = _reactNative.StyleSheet.create({
755
305
  textTransform: "uppercase",
756
306
  letterSpacing: 0.5
757
307
  },
758
- purchaseButton: {
759
- flexDirection: "row",
760
- alignItems: "center",
761
- justifyContent: "center",
762
- gap: 6,
763
- paddingVertical: 10,
308
+ instructionsContainer: {
309
+ backgroundColor: _macOSDesignSystemColors.macOSColors.background.hover,
764
310
  borderRadius: 8,
311
+ padding: 16,
765
312
  borderWidth: 1,
766
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.info + "30",
767
- backgroundColor: _macOSDesignSystemColors.macOSColors.semantic.info + "10"
768
- },
769
- purchaseButtonText: {
770
- fontSize: 13,
771
- fontWeight: "600",
772
- color: _macOSDesignSystemColors.macOSColors.semantic.info
773
- },
774
- stateContainer: {
775
- alignItems: "center",
776
- paddingVertical: 24,
777
- paddingTop: 16
778
- },
779
- loaderContainer: {
780
- width: 64,
781
- height: 64,
782
- borderRadius: 16,
783
- backgroundColor: _macOSDesignSystemColors.macOSColors.semantic.info + "10",
784
- borderWidth: 1,
785
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.info + "20",
786
- alignItems: "center",
787
- justifyContent: "center",
788
- marginBottom: 16
313
+ borderColor: _macOSDesignSystemColors.macOSColors.border.default
789
314
  },
790
- statusIconContainer: {
791
- width: 64,
792
- height: 64,
793
- borderRadius: 16,
315
+ instructionsHeader: {
316
+ flexDirection: "row",
794
317
  alignItems: "center",
795
- justifyContent: "center",
796
- marginBottom: 16,
797
- borderWidth: 1
798
- },
799
- successIconContainer: {
800
- backgroundColor: _macOSDesignSystemColors.macOSColors.semantic.success + "15",
801
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.success + "30",
802
- shadowColor: _macOSDesignSystemColors.macOSColors.semantic.success,
803
- shadowOffset: {
804
- width: 0,
805
- height: 0
806
- },
807
- shadowOpacity: 0.2,
808
- shadowRadius: 12
809
- },
810
- errorIconContainer: {
811
- backgroundColor: _macOSDesignSystemColors.macOSColors.semantic.error + "15",
812
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.error + "30",
813
- shadowColor: _macOSDesignSystemColors.macOSColors.semantic.error,
814
- shadowOffset: {
815
- width: 0,
816
- height: 0
817
- },
818
- shadowOpacity: 0.2,
819
- shadowRadius: 12
820
- },
821
- stateText: {
822
- fontSize: 16,
823
- fontWeight: "600",
824
- color: _macOSDesignSystemColors.macOSColors.text.primary,
825
- marginBottom: 4
826
- },
827
- stateSubtext: {
828
- fontSize: 13,
829
- color: _macOSDesignSystemColors.macOSColors.text.secondary,
830
- textAlign: "center",
831
- lineHeight: 18,
832
- paddingHorizontal: 16
833
- },
834
- successText: {
835
- fontSize: 18,
836
- fontWeight: "600",
837
- color: _macOSDesignSystemColors.macOSColors.semantic.success,
838
- marginBottom: 4
318
+ gap: 8,
319
+ marginBottom: 12
839
320
  },
840
- errorText: {
841
- fontSize: 18,
321
+ instructionsTitle: {
322
+ fontSize: 12,
842
323
  fontWeight: "600",
843
- color: _macOSDesignSystemColors.macOSColors.semantic.error,
844
- marginBottom: 4
324
+ color: _macOSDesignSystemColors.macOSColors.text.secondary
845
325
  },
846
- secondaryButton: {
847
- marginTop: 20,
848
- paddingVertical: 10,
849
- paddingHorizontal: 20,
850
- borderRadius: 8,
326
+ codeBlock: {
327
+ backgroundColor: _macOSDesignSystemColors.macOSColors.background.input,
328
+ borderRadius: 6,
329
+ padding: 12,
851
330
  borderWidth: 1,
852
- borderColor: _macOSDesignSystemColors.macOSColors.border.default,
853
- backgroundColor: _macOSDesignSystemColors.macOSColors.background.hover
854
- },
855
- secondaryButtonText: {
856
- fontSize: 13,
857
- fontWeight: "600",
858
- color: _macOSDesignSystemColors.macOSColors.text.primary
331
+ borderColor: _macOSDesignSystemColors.macOSColors.border.input,
332
+ position: "relative"
859
333
  },
860
- validationError: {
334
+ codeText: {
861
335
  fontSize: 11,
862
- color: _macOSDesignSystemColors.macOSColors.semantic.error,
863
- marginTop: 6,
864
- textAlign: "center"
336
+ fontFamily: _reactNative.Platform.OS === "ios" ? "Menlo" : "monospace",
337
+ lineHeight: 18,
338
+ color: _macOSDesignSystemColors.macOSColors.text.primary
865
339
  },
866
- validationSuccess: {
867
- fontSize: 11,
868
- color: _macOSDesignSystemColors.macOSColors.semantic.success,
869
- marginTop: 6,
870
- textAlign: "center"
340
+ codeKeyword: {
341
+ color: "#FF79C6"
871
342
  },
872
- backButton: {
873
- marginTop: 16,
874
- alignItems: "center"
343
+ codeVariable: {
344
+ color: "#50FA7B"
875
345
  },
876
- backButtonText: {
877
- fontSize: 13,
878
- color: _macOSDesignSystemColors.macOSColors.text.muted
346
+ codeFunction: {
347
+ color: "#8BE9FD"
879
348
  },
880
- deviceCount: {
881
- fontSize: 11,
882
- color: _macOSDesignSystemColors.macOSColors.text.muted,
883
- marginTop: 8,
884
- textAlign: "center"
349
+ codeProperty: {
350
+ color: "#FFB86C"
885
351
  },
886
- deviceCountHeader: {
887
- fontSize: 12,
888
- color: _macOSDesignSystemColors.macOSColors.text.secondary,
889
- marginTop: 8
352
+ codeString: {
353
+ color: "#F1FA8C"
890
354
  },
891
- deviceList: {
892
- maxHeight: 200,
893
- marginBottom: 16
355
+ codePunctuation: {
356
+ color: _macOSDesignSystemColors.macOSColors.text.secondary
894
357
  },
895
- deviceItem: {
358
+ copyButton: {
359
+ position: "absolute",
360
+ top: 8,
361
+ right: 8,
896
362
  flexDirection: "row",
897
363
  alignItems: "center",
898
- padding: 12,
899
- backgroundColor: _macOSDesignSystemColors.macOSColors.background.hover,
900
- borderRadius: 8,
901
- marginBottom: 8,
902
- borderWidth: 1,
903
- borderColor: _macOSDesignSystemColors.macOSColors.border.default
904
- },
905
- deviceIcon: {
906
- width: 36,
907
- height: 36,
908
- borderRadius: 8,
909
- backgroundColor: _macOSDesignSystemColors.macOSColors.background.input,
910
- alignItems: "center",
911
- justifyContent: "center",
912
- marginRight: 12
364
+ gap: 4,
365
+ paddingVertical: 4,
366
+ paddingHorizontal: 8,
367
+ borderRadius: 4,
368
+ backgroundColor: _macOSDesignSystemColors.macOSColors.background.hover
913
369
  },
914
- deviceInfo: {
915
- flex: 1
370
+ copyText: {
371
+ fontSize: 10,
372
+ color: _macOSDesignSystemColors.macOSColors.text.muted,
373
+ fontWeight: "500"
916
374
  },
917
- deviceName: {
918
- fontSize: 14,
919
- fontWeight: "500",
920
- color: _macOSDesignSystemColors.macOSColors.text.primary,
921
- marginBottom: 2
375
+ copyTextSuccess: {
376
+ color: _macOSDesignSystemColors.macOSColors.semantic.success
922
377
  },
923
- devicePlatform: {
378
+ instructionsNote: {
924
379
  fontSize: 11,
925
380
  color: _macOSDesignSystemColors.macOSColors.text.muted,
926
- textTransform: "capitalize"
927
- },
928
- claimText: {
929
- fontSize: 12,
930
- fontWeight: "600",
931
- color: _macOSDesignSystemColors.macOSColors.semantic.info
932
- },
933
- registerNewButton: {
934
- flexDirection: "row",
935
- alignItems: "center",
936
- justifyContent: "center",
937
- gap: 8,
938
- paddingVertical: 12,
939
- borderRadius: 8,
940
- borderWidth: 1,
941
- borderColor: _macOSDesignSystemColors.macOSColors.semantic.info + "30",
942
- borderStyle: "dashed",
943
- marginBottom: 8
944
- },
945
- registerNewText: {
946
- fontSize: 13,
947
- fontWeight: "600",
948
- color: _macOSDesignSystemColors.macOSColors.semantic.info
381
+ marginTop: 12,
382
+ textAlign: "center",
383
+ fontStyle: "italic"
949
384
  }
950
385
  });