@pickleball/expo-sdk 0.2.0 → 1.0.0

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 (89) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +155 -101
  3. package/dist/advanced-DcbHBCGb.d.ts +300 -0
  4. package/dist/advanced-DeQwg7MK.d.cts +300 -0
  5. package/dist/advanced.cjs +14 -2
  6. package/dist/advanced.d.cts +2 -2
  7. package/dist/advanced.d.ts +2 -2
  8. package/dist/advanced.js +17 -5
  9. package/dist/camera-controls-By8tHigY.d.cts +97 -0
  10. package/dist/camera-controls-rCBUGGPC.d.ts +97 -0
  11. package/dist/chunk-62YV3PCD.cjs +139 -0
  12. package/dist/chunk-6F3HN6US.js +50 -0
  13. package/dist/chunk-6YE5BL3A.cjs +50 -0
  14. package/dist/chunk-7Z7TN5N3.js +318 -0
  15. package/dist/{chunk-TRLASNPQ.cjs → chunk-GXQYMPHE.cjs} +1 -1
  16. package/dist/{chunk-TBPR2QND.cjs → chunk-IUIRVKJI.cjs} +736 -399
  17. package/dist/chunk-TBUEXRFQ.cjs +318 -0
  18. package/dist/{chunk-FODE2W2H.js → chunk-XGP2MN5R.js} +688 -351
  19. package/dist/{chunk-6JOMESNT.js → chunk-XL4CISVQ.js} +1 -1
  20. package/dist/chunk-ZSKSXOCZ.js +139 -0
  21. package/dist/convex-command-subscription-Cabh9tND.d.ts +41 -0
  22. package/dist/convex-command-subscription-DUgpu75l.d.cts +41 -0
  23. package/dist/device-agent/index.cjs +973 -44
  24. package/dist/device-agent/index.d.cts +339 -3
  25. package/dist/device-agent/index.d.ts +339 -3
  26. package/dist/device-agent/index.js +940 -11
  27. package/dist/{engine-CCSSqPbZ.d.cts → engine-BSvSdCSE.d.cts} +227 -2
  28. package/dist/{engine-CCSSqPbZ.d.ts → engine-BSvSdCSE.d.ts} +227 -2
  29. package/dist/index.cjs +419 -937
  30. package/dist/index.d.cts +315 -32
  31. package/dist/index.d.ts +315 -32
  32. package/dist/index.js +423 -941
  33. package/dist/plugin.cjs +11 -13
  34. package/dist/plugin.d.cts +15 -1
  35. package/dist/plugin.d.ts +15 -1
  36. package/dist/plugin.js +7 -9
  37. package/dist/realtime/index.cjs +31 -0
  38. package/dist/realtime/index.d.cts +15 -0
  39. package/dist/realtime/index.d.ts +15 -0
  40. package/dist/realtime/index.js +31 -0
  41. package/dist/ui/index.cjs +1297 -0
  42. package/dist/ui/index.d.cts +493 -0
  43. package/dist/ui/index.d.ts +493 -0
  44. package/dist/ui/index.js +1297 -0
  45. package/dist/version.cjs +2 -2
  46. package/dist/version.js +1 -1
  47. package/package.json +31 -15
  48. package/src/advanced.ts +11 -9
  49. package/src/auto-resume.tsx +259 -0
  50. package/src/camera-controls.ts +99 -0
  51. package/src/camera-grant-provider.ts +392 -0
  52. package/src/camera-settings.ts +133 -0
  53. package/src/contracts.ts +73 -0
  54. package/src/device-agent/agent.ts +262 -9
  55. package/src/device-agent/beat-policy.ts +46 -0
  56. package/src/device-agent/component.tsx +11 -0
  57. package/src/device-agent/convex-beat-transport.ts +140 -0
  58. package/src/device-agent/convex-command-subscription.ts +101 -0
  59. package/src/device-agent/convex-control-channel.ts +7 -1
  60. package/src/device-agent/http-transport.ts +22 -1
  61. package/src/device-agent/index.ts +22 -0
  62. package/src/device-agent/mqtt-channel.ts +379 -0
  63. package/src/device-agent/mqtt-codec.ts +347 -0
  64. package/src/device-agent/tournament.ts +352 -0
  65. package/src/engine.ts +580 -15
  66. package/src/http-session-provider.ts +21 -189
  67. package/src/index.ts +84 -5
  68. package/src/local-video-quality.ts +43 -0
  69. package/src/native-runtime.ts +234 -78
  70. package/src/plugin.ts +19 -6
  71. package/src/provider.tsx +94 -18
  72. package/src/realtime/index.ts +56 -0
  73. package/src/resume-policy.ts +85 -0
  74. package/src/resume.ts +132 -0
  75. package/src/rtmp-room-adapter.ts +164 -12
  76. package/src/session-grant.ts +256 -0
  77. package/src/ui/camera-screen.tsx +484 -0
  78. package/src/ui/controls-sheet.tsx +445 -0
  79. package/src/ui/copy.ts +326 -0
  80. package/src/ui/helpers.ts +105 -0
  81. package/src/ui/hooks.ts +59 -0
  82. package/src/ui/index.ts +42 -0
  83. package/src/ui/preview-view.tsx +39 -0
  84. package/src/ui/primitives.tsx +304 -0
  85. package/src/uplink-check.ts +173 -0
  86. package/dist/advanced-BXDrDl1h.d.ts +0 -316
  87. package/dist/advanced-BdAa2Erv.d.cts +0 -316
  88. package/src/livekit-room-adapter.ts +0 -390
  89. package/src/livestream-screen.tsx +0 -1002
