@useupup/react 3.3.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/AudioUploader-2WITC5YR.js +298 -0
  4. package/dist/AudioUploader-2WITC5YR.js.map +1 -0
  5. package/dist/AudioUploader-HWP4U6UJ.cjs +298 -0
  6. package/dist/AudioUploader-HWP4U6UJ.cjs.map +1 -0
  7. package/dist/BoxUploader-NEGZOMR4.cjs +172 -0
  8. package/dist/BoxUploader-NEGZOMR4.cjs.map +1 -0
  9. package/dist/BoxUploader-VE5LRJ7M.js +172 -0
  10. package/dist/BoxUploader-VE5LRJ7M.js.map +1 -0
  11. package/dist/CameraUploader-BJ3AU3VS.cjs +200 -0
  12. package/dist/CameraUploader-BJ3AU3VS.cjs.map +1 -0
  13. package/dist/CameraUploader-WF5A6UIS.js +200 -0
  14. package/dist/CameraUploader-WF5A6UIS.js.map +1 -0
  15. package/dist/DropboxUploader-INTOYHJP.cjs +174 -0
  16. package/dist/DropboxUploader-INTOYHJP.cjs.map +1 -0
  17. package/dist/DropboxUploader-VMUYG3OP.js +174 -0
  18. package/dist/DropboxUploader-VMUYG3OP.js.map +1 -0
  19. package/dist/GoogleDriveUploader-CXZUZI6R.cjs +177 -0
  20. package/dist/GoogleDriveUploader-CXZUZI6R.cjs.map +1 -0
  21. package/dist/GoogleDriveUploader-YA56X3QR.js +177 -0
  22. package/dist/GoogleDriveUploader-YA56X3QR.js.map +1 -0
  23. package/dist/ImageEditorInline-GJ3HCPPZ.cjs +185 -0
  24. package/dist/ImageEditorInline-GJ3HCPPZ.cjs.map +1 -0
  25. package/dist/ImageEditorInline-N2NSAODR.js +185 -0
  26. package/dist/ImageEditorInline-N2NSAODR.js.map +1 -0
  27. package/dist/ImageEditorModal-CWKMDVPY.js +236 -0
  28. package/dist/ImageEditorModal-CWKMDVPY.js.map +1 -0
  29. package/dist/ImageEditorModal-XJKPBTVQ.cjs +236 -0
  30. package/dist/ImageEditorModal-XJKPBTVQ.cjs.map +1 -0
  31. package/dist/OneDriveUploader-4RPTY7KT.cjs +175 -0
  32. package/dist/OneDriveUploader-4RPTY7KT.cjs.map +1 -0
  33. package/dist/OneDriveUploader-I25Y6AJP.js +175 -0
  34. package/dist/OneDriveUploader-I25Y6AJP.js.map +1 -0
  35. package/dist/ScreenCaptureUploader-7K6QPD42.cjs +281 -0
  36. package/dist/ScreenCaptureUploader-7K6QPD42.cjs.map +1 -0
  37. package/dist/ScreenCaptureUploader-WKDO4S75.js +281 -0
  38. package/dist/ScreenCaptureUploader-WKDO4S75.js.map +1 -0
  39. package/dist/chunk-6TFTTLOD.js +852 -0
  40. package/dist/chunk-6TFTTLOD.js.map +1 -0
  41. package/dist/chunk-DZQBTC6T.cjs +39 -0
  42. package/dist/chunk-DZQBTC6T.cjs.map +1 -0
  43. package/dist/chunk-GNMEQB32.cjs +195 -0
  44. package/dist/chunk-GNMEQB32.cjs.map +1 -0
  45. package/dist/chunk-IG62MHVQ.cjs +276 -0
  46. package/dist/chunk-IG62MHVQ.cjs.map +1 -0
  47. package/dist/chunk-L3E5OMY7.cjs +852 -0
  48. package/dist/chunk-L3E5OMY7.cjs.map +1 -0
  49. package/dist/chunk-LCMDDPUD.js +276 -0
  50. package/dist/chunk-LCMDDPUD.js.map +1 -0
  51. package/dist/chunk-N4XGN66E.cjs +79 -0
  52. package/dist/chunk-N4XGN66E.cjs.map +1 -0
  53. package/dist/chunk-N7TWHP5Z.js +195 -0
  54. package/dist/chunk-N7TWHP5Z.js.map +1 -0
  55. package/dist/chunk-OXWVO7Z6.cjs +70 -0
  56. package/dist/chunk-OXWVO7Z6.cjs.map +1 -0
  57. package/dist/chunk-PLGHK2Y4.js +79 -0
  58. package/dist/chunk-PLGHK2Y4.js.map +1 -0
  59. package/dist/chunk-SSLP3MEC.js +39 -0
  60. package/dist/chunk-SSLP3MEC.js.map +1 -0
  61. package/dist/chunk-WYMKISZI.js +70 -0
  62. package/dist/chunk-WYMKISZI.js.map +1 -0
  63. package/dist/index.cjs +4219 -0
  64. package/dist/index.cjs.map +1 -0
  65. package/dist/index.d.cts +240 -0
  66. package/dist/index.d.ts +240 -0
  67. package/dist/index.js +4219 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/styles.d.ts +4 -0
  70. package/dist/tailwind-prefixed.css +2529 -0
  71. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useOneDrive.ts","../src/components/OneDriveUploader.tsx"],"sourcesContent":["import {\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useSyncExternalStore,\r\n type SetStateAction,\r\n} from 'react'\r\nimport {\r\n ONE_DRIVE_DESCRIPTOR,\r\n type DriveFile,\r\n type DriveFolder,\r\n} from '@useupup/core'\r\nimport {\r\n DriveBrowserController,\r\n type DriveBrowserState,\r\n} from '@useupup/core/internal'\r\nimport {\r\n useUploaderFiles,\r\n useUploaderRuntime,\r\n useUploaderSource,\r\n} from '../context/UploaderContext'\r\n\r\n/** Stable fallback snapshot for the first render (core is created post-paint, so the\r\n * controller is briefly null) and for useSyncExternalStore's server snapshot.\r\n * Mirrors the DriveBrowserController constructor defaults. */\r\nconst SERVER_SNAPSHOT: DriveBrowserState = {\r\n user: undefined,\r\n folder: undefined,\r\n path: [],\r\n selectedFiles: [],\r\n isClickLoading: false,\r\n showLoader: false,\r\n isAuthReady: false,\r\n isAuthenticated: false,\r\n isLoading: true,\r\n authCancelled: false,\r\n token: undefined,\r\n error: undefined,\r\n hasMore: false,\r\n isLoadingMore: false,\r\n}\r\n\r\nexport interface UseOneDriveResult {\r\n user: DriveBrowserState['user']\r\n oneDriveFiles: DriveBrowserState['folder']\r\n signOut: () => void\r\n signIn: () => void\r\n authenticate: () => void\r\n token: string | undefined\r\n isAuthenticated: boolean\r\n isLoading: boolean\r\n path: DriveFolder[]\r\n setPath: (value: SetStateAction<DriveFolder[]>) => void\r\n isClickLoading: boolean\r\n handleClick: (file: DriveFile) => void\r\n selectedFiles: DriveFile[]\r\n showLoader: boolean\r\n handleSubmit: () => Promise<void>\r\n handleCancelDownload: () => void\r\n onSelectCurrentFolder: () => Promise<void>\r\n error: DriveBrowserState['error']\r\n hasMore: boolean\r\n isLoadingMore: boolean\r\n loadMore: () => Promise<void>\r\n}\r\n\r\nexport default function useOneDrive(): UseOneDriveResult {\r\n const { core } = useUploaderRuntime()\r\n const { setActiveSource } = useUploaderSource()\r\n const { setFiles } = useUploaderFiles()\r\n\r\n // One controller per mounted adapter view, created once (guarded ref) — same\r\n // idiom as useUploaderController's rootRef. setFiles/setActiveSource are referentially\r\n // stable (useCallback over root), so capturing them once is safe.\r\n const controllerRef = useRef<DriveBrowserController | null>(null)\r\n if (!controllerRef.current && core) {\r\n controllerRef.current = new DriveBrowserController(\r\n core,\r\n ONE_DRIVE_DESCRIPTOR,\r\n {\r\n onFilesSelected: files => {\r\n setFiles(files)\r\n },\r\n onClose: () => {\r\n setActiveSource(undefined)\r\n },\r\n },\r\n )\r\n }\r\n const controller = controllerRef.current\r\n\r\n useEffect(() => {\r\n controller?.init()\r\n return () => controller?.destroy()\r\n }, [controller])\r\n\r\n const state = useSyncExternalStore(\r\n controller?.subscribe ?? (() => () => {}),\r\n controller?.getSnapshot ?? (() => SERVER_SNAPSHOT),\r\n () => SERVER_SNAPSHOT,\r\n )\r\n\r\n // setPath is passed as a prop to DriveBrowser/DriveBrowserHeader, where the\r\n // breadcrumb truncates the trail by calling it with a functional updater\r\n // (`prev => prev.slice(0, i+1)`). It MUST be referentially stable across renders\r\n // (same reason useUploaderController useCallbacks its setters) and resolves that\r\n // updater against the live snapshot before delegating to the array-only\r\n // controller.setPath.\r\n const setPath = useCallback(\r\n (value: SetStateAction<DriveFolder[]>) =>\r\n controller?.setPath(\r\n typeof value === 'function'\r\n ? value(controller.getSnapshot().path)\r\n : value,\r\n ),\r\n [controller],\r\n )\r\n\r\n return {\r\n user: state.user,\r\n oneDriveFiles: state.folder,\r\n signOut: () => controller?.signOut(),\r\n signIn: () => controller?.signIn(),\r\n authenticate: () => controller?.signIn(),\r\n // 'active' is a presence sentinel the component checks via `!token`; the real\r\n // GIS token lives in state.token and is intentionally not surfaced here.\r\n token: state.isAuthenticated ? 'active' : undefined,\r\n isAuthenticated: state.isAuthenticated,\r\n isLoading: state.isLoading,\r\n path: state.path,\r\n setPath,\r\n isClickLoading: state.isClickLoading,\r\n handleClick: (file: DriveFile) => controller?.handleClick(file),\r\n selectedFiles: state.selectedFiles,\r\n showLoader: state.showLoader,\r\n handleSubmit: () => controller?.handleSubmit() ?? Promise.resolve(),\r\n handleCancelDownload: () => {\r\n controller?.handleCancelDownload()\r\n },\r\n onSelectCurrentFolder: () =>\r\n controller?.onSelectCurrentFolder() ?? Promise.resolve(),\r\n error: state.error,\r\n hasMore: state.hasMore,\r\n isLoadingMore: state.isLoadingMore,\r\n loadMore: () => controller?.loadMore() ?? Promise.resolve(),\r\n }\r\n}\r\n","import React from 'react'\r\nimport {\r\n useUploaderRuntime,\r\n useUploaderSource,\r\n} from '../context/UploaderContext'\r\nimport useOneDrive from '../hooks/useOneDrive'\r\nimport DriveAuthFallback from './shared/DriveAuthFallback'\r\nimport DriveBrowser from './shared/DriveBrowser'\r\nimport ServerModeDriveUploader from './ServerModeDriveUploader'\r\n\r\nexport default function OneDriveUploader(): React.ReactElement | null {\r\n const { mode } = useUploaderRuntime()\r\n const { setActiveSource } = useUploaderSource()\r\n if (mode === 'server') {\r\n return (\r\n <ServerModeDriveUploader\r\n provider=\"one-drive\"\r\n onBack={() => {\r\n setActiveSource(undefined)\r\n }}\r\n />\r\n )\r\n }\r\n return <ClientOneDriveUploader />\r\n}\r\n\r\nfunction ClientOneDriveUploader() {\r\n const {\r\n user,\r\n oneDriveFiles: driveFiles,\r\n signOut,\r\n token,\r\n isAuthenticated,\r\n authenticate,\r\n isLoading,\r\n ...uploaderProps\r\n } = useOneDrive()\r\n\r\n const handleSignOut = async () => {\r\n signOut()\r\n return Promise.resolve()\r\n }\r\n\r\n if (!isAuthenticated && !token && !isLoading) {\r\n return (\r\n <DriveAuthFallback\r\n providerName=\"OneDrive\"\r\n onRetry={authenticate}\r\n data-upup-slot=\"one-drive-uploader\"\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <DriveBrowser\r\n driveFiles={driveFiles}\r\n user={user}\r\n handleSignOut={handleSignOut}\r\n data-upup-slot=\"one-drive-uploader\"\r\n {...uploaderProps}\r\n />\r\n )\r\n}\r\n"],"mappings":"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","names":["_a"]}
@@ -0,0 +1,281 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkDZQBTC6Tcjs = require('./chunk-DZQBTC6T.cjs');
4
+
5
+
6
+
7
+
8
+ var _chunkIG62MHVQcjs = require('./chunk-IG62MHVQ.cjs');
9
+
10
+ // src/components/ScreenCaptureUploader.tsx
11
+ var _react = require('react');
12
+ var _internal = require('@useupup/core/internal');
13
+ var _jsxruntime = require('react/jsx-runtime');
14
+ function ScreenCaptureUploader() {
15
+ const { setFiles } = _chunkIG62MHVQcjs.useUploaderFiles.call(void 0, );
16
+ const { setActiveSource } = _chunkIG62MHVQcjs.useUploaderSource.call(void 0, );
17
+ const { isDark: dark } = _chunkIG62MHVQcjs.useUploaderTheme.call(void 0, );
18
+ const [state, setState] = _react.useState.call(void 0, "idle");
19
+ const [duration, setDuration] = _react.useState.call(void 0, 0);
20
+ const [videoUrl, setVideoUrl] = _react.useState.call(void 0, null);
21
+ const [error, setError] = _react.useState.call(void 0, null);
22
+ const mediaRecorder = _react.useRef.call(void 0, null);
23
+ const chunks = _react.useRef.call(void 0, []);
24
+ const timerRef = _react.useRef.call(void 0, null);
25
+ const streamRef = _react.useRef.call(void 0, null);
26
+ const videoRef = _react.useRef.call(void 0, null);
27
+ const previewRef = _react.useRef.call(void 0, null);
28
+ _react.useEffect.call(void 0, () => {
29
+ return () => {
30
+ var _a;
31
+ if (timerRef.current) clearInterval(timerRef.current);
32
+ if (videoUrl) URL.revokeObjectURL(videoUrl);
33
+ (_a = streamRef.current) == null ? void 0 : _a.getTracks().forEach((t) => {
34
+ t.stop();
35
+ });
36
+ };
37
+ }, [videoUrl]);
38
+ const bindPreview = _react.useCallback.call(void 0, (el) => {
39
+ var _a;
40
+ previewRef.current = el;
41
+ if (el && streamRef.current) {
42
+ el.srcObject = streamRef.current;
43
+ (_a = el.play()) == null ? void 0 : _a.catch(() => {
44
+ });
45
+ }
46
+ }, []);
47
+ const startRecording = _react.useCallback.call(void 0, async () => {
48
+ try {
49
+ const stream = await navigator.mediaDevices.getDisplayMedia({
50
+ video: true,
51
+ audio: true
52
+ });
53
+ streamRef.current = stream;
54
+ chunks.current = [];
55
+ const videoTrack = stream.getVideoTracks()[0];
56
+ if (videoTrack) {
57
+ videoTrack.onended = () => {
58
+ if (mediaRecorder.current && mediaRecorder.current.state !== "inactive") {
59
+ mediaRecorder.current.stop();
60
+ }
61
+ if (timerRef.current) clearInterval(timerRef.current);
62
+ setState("recorded");
63
+ };
64
+ }
65
+ const recorder = new MediaRecorder(stream);
66
+ mediaRecorder.current = recorder;
67
+ recorder.ondataavailable = (e) => {
68
+ if (e.data.size > 0) chunks.current.push(e.data);
69
+ };
70
+ recorder.onstop = () => {
71
+ const blob = new Blob(chunks.current, {
72
+ type: recorder.mimeType || "video/webm"
73
+ });
74
+ setVideoUrl(URL.createObjectURL(blob));
75
+ stream.getTracks().forEach((t) => {
76
+ t.stop();
77
+ });
78
+ if (previewRef.current) previewRef.current.srcObject = null;
79
+ };
80
+ recorder.start();
81
+ setState("recording");
82
+ setDuration(0);
83
+ timerRef.current = setInterval(() => {
84
+ setDuration((d) => d + 1);
85
+ }, 1e3);
86
+ } catch (e2) {
87
+ setError(
88
+ "Screen sharing was cancelled or denied. Please try again."
89
+ );
90
+ }
91
+ }, []);
92
+ const stopRecording = _react.useCallback.call(void 0, () => {
93
+ var _a;
94
+ (_a = mediaRecorder.current) == null ? void 0 : _a.stop();
95
+ if (timerRef.current) clearInterval(timerRef.current);
96
+ setState("recorded");
97
+ }, []);
98
+ const discardRecording = _react.useCallback.call(void 0, () => {
99
+ if (videoUrl) URL.revokeObjectURL(videoUrl);
100
+ setVideoUrl(null);
101
+ setDuration(0);
102
+ setState("idle");
103
+ }, [videoUrl]);
104
+ const addRecording = _react.useCallback.call(void 0, () => {
105
+ if (!videoUrl) return;
106
+ void fetch(videoUrl).then((r) => r.blob()).then((blob) => {
107
+ const file = new File(
108
+ [blob],
109
+ `screen-recording-${Date.now()}.webm`,
110
+ { type: blob.type }
111
+ );
112
+ setFiles([file]);
113
+ setActiveSource(void 0);
114
+ }).catch(() => {
115
+ });
116
+ }, [videoUrl, setFiles, setActiveSource]);
117
+ const formatTime = (s) => {
118
+ const m = Math.floor(s / 60);
119
+ const sec = s % 60;
120
+ return `${m}:${sec.toString().padStart(2, "0")}`;
121
+ };
122
+ if (error) {
123
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDZQBTC6Tcjs.SourceViewContainer, { "data-upup-slot": "screen-capture-uploader", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "upup-flex upup-flex-col upup-items-center upup-gap-3 upup-p-6 upup-text-center", children: [
124
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
125
+ "p",
126
+ {
127
+ className: _internal.cn.call(void 0, "upup-text-sm upup-text-red-500", {
128
+ "upup-text-red-400": dark
129
+ }),
130
+ children: error
131
+ }
132
+ ),
133
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
134
+ "button",
135
+ {
136
+ type: "button",
137
+ className: _internal.cn.call(void 0,
138
+ "upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white",
139
+ {
140
+ "upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]": dark
141
+ }
142
+ ),
143
+ onClick: () => {
144
+ setError(null);
145
+ void startRecording();
146
+ },
147
+ children: "Try Again"
148
+ }
149
+ )
150
+ ] }) });
151
+ }
152
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDZQBTC6Tcjs.SourceViewContainer, { "data-upup-slot": "screen-capture-uploader", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-4", children: [
153
+ state === "idle" && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "upup-flex upup-flex-col upup-items-center upup-gap-4", children: [
154
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
155
+ "div",
156
+ {
157
+ className: _internal.cn.call(void 0,
158
+ "upup-flex upup-h-20 upup-w-20 upup-items-center upup-justify-center upup-rounded-full upup-bg-[#0ea5e9]/20"
159
+ ),
160
+ children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
161
+ "svg",
162
+ {
163
+ xmlns: "http://www.w3.org/2000/svg",
164
+ width: "32",
165
+ height: "32",
166
+ viewBox: "0 0 24 24",
167
+ fill: "none",
168
+ stroke: dark ? "#38bdf8" : "#0284c7",
169
+ strokeWidth: "2",
170
+ strokeLinecap: "round",
171
+ strokeLinejoin: "round",
172
+ children: [
173
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
174
+ "rect",
175
+ {
176
+ width: "20",
177
+ height: "15",
178
+ x: "2",
179
+ y: "3",
180
+ rx: "2"
181
+ }
182
+ ),
183
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "polyline", { points: "8 21 16 21" }),
184
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "line", { x1: "12", x2: "12", y1: "18", y2: "21" })
185
+ ]
186
+ }
187
+ )
188
+ }
189
+ ),
190
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
191
+ "button",
192
+ {
193
+ type: "button",
194
+ className: _internal.cn.call(void 0,
195
+ "upup-rounded-lg upup-bg-[#0ea5e9] upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]",
196
+ {
197
+ "upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]": dark
198
+ }
199
+ ),
200
+ onClick: () => {
201
+ void startRecording();
202
+ },
203
+ children: "Share Screen"
204
+ }
205
+ )
206
+ ] }),
207
+ state === "recording" && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
208
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "upup-relative upup-flex upup-min-h-0 upup-w-full upup-max-w-md upup-flex-1", children: [
209
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
210
+ "video",
211
+ {
212
+ ref: bindPreview,
213
+ muted: true,
214
+ className: "upup-min-h-0 upup-w-full upup-flex-1 upup-rounded-lg upup-object-contain"
215
+ }
216
+ ),
217
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
218
+ "div",
219
+ {
220
+ "data-upup-slot": "screen-rec-chip",
221
+ className: "upup-absolute upup-left-2.5 upup-top-2.5 upup-flex upup-items-center upup-gap-1.5 upup-rounded-md upup-bg-[#04080f]/60 upup-px-2 upup-py-1 upup-font-mono upup-text-[11px] upup-tabular-nums upup-text-[#fecdd3]",
222
+ children: [
223
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "upup-animate-fx-rec-pulse upup-h-2 upup-w-2 upup-rounded-full upup-bg-red-500" }),
224
+ "REC ",
225
+ formatTime(duration)
226
+ ]
227
+ }
228
+ )
229
+ ] }),
230
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
231
+ "button",
232
+ {
233
+ type: "button",
234
+ className: "upup-fx-press upup-rounded-lg upup-bg-red-500 upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-red-600",
235
+ onClick: stopRecording,
236
+ children: "Stop Recording"
237
+ }
238
+ )
239
+ ] }),
240
+ state === "recorded" && videoUrl && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
241
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
242
+ "video",
243
+ {
244
+ ref: videoRef,
245
+ controls: true,
246
+ src: videoUrl,
247
+ className: "upup-w-full upup-max-w-md upup-min-h-0 upup-flex-1 upup-rounded-lg upup-object-contain"
248
+ }
249
+ ),
250
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "upup-flex upup-gap-3", children: [
251
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
252
+ "button",
253
+ {
254
+ type: "button",
255
+ className: "upup-rounded-lg upup-bg-gray-500 upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-gray-600",
256
+ onClick: discardRecording,
257
+ children: "Discard"
258
+ }
259
+ ),
260
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
261
+ "button",
262
+ {
263
+ type: "button",
264
+ className: _internal.cn.call(void 0,
265
+ "upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]",
266
+ {
267
+ "upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]": dark
268
+ }
269
+ ),
270
+ onClick: addRecording,
271
+ children: "Add Recording"
272
+ }
273
+ )
274
+ ] })
275
+ ] })
276
+ ] }) });
277
+ }
278
+
279
+
280
+ exports.default = ScreenCaptureUploader;
281
+ //# sourceMappingURL=ScreenCaptureUploader-7K6QPD42.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\ScreenCaptureUploader-7K6QPD42.cjs"],"names":[],"mappings":"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AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,sBAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,sBAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,gCAAA;AACA,kBAAA;AACA,kBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,kBAAA;AACA,gBAAA;AACA,gCAAA;AACA,gCAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,sBAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,sBAAA;AACA,wBAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,wBAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,8BAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,sBAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,sBAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,sBAAA;AACA,wBAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,wBAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA","file":"C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\ScreenCaptureUploader-7K6QPD42.cjs","sourcesContent":[null]}
@@ -0,0 +1,281 @@
1
+ import {
2
+ SourceViewContainer
3
+ } from "./chunk-SSLP3MEC.js";
4
+ import {
5
+ useUploaderFiles,
6
+ useUploaderSource,
7
+ useUploaderTheme
8
+ } from "./chunk-LCMDDPUD.js";
9
+
10
+ // src/components/ScreenCaptureUploader.tsx
11
+ import { useCallback, useEffect, useRef, useState } from "react";
12
+ import { cn } from "@useupup/core/internal";
13
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
+ function ScreenCaptureUploader() {
15
+ const { setFiles } = useUploaderFiles();
16
+ const { setActiveSource } = useUploaderSource();
17
+ const { isDark: dark } = useUploaderTheme();
18
+ const [state, setState] = useState("idle");
19
+ const [duration, setDuration] = useState(0);
20
+ const [videoUrl, setVideoUrl] = useState(null);
21
+ const [error, setError] = useState(null);
22
+ const mediaRecorder = useRef(null);
23
+ const chunks = useRef([]);
24
+ const timerRef = useRef(null);
25
+ const streamRef = useRef(null);
26
+ const videoRef = useRef(null);
27
+ const previewRef = useRef(null);
28
+ useEffect(() => {
29
+ return () => {
30
+ var _a;
31
+ if (timerRef.current) clearInterval(timerRef.current);
32
+ if (videoUrl) URL.revokeObjectURL(videoUrl);
33
+ (_a = streamRef.current) == null ? void 0 : _a.getTracks().forEach((t) => {
34
+ t.stop();
35
+ });
36
+ };
37
+ }, [videoUrl]);
38
+ const bindPreview = useCallback((el) => {
39
+ var _a;
40
+ previewRef.current = el;
41
+ if (el && streamRef.current) {
42
+ el.srcObject = streamRef.current;
43
+ (_a = el.play()) == null ? void 0 : _a.catch(() => {
44
+ });
45
+ }
46
+ }, []);
47
+ const startRecording = useCallback(async () => {
48
+ try {
49
+ const stream = await navigator.mediaDevices.getDisplayMedia({
50
+ video: true,
51
+ audio: true
52
+ });
53
+ streamRef.current = stream;
54
+ chunks.current = [];
55
+ const videoTrack = stream.getVideoTracks()[0];
56
+ if (videoTrack) {
57
+ videoTrack.onended = () => {
58
+ if (mediaRecorder.current && mediaRecorder.current.state !== "inactive") {
59
+ mediaRecorder.current.stop();
60
+ }
61
+ if (timerRef.current) clearInterval(timerRef.current);
62
+ setState("recorded");
63
+ };
64
+ }
65
+ const recorder = new MediaRecorder(stream);
66
+ mediaRecorder.current = recorder;
67
+ recorder.ondataavailable = (e) => {
68
+ if (e.data.size > 0) chunks.current.push(e.data);
69
+ };
70
+ recorder.onstop = () => {
71
+ const blob = new Blob(chunks.current, {
72
+ type: recorder.mimeType || "video/webm"
73
+ });
74
+ setVideoUrl(URL.createObjectURL(blob));
75
+ stream.getTracks().forEach((t) => {
76
+ t.stop();
77
+ });
78
+ if (previewRef.current) previewRef.current.srcObject = null;
79
+ };
80
+ recorder.start();
81
+ setState("recording");
82
+ setDuration(0);
83
+ timerRef.current = setInterval(() => {
84
+ setDuration((d) => d + 1);
85
+ }, 1e3);
86
+ } catch {
87
+ setError(
88
+ "Screen sharing was cancelled or denied. Please try again."
89
+ );
90
+ }
91
+ }, []);
92
+ const stopRecording = useCallback(() => {
93
+ var _a;
94
+ (_a = mediaRecorder.current) == null ? void 0 : _a.stop();
95
+ if (timerRef.current) clearInterval(timerRef.current);
96
+ setState("recorded");
97
+ }, []);
98
+ const discardRecording = useCallback(() => {
99
+ if (videoUrl) URL.revokeObjectURL(videoUrl);
100
+ setVideoUrl(null);
101
+ setDuration(0);
102
+ setState("idle");
103
+ }, [videoUrl]);
104
+ const addRecording = useCallback(() => {
105
+ if (!videoUrl) return;
106
+ void fetch(videoUrl).then((r) => r.blob()).then((blob) => {
107
+ const file = new File(
108
+ [blob],
109
+ `screen-recording-${Date.now()}.webm`,
110
+ { type: blob.type }
111
+ );
112
+ setFiles([file]);
113
+ setActiveSource(void 0);
114
+ }).catch(() => {
115
+ });
116
+ }, [videoUrl, setFiles, setActiveSource]);
117
+ const formatTime = (s) => {
118
+ const m = Math.floor(s / 60);
119
+ const sec = s % 60;
120
+ return `${m}:${sec.toString().padStart(2, "0")}`;
121
+ };
122
+ if (error) {
123
+ return /* @__PURE__ */ jsx(SourceViewContainer, { "data-upup-slot": "screen-capture-uploader", children: /* @__PURE__ */ jsxs("div", { className: "upup-flex upup-flex-col upup-items-center upup-gap-3 upup-p-6 upup-text-center", children: [
124
+ /* @__PURE__ */ jsx(
125
+ "p",
126
+ {
127
+ className: cn("upup-text-sm upup-text-red-500", {
128
+ "upup-text-red-400": dark
129
+ }),
130
+ children: error
131
+ }
132
+ ),
133
+ /* @__PURE__ */ jsx(
134
+ "button",
135
+ {
136
+ type: "button",
137
+ className: cn(
138
+ "upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white",
139
+ {
140
+ "upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]": dark
141
+ }
142
+ ),
143
+ onClick: () => {
144
+ setError(null);
145
+ void startRecording();
146
+ },
147
+ children: "Try Again"
148
+ }
149
+ )
150
+ ] }) });
151
+ }
152
+ return /* @__PURE__ */ jsx(SourceViewContainer, { "data-upup-slot": "screen-capture-uploader", children: /* @__PURE__ */ jsxs("div", { className: "upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-4", children: [
153
+ state === "idle" && /* @__PURE__ */ jsxs("div", { className: "upup-flex upup-flex-col upup-items-center upup-gap-4", children: [
154
+ /* @__PURE__ */ jsx(
155
+ "div",
156
+ {
157
+ className: cn(
158
+ "upup-flex upup-h-20 upup-w-20 upup-items-center upup-justify-center upup-rounded-full upup-bg-[#0ea5e9]/20"
159
+ ),
160
+ children: /* @__PURE__ */ jsxs(
161
+ "svg",
162
+ {
163
+ xmlns: "http://www.w3.org/2000/svg",
164
+ width: "32",
165
+ height: "32",
166
+ viewBox: "0 0 24 24",
167
+ fill: "none",
168
+ stroke: dark ? "#38bdf8" : "#0284c7",
169
+ strokeWidth: "2",
170
+ strokeLinecap: "round",
171
+ strokeLinejoin: "round",
172
+ children: [
173
+ /* @__PURE__ */ jsx(
174
+ "rect",
175
+ {
176
+ width: "20",
177
+ height: "15",
178
+ x: "2",
179
+ y: "3",
180
+ rx: "2"
181
+ }
182
+ ),
183
+ /* @__PURE__ */ jsx("polyline", { points: "8 21 16 21" }),
184
+ /* @__PURE__ */ jsx("line", { x1: "12", x2: "12", y1: "18", y2: "21" })
185
+ ]
186
+ }
187
+ )
188
+ }
189
+ ),
190
+ /* @__PURE__ */ jsx(
191
+ "button",
192
+ {
193
+ type: "button",
194
+ className: cn(
195
+ "upup-rounded-lg upup-bg-[#0ea5e9] upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]",
196
+ {
197
+ "upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]": dark
198
+ }
199
+ ),
200
+ onClick: () => {
201
+ void startRecording();
202
+ },
203
+ children: "Share Screen"
204
+ }
205
+ )
206
+ ] }),
207
+ state === "recording" && /* @__PURE__ */ jsxs(Fragment, { children: [
208
+ /* @__PURE__ */ jsxs("div", { className: "upup-relative upup-flex upup-min-h-0 upup-w-full upup-max-w-md upup-flex-1", children: [
209
+ /* @__PURE__ */ jsx(
210
+ "video",
211
+ {
212
+ ref: bindPreview,
213
+ muted: true,
214
+ className: "upup-min-h-0 upup-w-full upup-flex-1 upup-rounded-lg upup-object-contain"
215
+ }
216
+ ),
217
+ /* @__PURE__ */ jsxs(
218
+ "div",
219
+ {
220
+ "data-upup-slot": "screen-rec-chip",
221
+ className: "upup-absolute upup-left-2.5 upup-top-2.5 upup-flex upup-items-center upup-gap-1.5 upup-rounded-md upup-bg-[#04080f]/60 upup-px-2 upup-py-1 upup-font-mono upup-text-[11px] upup-tabular-nums upup-text-[#fecdd3]",
222
+ children: [
223
+ /* @__PURE__ */ jsx("span", { className: "upup-animate-fx-rec-pulse upup-h-2 upup-w-2 upup-rounded-full upup-bg-red-500" }),
224
+ "REC ",
225
+ formatTime(duration)
226
+ ]
227
+ }
228
+ )
229
+ ] }),
230
+ /* @__PURE__ */ jsx(
231
+ "button",
232
+ {
233
+ type: "button",
234
+ className: "upup-fx-press upup-rounded-lg upup-bg-red-500 upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-red-600",
235
+ onClick: stopRecording,
236
+ children: "Stop Recording"
237
+ }
238
+ )
239
+ ] }),
240
+ state === "recorded" && videoUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
241
+ /* @__PURE__ */ jsx(
242
+ "video",
243
+ {
244
+ ref: videoRef,
245
+ controls: true,
246
+ src: videoUrl,
247
+ className: "upup-w-full upup-max-w-md upup-min-h-0 upup-flex-1 upup-rounded-lg upup-object-contain"
248
+ }
249
+ ),
250
+ /* @__PURE__ */ jsxs("div", { className: "upup-flex upup-gap-3", children: [
251
+ /* @__PURE__ */ jsx(
252
+ "button",
253
+ {
254
+ type: "button",
255
+ className: "upup-rounded-lg upup-bg-gray-500 upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-gray-600",
256
+ onClick: discardRecording,
257
+ children: "Discard"
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsx(
261
+ "button",
262
+ {
263
+ type: "button",
264
+ className: cn(
265
+ "upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]",
266
+ {
267
+ "upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]": dark
268
+ }
269
+ ),
270
+ onClick: addRecording,
271
+ children: "Add Recording"
272
+ }
273
+ )
274
+ ] })
275
+ ] })
276
+ ] }) });
277
+ }
278
+ export {
279
+ ScreenCaptureUploader as default
280
+ };
281
+ //# sourceMappingURL=ScreenCaptureUploader-WKDO4S75.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ScreenCaptureUploader.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react'\r\nimport {\r\n useUploaderFiles,\r\n useUploaderSource,\r\n useUploaderTheme,\r\n} from '../context/UploaderContext'\r\nimport { cn } from '@useupup/core/internal'\r\nimport SourceViewContainer from './shared/SourceViewContainer'\r\n\r\ntype RecordingState = 'idle' | 'recording' | 'recorded'\r\n\r\nexport default function ScreenCaptureUploader(): React.ReactElement | null {\r\n const { setFiles } = useUploaderFiles()\r\n const { setActiveSource } = useUploaderSource()\r\n const { isDark: dark } = useUploaderTheme()\r\n\r\n const [state, setState] = useState<RecordingState>('idle')\r\n const [duration, setDuration] = useState(0)\r\n const [videoUrl, setVideoUrl] = useState<string | null>(null)\r\n const [error, setError] = useState<string | null>(null)\r\n\r\n const mediaRecorder = useRef<MediaRecorder | null>(null)\r\n const chunks = useRef<Blob[]>([])\r\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\r\n const streamRef = useRef<MediaStream | null>(null)\r\n const videoRef = useRef<HTMLVideoElement>(null)\r\n const previewRef = useRef<HTMLVideoElement>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timerRef.current) clearInterval(timerRef.current)\r\n if (videoUrl) URL.revokeObjectURL(videoUrl)\r\n streamRef.current?.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n }\r\n }, [videoUrl])\r\n\r\n const bindPreview = useCallback((el: HTMLVideoElement | null) => {\r\n previewRef.current = el\r\n if (el && streamRef.current) {\r\n el.srcObject = streamRef.current\r\n el.play()?.catch(() => {})\r\n }\r\n }, [])\r\n\r\n const startRecording = useCallback(async () => {\r\n try {\r\n const stream = await navigator.mediaDevices.getDisplayMedia({\r\n video: true,\r\n audio: true,\r\n })\r\n streamRef.current = stream\r\n chunks.current = []\r\n\r\n const videoTrack = stream.getVideoTracks()[0]\r\n if (videoTrack) {\r\n videoTrack.onended = () => {\r\n if (\r\n mediaRecorder.current &&\r\n mediaRecorder.current.state !== 'inactive'\r\n ) {\r\n mediaRecorder.current.stop()\r\n }\r\n if (timerRef.current) clearInterval(timerRef.current)\r\n setState('recorded')\r\n }\r\n }\r\n\r\n const recorder = new MediaRecorder(stream)\r\n mediaRecorder.current = recorder\r\n\r\n recorder.ondataavailable = e => {\r\n if (e.data.size > 0) chunks.current.push(e.data)\r\n }\r\n\r\n recorder.onstop = () => {\r\n const blob = new Blob(chunks.current, {\r\n type: recorder.mimeType || 'video/webm',\r\n })\r\n setVideoUrl(URL.createObjectURL(blob))\r\n stream.getTracks().forEach(t => {\r\n t.stop()\r\n })\r\n if (previewRef.current) previewRef.current.srcObject = null\r\n }\r\n\r\n recorder.start()\r\n setState('recording')\r\n setDuration(0)\r\n timerRef.current = setInterval(() => {\r\n setDuration(d => d + 1)\r\n }, 1000)\r\n } catch {\r\n // upup-catch: getDisplayMedia rejection (user cancelled / denied) is surfaced to the user via setError\r\n setError(\r\n 'Screen sharing was cancelled or denied. Please try again.',\r\n )\r\n }\r\n }, [])\r\n\r\n const stopRecording = useCallback(() => {\r\n mediaRecorder.current?.stop()\r\n if (timerRef.current) clearInterval(timerRef.current)\r\n setState('recorded')\r\n }, [])\r\n\r\n const discardRecording = useCallback(() => {\r\n if (videoUrl) URL.revokeObjectURL(videoUrl)\r\n setVideoUrl(null)\r\n setDuration(0)\r\n setState('idle')\r\n }, [videoUrl])\r\n\r\n const addRecording = useCallback(() => {\r\n if (!videoUrl) return\r\n void fetch(videoUrl)\r\n .then(r => r.blob())\r\n .then(blob => {\r\n const file = new File(\r\n [blob],\r\n `screen-recording-${Date.now()}.webm`,\r\n { type: blob.type },\r\n )\r\n setFiles([file])\r\n setActiveSource(undefined)\r\n })\r\n .catch(() => {\r\n // upup-catch: replaying an in-memory object URL cannot fail in practice; ignore\r\n })\r\n }, [videoUrl, setFiles, setActiveSource])\r\n\r\n const formatTime = (s: number) => {\r\n const m = Math.floor(s / 60)\r\n const sec = s % 60\r\n return `${m}:${sec.toString().padStart(2, '0')}`\r\n }\r\n\r\n if (error) {\r\n return (\r\n <SourceViewContainer data-upup-slot=\"screen-capture-uploader\">\r\n <div className=\"upup-flex upup-flex-col upup-items-center upup-gap-3 upup-p-6 upup-text-center\">\r\n <p\r\n className={cn('upup-text-sm upup-text-red-500', {\r\n 'upup-text-red-400': dark,\r\n })}\r\n >\r\n {error}\r\n </p>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2 upup-text-sm upup-font-medium upup-text-white',\r\n {\r\n 'upup-bg-[#38bdf8] dark:upup-bg-[#38bdf8]':\r\n dark,\r\n },\r\n )}\r\n onClick={() => {\r\n setError(null)\r\n void startRecording()\r\n }}\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n </SourceViewContainer>\r\n )\r\n }\r\n\r\n return (\r\n <SourceViewContainer data-upup-slot=\"screen-capture-uploader\">\r\n <div className=\"upup-flex upup-h-full upup-w-full upup-flex-col upup-items-center upup-justify-center upup-gap-4 upup-p-4\">\r\n {state === 'idle' && (\r\n <div className=\"upup-flex upup-flex-col upup-items-center upup-gap-4\">\r\n <div\r\n className={cn(\r\n 'upup-flex upup-h-20 upup-w-20 upup-items-center upup-justify-center upup-rounded-full upup-bg-[#0ea5e9]/20',\r\n )}\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"32\"\r\n height=\"32\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={dark ? '#38bdf8' : '#0284c7'}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect\r\n width=\"20\"\r\n height=\"15\"\r\n x=\"2\"\r\n y=\"3\"\r\n rx=\"2\"\r\n />\r\n <polyline points=\"8 21 16 21\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"18\" y2=\"21\" />\r\n </svg>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]':\r\n dark,\r\n },\r\n )}\r\n onClick={() => {\r\n void startRecording()\r\n }}\r\n >\r\n Share Screen\r\n </button>\r\n </div>\r\n )}\r\n\r\n {state === 'recording' && (\r\n <>\r\n <div className=\"upup-relative upup-flex upup-min-h-0 upup-w-full upup-max-w-md upup-flex-1\">\r\n <video\r\n ref={bindPreview}\r\n muted\r\n className=\"upup-min-h-0 upup-w-full upup-flex-1 upup-rounded-lg upup-object-contain\"\r\n />\r\n {/* REC chip (states-tour-3 state E): red dot + label +\r\n timer. The dot's pulse is fx-gated (upup-animate-fx-\r\n substring) — under motion-off the dot stays static so\r\n the recording status remains visible. */}\r\n <div\r\n data-upup-slot=\"screen-rec-chip\"\r\n className=\"upup-absolute upup-left-2.5 upup-top-2.5 upup-flex upup-items-center upup-gap-1.5 upup-rounded-md upup-bg-[#04080f]/60 upup-px-2 upup-py-1 upup-font-mono upup-text-[11px] upup-tabular-nums upup-text-[#fecdd3]\"\r\n >\r\n <span className=\"upup-animate-fx-rec-pulse upup-h-2 upup-w-2 upup-rounded-full upup-bg-red-500\" />\r\n REC {formatTime(duration)}\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"upup-fx-press upup-rounded-lg upup-bg-red-500 upup-px-6 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-red-600\"\r\n onClick={stopRecording}\r\n >\r\n Stop Recording\r\n </button>\r\n </>\r\n )}\r\n\r\n {state === 'recorded' && videoUrl && (\r\n <>\r\n <video\r\n ref={videoRef}\r\n controls\r\n src={videoUrl}\r\n className=\"upup-w-full upup-max-w-md upup-min-h-0 upup-flex-1 upup-rounded-lg upup-object-contain\"\r\n />\r\n <div className=\"upup-flex upup-gap-3\">\r\n <button\r\n type=\"button\"\r\n className=\"upup-rounded-lg upup-bg-gray-500 upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-gray-600\"\r\n onClick={discardRecording}\r\n >\r\n Discard\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'upup-rounded-lg upup-bg-[#0ea5e9] upup-px-4 upup-py-2.5 upup-text-sm upup-font-medium upup-text-white upup-transition-colors hover:upup-bg-[#0284c7]',\r\n {\r\n 'upup-bg-[#38bdf8] hover:upup-bg-[#0ea5e9] dark:upup-bg-[#38bdf8]':\r\n dark,\r\n },\r\n )}\r\n onClick={addRecording}\r\n >\r\n Add Recording\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </SourceViewContainer>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}