@buoy-gg/shared-ui 7.0.7 → 7.0.8

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 (101) hide show
  1. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  2. package/lib/module/hooks/safe-area-impl.js +1 -1
  3. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  4. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  5. package/package.json +4 -4
  6. package/lib/commonjs/license/DeviceLimitModal.js +0 -480
  7. package/lib/commonjs/license/ManageDevicesModal.js +0 -546
  8. package/lib/commonjs/types/index.js +0 -16
  9. package/lib/commonjs/ui/components/Divider.js +0 -18
  10. package/lib/commonjs/ui/components/ErrorBoundary.js +0 -113
  11. package/lib/commonjs/ui/components/ExpandableSection.js +0 -72
  12. package/lib/commonjs/ui/components/ExpandableSectionHeader.js +0 -87
  13. package/lib/commonjs/ui/components/ExpandableSectionWithModal.js +0 -183
  14. package/lib/commonjs/ui/components/FilterViewPattern.js +0 -175
  15. package/lib/commonjs/ui/components/TypeBadge.js +0 -100
  16. package/lib/commonjs/ui/components/types.js +0 -5
  17. package/lib/commonjs/ui/console/BubbleSettingsModal.js +0 -50
  18. package/lib/commonjs/ui/console/ConsoleSection.js +0 -50
  19. package/lib/commonjs/ui/console/CyberpunkConsoleSection.js +0 -650
  20. package/lib/commonjs/ui/console/GalaxyButton.js +0 -100
  21. package/lib/commonjs/ui/console/index.js +0 -12
  22. package/lib/module/license/DeviceLimitModal.js +0 -474
  23. package/lib/module/license/ManageDevicesModal.js +0 -540
  24. package/lib/module/types/index.js +0 -3
  25. package/lib/module/ui/components/Divider.js +0 -14
  26. package/lib/module/ui/components/ErrorBoundary.js +0 -108
  27. package/lib/module/ui/components/ExpandableSection.js +0 -68
  28. package/lib/module/ui/components/ExpandableSectionHeader.js +0 -83
  29. package/lib/module/ui/components/ExpandableSectionWithModal.js +0 -179
  30. package/lib/module/ui/components/FilterViewPattern.js +0 -172
  31. package/lib/module/ui/components/TypeBadge.js +0 -96
  32. package/lib/module/ui/components/types.js +0 -3
  33. package/lib/module/ui/console/BubbleSettingsModal.js +0 -46
  34. package/lib/module/ui/console/ConsoleSection.js +0 -46
  35. package/lib/module/ui/console/CyberpunkConsoleSection.js +0 -647
  36. package/lib/module/ui/console/GalaxyButton.js +0 -96
  37. package/lib/module/ui/console/index.js +0 -5
  38. package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts +0 -23
  39. package/lib/typescript/commonjs/license/DeviceLimitModal.d.ts.map +0 -1
  40. package/lib/typescript/commonjs/license/ManageDevicesModal.d.ts +0 -23
  41. package/lib/typescript/commonjs/license/ManageDevicesModal.d.ts.map +0 -1
  42. package/lib/typescript/commonjs/types/index.d.ts +0 -2
  43. package/lib/typescript/commonjs/types/index.d.ts.map +0 -1
  44. package/lib/typescript/commonjs/ui/components/Divider.d.ts +0 -2
  45. package/lib/typescript/commonjs/ui/components/Divider.d.ts.map +0 -1
  46. package/lib/typescript/commonjs/ui/components/ErrorBoundary.d.ts +0 -18
  47. package/lib/typescript/commonjs/ui/components/ErrorBoundary.d.ts.map +0 -1
  48. package/lib/typescript/commonjs/ui/components/ExpandableSection.d.ts +0 -15
  49. package/lib/typescript/commonjs/ui/components/ExpandableSection.d.ts.map +0 -1
  50. package/lib/typescript/commonjs/ui/components/ExpandableSectionHeader.d.ts +0 -13
  51. package/lib/typescript/commonjs/ui/components/ExpandableSectionHeader.d.ts.map +0 -1
  52. package/lib/typescript/commonjs/ui/components/ExpandableSectionWithModal.d.ts +0 -18
  53. package/lib/typescript/commonjs/ui/components/ExpandableSectionWithModal.d.ts.map +0 -1
  54. package/lib/typescript/commonjs/ui/components/FilterViewPattern.d.ts +0 -15
  55. package/lib/typescript/commonjs/ui/components/FilterViewPattern.d.ts.map +0 -1
  56. package/lib/typescript/commonjs/ui/components/TypeBadge.d.ts +0 -6
  57. package/lib/typescript/commonjs/ui/components/TypeBadge.d.ts.map +0 -1
  58. package/lib/typescript/commonjs/ui/components/types.d.ts +0 -3
  59. package/lib/typescript/commonjs/ui/components/types.d.ts.map +0 -1
  60. package/lib/typescript/commonjs/ui/console/BubbleSettingsModal.d.ts +0 -11
  61. package/lib/typescript/commonjs/ui/console/BubbleSettingsModal.d.ts.map +0 -1
  62. package/lib/typescript/commonjs/ui/console/ConsoleSection.d.ts +0 -19
  63. package/lib/typescript/commonjs/ui/console/ConsoleSection.d.ts.map +0 -1
  64. package/lib/typescript/commonjs/ui/console/CyberpunkConsoleSection.d.ts +0 -17
  65. package/lib/typescript/commonjs/ui/console/CyberpunkConsoleSection.d.ts.map +0 -1
  66. package/lib/typescript/commonjs/ui/console/GalaxyButton.d.ts +0 -10
  67. package/lib/typescript/commonjs/ui/console/GalaxyButton.d.ts.map +0 -1
  68. package/lib/typescript/commonjs/ui/console/index.d.ts +0 -2
  69. package/lib/typescript/commonjs/ui/console/index.d.ts.map +0 -1
  70. package/lib/typescript/module/license/DeviceLimitModal.d.ts +0 -23
  71. package/lib/typescript/module/license/DeviceLimitModal.d.ts.map +0 -1
  72. package/lib/typescript/module/license/ManageDevicesModal.d.ts +0 -23
  73. package/lib/typescript/module/license/ManageDevicesModal.d.ts.map +0 -1
  74. package/lib/typescript/module/types/index.d.ts +0 -2
  75. package/lib/typescript/module/types/index.d.ts.map +0 -1
  76. package/lib/typescript/module/ui/components/Divider.d.ts +0 -2
  77. package/lib/typescript/module/ui/components/Divider.d.ts.map +0 -1
  78. package/lib/typescript/module/ui/components/ErrorBoundary.d.ts +0 -18
  79. package/lib/typescript/module/ui/components/ErrorBoundary.d.ts.map +0 -1
  80. package/lib/typescript/module/ui/components/ExpandableSection.d.ts +0 -15
  81. package/lib/typescript/module/ui/components/ExpandableSection.d.ts.map +0 -1
  82. package/lib/typescript/module/ui/components/ExpandableSectionHeader.d.ts +0 -13
  83. package/lib/typescript/module/ui/components/ExpandableSectionHeader.d.ts.map +0 -1
  84. package/lib/typescript/module/ui/components/ExpandableSectionWithModal.d.ts +0 -18
  85. package/lib/typescript/module/ui/components/ExpandableSectionWithModal.d.ts.map +0 -1
  86. package/lib/typescript/module/ui/components/FilterViewPattern.d.ts +0 -15
  87. package/lib/typescript/module/ui/components/FilterViewPattern.d.ts.map +0 -1
  88. package/lib/typescript/module/ui/components/TypeBadge.d.ts +0 -6
  89. package/lib/typescript/module/ui/components/TypeBadge.d.ts.map +0 -1
  90. package/lib/typescript/module/ui/components/types.d.ts +0 -3
  91. package/lib/typescript/module/ui/components/types.d.ts.map +0 -1
  92. package/lib/typescript/module/ui/console/BubbleSettingsModal.d.ts +0 -11
  93. package/lib/typescript/module/ui/console/BubbleSettingsModal.d.ts.map +0 -1
  94. package/lib/typescript/module/ui/console/ConsoleSection.d.ts +0 -19
  95. package/lib/typescript/module/ui/console/ConsoleSection.d.ts.map +0 -1
  96. package/lib/typescript/module/ui/console/CyberpunkConsoleSection.d.ts +0 -17
  97. package/lib/typescript/module/ui/console/CyberpunkConsoleSection.d.ts.map +0 -1
  98. package/lib/typescript/module/ui/console/GalaxyButton.d.ts +0 -10
  99. package/lib/typescript/module/ui/console/GalaxyButton.d.ts.map +0 -1
  100. package/lib/typescript/module/ui/console/index.d.ts +0 -2
  101. package/lib/typescript/module/ui/console/index.d.ts.map +0 -1