@@ -0,0 +1,493 @@
1
+ import React, { ReactNode, ComponentType } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ import { d as CameraSettingsStore, A as AntiFlickerMode, a as CameraCapabilities } from '../camera-controls-rCBUGGPC.js';
4
+ import { k as ExpoSdkErrorCode, e as CameraDeviceInfo, n as LivestreamState } from '../engine-BSvSdCSE.js';
5
+
6
+ /**
7
+ * Chữ trên màn hình camera + sheet cấu hình (vi/en). Chuyển từ
8
+ * apps/device-streamer; bản en là bản dịch tương đương để app đối tác dùng
9
+ * được ngay. App muốn chữ khác thì truyền prop (statusPill/statusHint/title)
10
+ * — không cần fork màn hình.
11
+ */
12
+
13
+ type UiLocale = "vi" | "en";
14
+ interface UiCopy {
15
+ pill: {
16
+ opening: string;
17
+ ready: string;
18
+ connecting: string;
19
+ paused: string;
20
+ court: string;
21
+ standby: string;
22
+ live: string;
23
+ reconnecting: string;
24
+ ending: string;
25
+ error: string;
26
+ };
27
+ hint: {
28
+ casualPreview: string;
29
+ casualStandby: string;
30
+ paused: string;
31
+ courtPreview: string;
32
+ courtStandby: (court: string) => string;
33
+ courtStandbyNoCourt: string;
34
+ connecting: string;
35
+ reconnecting: string;
36
+ ending: string;
37
+ errorFallback: string;
38
+ cameraOpening: string;
39
+ cameraError: string;
40
+ };
41
+ button: {
42
+ goLive: string;
43
+ publishNow: string;
44
+ resume: string;
45
+ stop: string;
46
+ stopQuestion: string;
47
+ confirmStop: string;
48
+ cancel: string;
49
+ retry: string;
50
+ connecting: string;
51
+ ending: string;
52
+ };
53
+ lens: {
54
+ front: string;
55
+ };
56
+ thermal: {
57
+ title: string;
58
+ subtitle: string;
59
+ };
60
+ /** Tiêu đề + cách xử lý theo mã lỗi (chuyển từ LivestreamScreen 0.x). */
61
+ errors: {
62
+ title: Record<ExpoSdkErrorCode, string>;
63
+ remediation: Record<ExpoSdkErrorCode, string>;
64
+ technicalDetail: string;
65
+ };
66
+ sheet: {
67
+ title: string;
68
+ close: string;
69
+ /** Nhãn a11y của vùng nền bấm-để-đóng (khác nút ✕ để test/đọc màn hình phân biệt). */
70
+ closeBackdrop: string;
71
+ resolution: string;
72
+ fps: string;
73
+ fps60Note: string;
74
+ antiFlicker: string;
75
+ antiFlickerNote: string;
76
+ auto: string;
77
+ lockedNote: string;
78
+ defaultCamera: string;
79
+ autoCamera: string;
80
+ autoCameraHint: string;
81
+ frontCamera: string;
82
+ backCamera: string;
83
+ cameraIdHint: (id: string) => string;
84
+ zoom: string;
85
+ ev: string;
86
+ focusLock: string;
87
+ exposureLock: string;
88
+ torch: string;
89
+ network: string;
90
+ runCheck: string;
91
+ running: string;
92
+ busyNote: string;
93
+ resultLine: (input: {
94
+ uploadMbps: number;
95
+ requiredMbps: number;
96
+ resolution: number;
97
+ fps: number;
98
+ pingMs: number | null;
99
+ }) => string;
100
+ good: string;
101
+ ok: string;
102
+ low: string;
103
+ checkError: string;
104
+ };
105
+ }
106
+ declare const uiCopy: Record<UiLocale, UiCopy>;
107
+
108
+ interface CameraControlsSheetSections {
109
+ quality?: boolean;
110
+ antiFlicker?: boolean;
111
+ camera?: boolean;
112
+ zoom?: boolean;
113
+ exposure?: boolean;
114
+ locks?: boolean;
115
+ torch?: boolean;
116
+ uplink?: boolean;
117
+ }
118
+ interface CameraControlsSheetProps {
119
+ visible: boolean;
120
+ onClose: () => void;
121
+ settings: CameraSettingsStore;
122
+ /** Ẩn mục không cần (mặc định hiện tất cả). */
123
+ sections?: CameraControlsSheetSections;
124
+ /** Đo mạng: đích POST + HEAD đo RTT (VD ingest của bạn). */
125
+ uplink?: {
126
+ uploadUrl?: string;
127
+ pingUrl?: string;
128
+ };
129
+ /**
130
+ * "side": panel nửa phải (màn ngang); "bottom": bottom-sheet (màn dọc);
131
+ * "auto" (mặc định) theo kích thước cửa sổ.
132
+ */
133
+ layout?: "auto" | "side" | "bottom";
134
+ title?: string;
135
+ /** Hàng thêm của app ở cuối sheet (Picklive Camera: Nguồn, Thoát kiosk, badge OTA). */
136
+ footer?: ReactNode;
137
+ locale?: UiLocale;
138
+ }
139
+ declare function CameraControlsSheet(props: CameraControlsSheetProps): React.JSX.Element;
140
+
141
+ /** Luật THUẦN của màn hình camera — test được, không React. */
142
+ interface StatusPill$1 {
143
+ label: string;
144
+ color: string;
145
+ }
146
+ /** Màu ngữ nghĩa của pill — trùng bảng màu app Picklive Camera (không theo theme). */
147
+ declare const PILL_COLORS: Readonly<{
148
+ gray: "#6b7280";
149
+ green: "#22c55e";
150
+ amber: "#f59e0b";
151
+ orange: "#f97316";
152
+ red: "#ef4444";
153
+ darkRed: "#b91c1c";
154
+ }>;
155
+ interface StatusPillOptions {
156
+ /** elapsedMs > 0 ở standby = đã phát rồi hạ về chờ (tạm dừng). */
157
+ elapsedMs?: number;
158
+ /** Phiên gắn sân: standby là "TRỰC SÂN" thay vì "SẴN SÀNG PHÁT". */
159
+ courtBound?: boolean;
160
+ locale?: UiLocale;
161
+ }
162
+ /** Pill theo TỪNG trạng thái engine — không gộp chung "Đang chờ". */
163
+ declare function statusPillFor(state: LivestreamState, options?: StatusPillOptions): StatusPill$1;
164
+ /** Đuôi sessionId để đối chiếu với URL /dashboard/<id> — đủ phân biệt, không tràn màn hình. */
165
+ declare function shortSessionId(sessionId: string): string;
166
+ /** mm:ss (hoặc h:mm:ss khi qua giờ) từ elapsedMs của engine — đếm thời gian PHÁT. */
167
+ declare function formatElapsed(ms: number): string;
168
+ /**
169
+ * Nhãn lens từ label tiếng Anh của native ("Back Ultra Wide Camera", "Back
170
+ * Telephoto Camera", …) — load-bearing: native dựng nhãn đúng dạng này để UI
171
+ * dò được (native-contract test giữ hợp đồng).
172
+ */
173
+ declare function lensShortLabel(label: string): string;
174
+ /** previewTrack của engine ở mode device-rtmp là `{kind:"rtmp"}` — JS không có track để bind. */
175
+ declare function isRtmpPreview(previewTrack: unknown): boolean;
176
+ /** Lens đang chọn: id engine chọn tường minh, không thì lens 1x mặc định của camera sau. */
177
+ declare function activeLensId(cameras: CameraDeviceInfo[], selectedCameraId: string | null): string | null;
178
+
179
+ /**
180
+ * Màn hình camera dựng sẵn — bố cục của Picklive Camera (preview full-bleed,
181
+ * pill + tên/id phiên, hint, hàng lens, dòng info, •••, tối màn hình tiết kiệm
182
+ * nhiệt) cộng nút chính cho chế độ casual.
183
+ *
184
+ * Màn hình KHÔNG tự xin grant: casual thì `onGoLive` của app xin grant từ
185
+ * backend đối tác rồi gọi `live.start(input, {autoPublish:true})`; chế độ sân
186
+ * thì app arm bằng useStandbySession và trọng tài lật live qua match-start.
187
+ * Mọi ô chữ đều ghi đè được bằng prop để app fleet/đối tác chèn trạng thái
188
+ * của riêng mình (CHỜ GHÉP, tên máy, mã ghép…).
189
+ */
190
+ type CameraScreenMode = "casual" | "court";
191
+ interface CameraScreenSheetRenderProps {
192
+ visible: boolean;
193
+ onClose: () => void;
194
+ }
195
+ interface PickleballCameraScreenProps {
196
+ /** casual (mặc định): user bấm phát/dừng trên máy; court: đứng chờ lệnh server. */
197
+ mode?: CameraScreenMode;
198
+ /** Store cấu hình camera — nuôi dòng info + sheet ••• + chống chớp đèn. */
199
+ settings?: CameraSettingsStore;
200
+ /** Nút chính (Bắt đầu phát / Phát ngay / Dừng). Mặc định: bật ở casual, tắt ở court. */
201
+ showGoLiveButton?: boolean;
202
+ /** Casual, ở preview: app xin grant rồi start(autoPublish). Không có → ẩn nút ở preview. */
203
+ onGoLive?: () => void | Promise<void>;
204
+ /** Mặc định live.stop("user"). */
205
+ onStop?: () => void | Promise<void>;
206
+ /** Tiêu đề phiên (SDK không giữ tiêu đề trong snapshot). */
207
+ title?: string;
208
+ /** Nhãn sân cho hint chế độ court. */
209
+ courtLabel?: string;
210
+ /** Ghi đè pill (null = ẩn; undefined = mặc định theo state). */
211
+ statusPill?: StatusPill$1 | null;
212
+ /** Ghi đè dòng hint (null = ẩn; undefined = mặc định theo state/mode). */
213
+ statusHint?: string | null;
214
+ /** Màu chấm trước hint (app fleet: xanh khi kênh điều khiển đã mở). */
215
+ statusHintDotColor?: string;
216
+ /** Góc trên phải, cạnh nút ••• (fleet: chip tên máy). */
217
+ renderTopRight?: () => ReactNode;
218
+ /** Dưới dòng info (fleet: badge OTA). */
219
+ renderBottom?: () => ReactNode;
220
+ /** Giữa màn hình (fleet: thẻ mã ghép). */
221
+ children?: ReactNode;
222
+ /**
223
+ * Sheet •••: false = không có nút; bỏ trống = CameraControlsSheet mặc định
224
+ * (cần `settings`); hàm = app dựng sheet của mình với {visible,onClose}.
225
+ */
226
+ controls?: false | ((sheet: CameraScreenSheetRenderProps) => ReactNode);
227
+ /** Props chuyển cho CameraControlsSheet mặc định (sections/uplink/footer/layout). */
228
+ controlsProps?: Omit<CameraControlsSheetProps, "visible" | "onClose" | "settings">;
229
+ /** Hàng chọn lens (mặc định bật). */
230
+ lensRow?: boolean;
231
+ /** Dòng info dưới lens (null = ẩn; mặc định "720p • 30 fps • H.264" từ settings). */
232
+ infoLine?: string | null;
233
+ /** Tự mở camera khi idle/ended (mặc định bật). Tắt nếu app tự lo (fleet có chế độ nghỉ). */
234
+ autoPrepare?: boolean;
235
+ captureOrientation?: "portrait" | "landscape";
236
+ /** Tối màn hình sau chừng này ms ở LIVE; null = tắt. Mặc định 30s. */
237
+ thermalDimAfterMs?: number | null;
238
+ /** Dòng phụ trên màn tối (fleet: tên máy). */
239
+ thermalDimCaption?: string;
240
+ locale?: UiLocale;
241
+ style?: StyleProp<ViewStyle>;
242
+ }
243
+ declare function PickleballCameraScreen(props: PickleballCameraScreenProps): React.JSX.Element;
244
+
245
+ /**
246
+ * Bounds + cờ hỗ trợ của lens đang gắn — đọc lại khi `active` bật (mở sheet)
247
+ * và khi đổi lens. null = module/hàm chưa có hoặc camera chưa mở → UI ẩn control.
248
+ */
249
+ declare function useCameraCapabilities(active: boolean, cameraKey: string | null): CameraCapabilities | null;
250
+ /**
251
+ * Tự tối màn hình tiết kiệm nhiệt/pin sau `afterMs` ở trạng thái LIVE; chạm để
252
+ * bật lại (setDimmed(false)). null = tắt tính năng.
253
+ */
254
+ declare function useThermalDim(state: LivestreamState, afterMs: number | null): [boolean, (dimmed: boolean) => void];
255
+ /**
256
+ * Đẩy chế độ chống chớp xuống native khi mount + mỗi lần đổi. Gọi trước khi
257
+ * camera mở cũng không mất — native lưu giá trị và tự áp lại mỗi lần
258
+ * attachCamera (kể cả đổi lens). iOS/binary cũ thiếu hàm → no-op.
259
+ */
260
+ declare function useAntiFlicker(mode: AntiFlickerMode | undefined): void;
261
+
262
+ type PreviewComponent = ComponentType<{
263
+ style?: StyleProp<ViewStyle>;
264
+ }>;
265
+ /**
266
+ * View native của @pickleball/rtmp-native, nạp LƯỜI: import tĩnh là app nào
267
+ * chưa cài module (hoặc static-render web của expo-router) gãy ngay lúc
268
+ * import subpath ./ui. Không có module → null, màn hình vẽ nền tối thay vì
269
+ * khung hình.
270
+ *
271
+ * BẮT BUỘC render view này khi camera đã mở, nếu không màn preview TỐI ĐEN:
272
+ * native vẫn encode bình thường nhưng không có đích để vẽ khung hình.
273
+ */
274
+ declare function getRtmpPreviewView(): PreviewComponent | null;
275
+ /** Cho test: xoá cache để mock module khác. */
276
+ declare function resetRtmpPreviewViewCache(): void;
277
+ declare function RtmpPreview({ style }: {
278
+ style?: StyleProp<ViewStyle>;
279
+ }): React.JSX.Element | null;
280
+
281
+ /**
282
+ * Khối dựng sẵn của màn hình camera / sheet cấu hình — export để app đối tác
283
+ * ghép thêm hàng của riêng mình vào footer sheet (Picklive Camera: "Nguồn",
284
+ * "Thoát kiosk") mà vẫn cùng một ngôn ngữ hình ảnh.
285
+ */
286
+ declare const uiColors: Readonly<{
287
+ ink: "#0a0a0b";
288
+ text: "#ffffff";
289
+ textSecondary: "#e5e7eb";
290
+ textMuted: "#d1d5db";
291
+ textDim: "#9ca3af";
292
+ border: "#3f3f46";
293
+ panel: "rgba(15,15,19,0.93)";
294
+ chip: "rgba(0,0,0,0.55)";
295
+ chipStrong: "rgba(0,0,0,0.72)";
296
+ surface: "rgba(255,255,255,0.06)";
297
+ hairline: "rgba(255,255,255,0.08)";
298
+ good: "#4ade80";
299
+ ok: "#facc15";
300
+ low: "#f87171";
301
+ }>;
302
+ declare function StatusPill({ label, color, style, }: {
303
+ label: string;
304
+ color: string;
305
+ style?: StyleProp<ViewStyle>;
306
+ }): React.JSX.Element;
307
+ declare function ControlRow({ label, children }: {
308
+ label: string;
309
+ children?: ReactNode;
310
+ }): React.JSX.Element;
311
+ declare function Note({ children }: {
312
+ children: ReactNode;
313
+ }): React.JSX.Element;
314
+ declare function ActionButton({ label, onPress, disabled, accessibilityLabel, }: {
315
+ label: string;
316
+ onPress: () => void;
317
+ disabled?: boolean;
318
+ accessibilityLabel?: string;
319
+ }): React.JSX.Element;
320
+ /** Một dòng chọn camera — nhãn + id, vì nhãn máy thật hay trùng nhau. */
321
+ declare function CameraOption({ label, hint, active, disabled, onPress, }: {
322
+ label: string;
323
+ hint: string;
324
+ active: boolean;
325
+ disabled?: boolean;
326
+ onPress: () => void;
327
+ }): React.JSX.Element;
328
+ declare function Segmented<T extends number | string>({ options, value, disabled, onChange, }: {
329
+ options: Array<{
330
+ value: T;
331
+ label: string;
332
+ }>;
333
+ value: T;
334
+ disabled?: boolean;
335
+ onChange: (value: T) => void;
336
+ }): React.JSX.Element;
337
+ declare function PresetButton({ label, active, onPress, }: {
338
+ label: string;
339
+ active: boolean;
340
+ onPress: () => void;
341
+ }): React.JSX.Element;
342
+ /** Hàng chọn ống kính: 0.5x / 1x / Tele (camera sau) + camera trước nếu có. */
343
+ declare function LensRow({ cameras, selectedCameraId, onSelect, locale, }: {
344
+ cameras: CameraDeviceInfo[];
345
+ selectedCameraId: string | null;
346
+ onSelect: (deviceId: string) => void;
347
+ locale?: UiLocale;
348
+ }): React.JSX.Element | null;
349
+ declare const uiStyles: {
350
+ pill: {
351
+ borderRadius: number;
352
+ paddingHorizontal: number;
353
+ paddingVertical: number;
354
+ };
355
+ pillText: {
356
+ color: "#ffffff";
357
+ fontWeight: "800";
358
+ fontSize: number;
359
+ letterSpacing: number;
360
+ fontVariant: "tabular-nums"[];
361
+ };
362
+ row: {
363
+ flexDirection: "row";
364
+ alignItems: "center";
365
+ justifyContent: "space-between";
366
+ gap: number;
367
+ minHeight: number;
368
+ };
369
+ rowLabel: {
370
+ color: "#e5e7eb";
371
+ fontSize: number;
372
+ fontWeight: "600";
373
+ };
374
+ note: {
375
+ color: "#9ca3af";
376
+ fontSize: number;
377
+ lineHeight: number;
378
+ };
379
+ actionButton: {
380
+ borderRadius: number;
381
+ backgroundColor: "rgba(255,255,255,0.06)";
382
+ borderWidth: number;
383
+ borderColor: "#3f3f46";
384
+ paddingHorizontal: number;
385
+ paddingVertical: number;
386
+ alignSelf: "flex-start";
387
+ };
388
+ actionButtonText: {
389
+ color: "#e5e7eb";
390
+ fontSize: number;
391
+ fontWeight: "700";
392
+ };
393
+ cameraOption: {
394
+ flexDirection: "row";
395
+ alignItems: "center";
396
+ justifyContent: "space-between";
397
+ gap: number;
398
+ backgroundColor: "rgba(255,255,255,0.06)";
399
+ borderRadius: number;
400
+ paddingHorizontal: number;
401
+ paddingVertical: number;
402
+ };
403
+ cameraOptionActive: {
404
+ backgroundColor: "#ffffff";
405
+ };
406
+ cameraOptionText: {
407
+ color: "#d1d5db";
408
+ fontSize: number;
409
+ fontWeight: "700";
410
+ };
411
+ cameraOptionHint: {
412
+ color: "#9ca3af";
413
+ fontSize: number;
414
+ flexShrink: number;
415
+ };
416
+ cameraOptionTextActive: {
417
+ color: "#0a0a0b";
418
+ };
419
+ segmented: {
420
+ flexDirection: "row";
421
+ backgroundColor: "rgba(255,255,255,0.06)";
422
+ borderRadius: number;
423
+ padding: number;
424
+ };
425
+ segment: {
426
+ borderRadius: number;
427
+ paddingHorizontal: number;
428
+ paddingVertical: number;
429
+ };
430
+ segmentActive: {
431
+ backgroundColor: "#ffffff";
432
+ };
433
+ segmentText: {
434
+ color: "#d1d5db";
435
+ fontSize: number;
436
+ fontWeight: "700";
437
+ };
438
+ segmentTextActive: {
439
+ color: "#0a0a0b";
440
+ };
441
+ disabled: {
442
+ opacity: number;
443
+ };
444
+ presetRow: {
445
+ flexDirection: "row";
446
+ gap: number;
447
+ flexWrap: "wrap";
448
+ };
449
+ preset: {
450
+ borderRadius: number;
451
+ borderWidth: number;
452
+ borderColor: "#3f3f46";
453
+ paddingHorizontal: number;
454
+ paddingVertical: number;
455
+ };
456
+ presetActive: {
457
+ backgroundColor: "#ffffff";
458
+ borderColor: "#ffffff";
459
+ };
460
+ presetText: {
461
+ color: "#d1d5db";
462
+ fontSize: number;
463
+ fontWeight: "700";
464
+ };
465
+ presetTextActive: {
466
+ color: "#0a0a0b";
467
+ };
468
+ lensRow: {
469
+ flexDirection: "row";
470
+ gap: number;
471
+ backgroundColor: "rgba(0,0,0,0.55)";
472
+ borderRadius: number;
473
+ padding: number;
474
+ };
475
+ lensButton: {
476
+ borderRadius: number;
477
+ paddingHorizontal: number;
478
+ paddingVertical: number;
479
+ };
480
+ lensButtonActive: {
481
+ backgroundColor: "#ffffff";
482
+ };
483
+ lensText: {
484
+ color: "#e5e7eb";
485
+ fontSize: number;
486
+ fontWeight: "700";
487
+ };
488
+ lensTextActive: {
489
+ color: "#0a0a0b";
490
+ };
491
+ };
492
+
493
+ export { ActionButton, CameraControlsSheet, type CameraControlsSheetProps, type CameraControlsSheetSections, CameraOption, type CameraScreenMode, type CameraScreenSheetRenderProps, ControlRow, LensRow, Note, PILL_COLORS, PickleballCameraScreen, type PickleballCameraScreenProps, PresetButton, RtmpPreview, Segmented, StatusPill, type StatusPillOptions, type StatusPill$1 as StatusPillValue, type UiCopy, type UiLocale, activeLensId, formatElapsed, getRtmpPreviewView, isRtmpPreview, lensShortLabel, resetRtmpPreviewViewCache, shortSessionId, statusPillFor, uiColors, uiCopy, uiStyles, useAntiFlicker, useCameraCapabilities, useThermalDim };