@@ -1,100 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.GalaxyButton = GalaxyButton;
7
- var _react = require("react");
8
- var _reactNative = require("react-native");
9
- var _absoluteFill = require("../../utils/absoluteFill.js");
10
- var _jsxRuntime = require("react/jsx-runtime");
11
- const {
12
- width: screenWidth
13
- } = _reactNative.Dimensions.get("window");
14
- function GalaxyButton({
15
- children,
16
- onPress,
17
- style
18
- }) {
19
- const starsTranslateY = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
20
- const starsRotate = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
21
- (0, _react.useEffect)(() => {
22
- // Star field animations
23
- _reactNative.Animated.loop(_reactNative.Animated.timing(starsTranslateY, {
24
- toValue: -135,
25
- duration: 60000,
26
- useNativeDriver: true
27
- })).start();
28
- _reactNative.Animated.loop(_reactNative.Animated.timing(starsRotate, {
29
- toValue: 1,
30
- duration: 90000,
31
- useNativeDriver: true
32
- })).start();
33
- }, [starsTranslateY, starsRotate]);
34
- const rotateInterpolate = starsRotate.interpolate({
35
- inputRange: [0, 1],
36
- outputRange: ["0deg", "360deg"]
37
- });
38
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
39
- onPress: onPress,
40
- style: [styles.buttonContainer, style],
41
- android_ripple: {
42
- color: "rgba(255, 255, 255, 0.1)"
43
- },
44
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
45
- style: styles.starsContainer,
46
- pointerEvents: "none",
47
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
48
- style: [styles.starsLayer, {
49
- transform: [{
50
- translateY: starsTranslateY
51
- }, {
52
- rotate: rotateInterpolate
53
- }]
54
- }],
55
- children: Array.from({
56
- length: 30
57
- }).map((_, i) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
58
- style: [styles.star, {
59
- left: Math.random() * screenWidth * 2,
60
- top: Math.random() * 400,
61
- width: Math.random() * 1.5 + 0.5,
62
- height: Math.random() * 1.5 + 0.5,
63
- opacity: Math.random() * 0.6 + 0.2
64
- }]
65
- }, `star-${i}`))
66
- })
67
- }), children]
68
- });
69
- }
70
- const styles = _reactNative.StyleSheet.create({
71
- buttonContainer: {
72
- position: "relative",
73
- backgroundColor: "rgba(31, 31, 31, 0.85)",
74
- borderRadius: 12,
75
- borderWidth: 1,
76
- borderColor: "rgba(128, 128, 128, 0.24)",
77
- overflow: "hidden"
78
- },
79
- starsContainer: {
80
- ..._absoluteFill.absoluteFill,
81
- overflow: "hidden"
82
- },
83
- starsLayer: {
84
- position: "absolute",
85
- width: screenWidth * 3,
86
- height: 800
87
- },
88
- star: {
89
- position: "absolute",
90
- backgroundColor: "#ffffff",
91
- borderRadius: 50,
92
- shadowColor: "#ffffff",
93
- shadowOffset: {
94
- width: 0,
95
- height: 0
96
- },
97
- shadowOpacity: 0.3,
98
- shadowRadius: 1
99
- }
100
- });
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "ConsoleSection", {
7
- enumerable: true,
8
- get: function () {
9
- return _ConsoleSection.ConsoleSection;
10
- }
11
- });
12
- var _ConsoleSection = require("./ConsoleSection.js");
@@ -1,474 +0,0 @@
1
- "use strict";
2
-
3
- /**
4
- * DeviceLimitModal - Shown when device limit is exceeded
5
- *
6
- * Displays registered devices and allows removing one to free up a slot.
7
- */
8
-
9
- import React, { useState, useEffect, useCallback } from "react";
10
- import { View, Text, TouchableOpacity, StyleSheet, Modal, ActivityIndicator, ScrollView, Alert, Platform, Linking } from "react-native";
11
- import { absoluteFill } from "../utils/absoluteFill.js";
12
- import { macOSColors } from "../ui/gameUI/constants/macOSDesignSystemColors.js";
13
- import { X, Smartphone, Trash2, RefreshCw, AlertTriangle } from "../icons/lucide-icons.js";
14
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
- // Lazy load LicenseManager
16
- let _LicenseManager = null;
17
- function getLicenseManager() {
18
- if (!_LicenseManager) {
19
- try {
20
- const mod = require("@buoy-gg/license");
21
- _LicenseManager = mod.LicenseManager;
22
- } catch {
23
- // Not available
24
- }
25
- }
26
- return _LicenseManager;
27
- }
28
- export const DeviceLimitModal = ({
29
- visible,
30
- onClose,
31
- onRetry,
32
- maxDevices
33
- }) => {
34
- const [devices, setDevices] = useState([]);
35
- const [isLoading, setIsLoading] = useState(true);
36
- const [isRemoving, setIsRemoving] = useState(null);
37
- const [error, setError] = useState(null);
38
-
39
- // Only allow device removal on web (admin dashboard)
40
- const canRemoveDevices = Platform.OS === "web";
41
- const fetchDevices = useCallback(async () => {
42
- setIsLoading(true);
43
- setError(null);
44
- try {
45
- const LicenseManager = getLicenseManager();
46
- if (LicenseManager?.getRegisteredDevices) {
47
- const registeredDevices = await LicenseManager.getRegisteredDevices();
48
- setDevices(registeredDevices);
49
- }
50
- } catch (err) {
51
- setError("Failed to load devices");
52
- console.warn("[DeviceLimitModal] Failed to fetch devices:", err);
53
- } finally {
54
- setIsLoading(false);
55
- }
56
- }, []);
57
- useEffect(() => {
58
- if (visible) {
59
- fetchDevices();
60
- }
61
- }, [visible, fetchDevices]);
62
- const handleRemoveDevice = useCallback(async device => {
63
- const confirmRemove = () => {
64
- return new Promise(resolve => {
65
- if (Platform.OS === "web") {
66
- // Use globalThis for cross-platform window access
67
- const win = globalThis;
68
- resolve(win.confirm?.(`Remove "${device.name}" from your license?`) ?? true);
69
- } else {
70
- Alert.alert("Remove Device", `Remove "${device.name}" from your license? You can re-register it later.`, [{
71
- text: "Cancel",
72
- style: "cancel",
73
- onPress: () => resolve(false)
74
- }, {
75
- text: "Remove",
76
- style: "destructive",
77
- onPress: () => resolve(true)
78
- }]);
79
- }
80
- });
81
- };
82
- const confirmed = await confirmRemove();
83
- if (!confirmed) return;
84
- setIsRemoving(device.id);
85
- try {
86
- const LicenseManager = getLicenseManager();
87
- if (LicenseManager?.deactivateDevice) {
88
- const success = await LicenseManager.deactivateDevice(device.id);
89
- if (success) {
90
- // Refresh the list
91
- await fetchDevices();
92
- // If we now have room, let user know they can retry
93
- if (devices.length <= maxDevices) {
94
- setError(null);
95
- }
96
- } else {
97
- setError("Failed to remove device");
98
- }
99
- }
100
- } catch (err) {
101
- setError("Failed to remove device");
102
- console.warn("[DeviceLimitModal] Failed to remove device:", err);
103
- } finally {
104
- setIsRemoving(null);
105
- }
106
- }, [fetchDevices, devices.length, maxDevices]);
107
- const formatDate = date => {
108
- const now = new Date();
109
- const diffMs = now.getTime() - date.getTime();
110
- const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
111
- if (diffDays === 0) return "Today";
112
- if (diffDays === 1) return "Yesterday";
113
- if (diffDays < 7) return `${diffDays} days ago`;
114
- if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;
115
- return `${Math.floor(diffDays / 30)} months ago`;
116
- };
117
- const canRetry = devices.length < maxDevices;
118
- return /*#__PURE__*/_jsx(Modal, {
119
- visible: visible,
120
- transparent: true,
121
- animationType: "fade",
122
- onRequestClose: onClose,
123
- children: /*#__PURE__*/_jsxs(View, {
124
- style: styles.overlay,
125
- children: [/*#__PURE__*/_jsx(TouchableOpacity, {
126
- style: styles.backdrop,
127
- activeOpacity: 1,
128
- onPress: onClose
129
- }), /*#__PURE__*/_jsxs(View, {
130
- style: styles.modal,
131
- children: [/*#__PURE__*/_jsx(TouchableOpacity, {
132
- style: styles.closeButton,
133
- onPress: onClose,
134
- activeOpacity: 0.7,
135
- children: /*#__PURE__*/_jsx(X, {
136
- size: 18,
137
- color: macOSColors.text.muted
138
- })
139
- }), /*#__PURE__*/_jsxs(View, {
140
- style: styles.header,
141
- children: [/*#__PURE__*/_jsx(View, {
142
- style: styles.iconContainer,
143
- children: /*#__PURE__*/_jsx(AlertTriangle, {
144
- size: 20,
145
- color: macOSColors.semantic.warning
146
- })
147
- }), /*#__PURE__*/_jsx(Text, {
148
- style: styles.title,
149
- children: "Device Limit Reached"
150
- }), /*#__PURE__*/_jsxs(Text, {
151
- style: styles.subtitle,
152
- children: ["Your license allows ", maxDevices, " device", maxDevices !== 1 ? "s" : "", ". Remove one to continue."]
153
- })]
154
- }), /*#__PURE__*/_jsx(View, {
155
- style: styles.countBadge,
156
- children: /*#__PURE__*/_jsxs(Text, {
157
- style: styles.countText,
158
- children: [devices.length, " / ", maxDevices, " devices registered"]
159
- })
160
- }), /*#__PURE__*/_jsx(View, {
161
- style: styles.devicesContainer,
162
- children: isLoading ? /*#__PURE__*/_jsxs(View, {
163
- style: styles.loadingContainer,
164
- children: [/*#__PURE__*/_jsx(ActivityIndicator, {
165
- size: "small",
166
- color: macOSColors.text.muted
167
- }), /*#__PURE__*/_jsx(Text, {
168
- style: styles.loadingText,
169
- children: "Loading devices..."
170
- })]
171
- }) : error && devices.length === 0 ? /*#__PURE__*/_jsxs(View, {
172
- style: styles.errorContainer,
173
- children: [/*#__PURE__*/_jsx(Text, {
174
- style: styles.errorText,
175
- children: error
176
- }), /*#__PURE__*/_jsxs(TouchableOpacity, {
177
- style: styles.retryButton,
178
- onPress: fetchDevices,
179
- children: [/*#__PURE__*/_jsx(RefreshCw, {
180
- size: 14,
181
- color: macOSColors.text.secondary
182
- }), /*#__PURE__*/_jsx(Text, {
183
- style: styles.retryButtonText,
184
- children: "Retry"
185
- })]
186
- })]
187
- }) : /*#__PURE__*/_jsx(ScrollView, {
188
- style: styles.devicesList,
189
- showsVerticalScrollIndicator: false,
190
- children: devices.map(device => /*#__PURE__*/_jsxs(View, {
191
- style: styles.deviceItem,
192
- children: [/*#__PURE__*/_jsx(View, {
193
- style: styles.deviceIcon,
194
- children: /*#__PURE__*/_jsx(Smartphone, {
195
- size: 16,
196
- color: macOSColors.text.secondary
197
- })
198
- }), /*#__PURE__*/_jsxs(View, {
199
- style: styles.deviceInfo,
200
- children: [/*#__PURE__*/_jsxs(Text, {
201
- style: styles.deviceName,
202
- numberOfLines: 1,
203
- children: [device.name, device.isCurrentDevice && /*#__PURE__*/_jsx(Text, {
204
- style: styles.currentBadge,
205
- children: " (this device)"
206
- })]
207
- }), /*#__PURE__*/_jsxs(Text, {
208
- style: styles.deviceMeta,
209
- children: [device.platform, " \u2022 Last seen ", formatDate(device.lastSeenAt)]
210
- })]
211
- }), canRemoveDevices && /*#__PURE__*/_jsx(TouchableOpacity, {
212
- style: [styles.removeButton, isRemoving === device.id && styles.removeButtonDisabled],
213
- onPress: () => handleRemoveDevice(device),
214
- disabled: isRemoving !== null,
215
- activeOpacity: 0.7,
216
- children: isRemoving === device.id ? /*#__PURE__*/_jsx(ActivityIndicator, {
217
- size: "small",
218
- color: macOSColors.semantic.error
219
- }) : /*#__PURE__*/_jsx(Trash2, {
220
- size: 14,
221
- color: macOSColors.semantic.error
222
- })
223
- })]
224
- }, device.id))
225
- })
226
- }), /*#__PURE__*/_jsx(View, {
227
- style: styles.actions,
228
- children: canRemoveDevices ?
229
- // Web: Show retry button or hint to remove
230
- canRetry ? /*#__PURE__*/_jsx(TouchableOpacity, {
231
- style: styles.primaryButton,
232
- onPress: onRetry,
233
- activeOpacity: 0.8,
234
- children: /*#__PURE__*/_jsx(Text, {
235
- style: styles.primaryButtonText,
236
- children: "Try Again"
237
- })
238
- }) : /*#__PURE__*/_jsx(Text, {
239
- style: styles.hintText,
240
- children: "Remove a device above to free up a slot"
241
- }) :
242
- /*#__PURE__*/
243
- // Mobile: Show instructions to use web dashboard
244
- _jsxs(View, {
245
- style: styles.mobileInstructions,
246
- children: [/*#__PURE__*/_jsx(Text, {
247
- style: styles.mobileInstructionsText,
248
- children: "To remove a device, visit your account dashboard at"
249
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
250
- onPress: () => Linking.openURL("https://buoy.gg/account"),
251
- activeOpacity: 0.7,
252
- children: /*#__PURE__*/_jsx(Text, {
253
- style: styles.mobileInstructionsLink,
254
- children: "buoy.gg/account"
255
- })
256
- })]
257
- })
258
- })]
259
- })]
260
- })
261
- });
262
- };
263
- const styles = StyleSheet.create({
264
- overlay: {
265
- flex: 1,
266
- justifyContent: "center",
267
- alignItems: "center"
268
- },
269
- backdrop: {
270
- ...absoluteFill,
271
- backgroundColor: "rgba(0, 0, 0, 0.8)"
272
- },
273
- modal: {
274
- backgroundColor: macOSColors.background.card,
275
- borderRadius: 12,
276
- padding: 24,
277
- width: "90%",
278
- maxWidth: 400,
279
- maxHeight: "80%",
280
- borderWidth: 1,
281
- borderColor: macOSColors.semantic.warning + "50",
282
- shadowColor: macOSColors.semantic.warning,
283
- shadowOffset: {
284
- width: 0,
285
- height: 0
286
- },
287
- shadowOpacity: 0.5,
288
- shadowRadius: 24,
289
- elevation: 24
290
- },
291
- closeButton: {
292
- position: "absolute",
293
- top: 12,
294
- right: 12,
295
- width: 28,
296
- height: 28,
297
- borderRadius: 6,
298
- backgroundColor: macOSColors.background.hover,
299
- alignItems: "center",
300
- justifyContent: "center",
301
- zIndex: 1
302
- },
303
- header: {
304
- alignItems: "center",
305
- marginBottom: 16,
306
- paddingTop: 8
307
- },
308
- iconContainer: {
309
- width: 48,
310
- height: 48,
311
- borderRadius: 12,
312
- backgroundColor: macOSColors.semantic.warning + "15",
313
- borderWidth: 1,
314
- borderColor: macOSColors.semantic.warning + "30",
315
- alignItems: "center",
316
- justifyContent: "center",
317
- marginBottom: 16
318
- },
319
- title: {
320
- fontSize: 18,
321
- fontWeight: "600",
322
- color: macOSColors.text.primary,
323
- marginBottom: 6
324
- },
325
- subtitle: {
326
- fontSize: 13,
327
- color: macOSColors.text.secondary,
328
- textAlign: "center",
329
- lineHeight: 18
330
- },
331
- countBadge: {
332
- alignSelf: "center",
333
- backgroundColor: macOSColors.semantic.warning + "20",
334
- paddingHorizontal: 12,
335
- paddingVertical: 6,
336
- borderRadius: 12,
337
- marginBottom: 16
338
- },
339
- countText: {
340
- fontSize: 12,
341
- fontWeight: "600",
342
- color: macOSColors.semantic.warning
343
- },
344
- devicesContainer: {
345
- backgroundColor: macOSColors.background.hover,
346
- borderRadius: 8,
347
- borderWidth: 1,
348
- borderColor: macOSColors.border.default,
349
- minHeight: 120,
350
- maxHeight: 200
351
- },
352
- loadingContainer: {
353
- flex: 1,
354
- alignItems: "center",
355
- justifyContent: "center",
356
- padding: 24,
357
- gap: 8
358
- },
359
- loadingText: {
360
- fontSize: 12,
361
- color: macOSColors.text.muted
362
- },
363
- errorContainer: {
364
- flex: 1,
365
- alignItems: "center",
366
- justifyContent: "center",
367
- padding: 24,
368
- gap: 12
369
- },
370
- errorText: {
371
- fontSize: 12,
372
- color: macOSColors.semantic.error
373
- },
374
- retryButton: {
375
- flexDirection: "row",
376
- alignItems: "center",
377
- gap: 6,
378
- paddingVertical: 8,
379
- paddingHorizontal: 12,
380
- borderRadius: 6,
381
- backgroundColor: macOSColors.background.input
382
- },
383
- retryButtonText: {
384
- fontSize: 12,
385
- color: macOSColors.text.secondary
386
- },
387
- devicesList: {
388
- padding: 8
389
- },
390
- deviceItem: {
391
- flexDirection: "row",
392
- alignItems: "center",
393
- padding: 10,
394
- borderRadius: 6,
395
- backgroundColor: macOSColors.background.input,
396
- marginBottom: 6
397
- },
398
- deviceIcon: {
399
- width: 32,
400
- height: 32,
401
- borderRadius: 8,
402
- backgroundColor: macOSColors.background.hover,
403
- alignItems: "center",
404
- justifyContent: "center",
405
- marginRight: 10
406
- },
407
- deviceInfo: {
408
- flex: 1,
409
- marginRight: 8
410
- },
411
- deviceName: {
412
- fontSize: 13,
413
- fontWeight: "500",
414
- color: macOSColors.text.primary
415
- },
416
- currentBadge: {
417
- fontSize: 11,
418
- fontWeight: "400",
419
- color: macOSColors.semantic.info
420
- },
421
- deviceMeta: {
422
- fontSize: 11,
423
- color: macOSColors.text.muted,
424
- marginTop: 2
425
- },
426
- removeButton: {
427
- width: 32,
428
- height: 32,
429
- borderRadius: 6,
430
- backgroundColor: macOSColors.semantic.error + "15",
431
- alignItems: "center",
432
- justifyContent: "center"
433
- },
434
- removeButtonDisabled: {
435
- opacity: 0.5
436
- },
437
- actions: {
438
- marginTop: 16,
439
- alignItems: "center"
440
- },
441
- primaryButton: {
442
- width: "100%",
443
- backgroundColor: macOSColors.semantic.info,
444
- borderRadius: 8,
445
- paddingVertical: 12,
446
- alignItems: "center"
447
- },
448
- primaryButtonText: {
449
- fontSize: 14,
450
- fontWeight: "600",
451
- color: "#000"
452
- },
453
- hintText: {
454
- fontSize: 12,
455
- color: macOSColors.text.muted,
456
- fontStyle: "italic"
457
- },
458
- mobileInstructions: {
459
- alignItems: "center",
460
- paddingVertical: 8
461
- },
462
- mobileInstructionsText: {
463
- fontSize: 12,
464
- color: macOSColors.text.secondary,
465
- textAlign: "center",
466
- lineHeight: 18
467
- },
468
- mobileInstructionsLink: {
469
- fontSize: 13,
470
- fontWeight: "600",
471
- color: macOSColors.semantic.info,
472
- marginTop: 4
473
- }
474
- });