donobu 2.21.0 → 2.22.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.
- package/dist/assets/control-panel.js +254 -125
- package/dist/assets/generated/version +1 -1
- package/dist/esm/assets/control-panel.js +254 -125
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/managers/ControlPanel.d.ts +4 -1
- package/dist/esm/managers/ControlPanel.d.ts.map +1 -1
- package/dist/esm/managers/ControlPanel.js +18 -11
- package/dist/esm/managers/ControlPanel.js.map +1 -1
- package/dist/esm/managers/DonobuFlow.d.ts +2 -0
- package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlow.js +122 -34
- package/dist/esm/managers/DonobuFlow.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +3 -4
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/managers/InteractionVisualizer.d.ts +2 -0
- package/dist/esm/managers/InteractionVisualizer.d.ts.map +1 -1
- package/dist/esm/managers/InteractionVisualizer.js +69 -17
- package/dist/esm/managers/InteractionVisualizer.js.map +1 -1
- package/dist/esm/managers/ToolManager.d.ts.map +1 -1
- package/dist/esm/managers/ToolManager.js +6 -5
- package/dist/esm/managers/ToolManager.js.map +1 -1
- package/dist/esm/models/InteractableElement.d.ts +15 -10
- package/dist/esm/models/InteractableElement.d.ts.map +1 -1
- package/dist/esm/models/InteractableElement.js +11 -0
- package/dist/esm/models/InteractableElement.js.map +1 -1
- package/dist/esm/tools/AcknowledgeUserInstruction.d.ts +35 -0
- package/dist/esm/tools/AcknowledgeUserInstruction.d.ts.map +1 -0
- package/dist/esm/tools/AcknowledgeUserInstruction.js +40 -0
- package/dist/esm/tools/AcknowledgeUserInstruction.js.map +1 -0
- package/dist/managers/ControlPanel.d.ts +4 -1
- package/dist/managers/ControlPanel.d.ts.map +1 -1
- package/dist/managers/ControlPanel.js +18 -11
- package/dist/managers/ControlPanel.js.map +1 -1
- package/dist/managers/DonobuFlow.d.ts +2 -0
- package/dist/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/managers/DonobuFlow.js +122 -34
- package/dist/managers/DonobuFlow.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +3 -4
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/managers/InteractionVisualizer.d.ts +2 -0
- package/dist/managers/InteractionVisualizer.d.ts.map +1 -1
- package/dist/managers/InteractionVisualizer.js +69 -17
- package/dist/managers/InteractionVisualizer.js.map +1 -1
- package/dist/managers/ToolManager.d.ts.map +1 -1
- package/dist/managers/ToolManager.js +6 -5
- package/dist/managers/ToolManager.js.map +1 -1
- package/dist/models/InteractableElement.d.ts +15 -10
- package/dist/models/InteractableElement.d.ts.map +1 -1
- package/dist/models/InteractableElement.js +11 -0
- package/dist/models/InteractableElement.js.map +1 -1
- package/dist/tools/AcknowledgeUserInstruction.d.ts +35 -0
- package/dist/tools/AcknowledgeUserInstruction.d.ts.map +1 -0
- package/dist/tools/AcknowledgeUserInstruction.js +40 -0
- package/dist/tools/AcknowledgeUserInstruction.js.map +1 -0
- package/package.json +1 -1
|
@@ -10,6 +10,15 @@
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
if (!window.__donobu.userMessage) {
|
|
14
|
+
Object.defineProperty(window.__donobu, 'userMessage', {
|
|
15
|
+
value: null,
|
|
16
|
+
enumerable: false,
|
|
17
|
+
writable: true,
|
|
18
|
+
configurable: false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
13
22
|
if (!window.__donobu.controlPanelRegistered) {
|
|
14
23
|
Object.defineProperty(window.__donobu, 'controlPanelRegistered', {
|
|
15
24
|
value: true,
|
|
@@ -79,104 +88,142 @@
|
|
|
79
88
|
// Global styles
|
|
80
89
|
const styleEl = document.createElement('style');
|
|
81
90
|
styleEl.textContent = `
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
91
|
+
:host {
|
|
92
|
+
all: initial;
|
|
93
|
+
position: fixed;
|
|
94
|
+
top: 150px;
|
|
95
|
+
right: 20px;
|
|
96
|
+
z-index: 2147483647;
|
|
97
|
+
width: 300px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
#panel-content,
|
|
101
|
+
#panel-content * {
|
|
102
|
+
box-sizing: border-box;
|
|
103
|
+
margin: 0;
|
|
104
|
+
padding: 0;
|
|
105
|
+
font-family: Helvetica, Arial, sans-serif;
|
|
106
|
+
font-size: 14px;
|
|
107
|
+
color: #fff !important;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#donobu-control-panel-title-text {
|
|
111
|
+
font-weight: 600 !important;
|
|
112
|
+
margin-left: 10px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#panel-content input[type="text"] {
|
|
116
|
+
border: 1px solid #ddd !important;
|
|
117
|
+
background-color: #fff !important;
|
|
118
|
+
color: #000 !important;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
#donobu-play-icon,
|
|
122
|
+
#donobu-pause-icon,
|
|
123
|
+
#donobu-end-icon {
|
|
124
|
+
fill: none !important;
|
|
125
|
+
stroke: currentColor !important;
|
|
126
|
+
stroke-width: 2 !important;
|
|
127
|
+
stroke-linecap: round !important;
|
|
128
|
+
stroke-linejoin: round !important;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
#panel-content {
|
|
132
|
+
background-color: rgba(6,8,7,0.9);
|
|
133
|
+
border: 3px solid rgba(251,188,5, 0.9);
|
|
134
|
+
border-radius: 8px;
|
|
135
|
+
box-shadow: 0 4px 8px rgba(0,0,0,0.8);
|
|
136
|
+
cursor: move;
|
|
137
|
+
width: 100%;
|
|
138
|
+
overflow: hidden;
|
|
139
|
+
/* Add smooth transition for height changes */
|
|
140
|
+
transition: all 0.3s ease-in-out;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.donobu-hidden {
|
|
144
|
+
opacity: 0 !important;
|
|
145
|
+
pointer-events: none !important;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Enhanced expandable content with smooth animations */
|
|
149
|
+
#donobu-control-panel-expandable-content {
|
|
150
|
+
padding: 0 15px; /* Remove top/bottom padding initially */
|
|
151
|
+
max-height: 0;
|
|
152
|
+
overflow: hidden;
|
|
153
|
+
opacity: 0;
|
|
154
|
+
/* Smooth transitions for max-height, opacity, and padding */
|
|
155
|
+
transition: max-height 0.3s ease-in-out,
|
|
156
|
+
opacity 0.3s ease-in-out,
|
|
157
|
+
padding 0.3s ease-in-out;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* When expanded */
|
|
161
|
+
#donobu-control-panel-expandable-content.expanded {
|
|
162
|
+
max-height: 300px; /* Adjust based on your content */
|
|
163
|
+
opacity: 1;
|
|
164
|
+
padding: 15px; /* Full padding when expanded */
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.navbar {
|
|
168
|
+
display: flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
justify-content: space-between;
|
|
171
|
+
padding: 15px;
|
|
172
|
+
font-weight: 600;
|
|
173
|
+
background-color: rgba(6,8,7,0.9);
|
|
174
|
+
border-bottom: 1px solid rgba(251,188,5, 0.5);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.icon-btn {
|
|
178
|
+
margin-right: 8px;
|
|
179
|
+
display: flex;
|
|
180
|
+
cursor: pointer;
|
|
181
|
+
opacity: 0.5;
|
|
182
|
+
transition: opacity 0.2s ease-in-out;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
#panel-content textarea {
|
|
186
|
+
border: 1px solid #ddd !important;
|
|
187
|
+
background-color: #fff !important;
|
|
188
|
+
color: #000 !important;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#panel-content textarea::placeholder {
|
|
192
|
+
color: #666 !important;
|
|
193
|
+
opacity: 1 !important;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.icon-container {
|
|
197
|
+
display: flex;
|
|
198
|
+
align-items: center;
|
|
199
|
+
margin-right: 5px;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* Smooth transition for user message section */
|
|
203
|
+
#donobu-user-message-section {
|
|
204
|
+
margin-bottom: 10px;
|
|
205
|
+
opacity: 0;
|
|
206
|
+
transform: translateY(-10px);
|
|
207
|
+
transition: opacity 0.3s ease-in-out, transform 0.3s ease-in-out;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
#donobu-user-message-section.visible {
|
|
211
|
+
opacity: 1;
|
|
212
|
+
transform: translateY(0);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* Enhanced textarea with smooth focus transitions */
|
|
216
|
+
#donobu-user-message-input {
|
|
217
|
+
transition: border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#donobu-user-message-input:focus {
|
|
221
|
+
border-color: rgba(251,188,5, 0.8) !important;
|
|
222
|
+
box-shadow: 0 0 0 2px rgba(251,188,5, 0.2) !important;
|
|
223
|
+
outline: none !important;
|
|
224
|
+
}
|
|
225
|
+
`;
|
|
121
226
|
|
|
122
|
-
#donobu-control-panel-display-area {
|
|
123
|
-
color: #fff !important;
|
|
124
|
-
margin-top: 10px;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
#panel-content {
|
|
128
|
-
background-color: rgba(6,8,7,0.9);
|
|
129
|
-
border: 3px solid rgba(251,188,5, 0.9);
|
|
130
|
-
border-radius: 8px;
|
|
131
|
-
box-shadow: 0 4px 8px rgba(0,0,0,0.8);
|
|
132
|
-
transition: height 0.3s ease;
|
|
133
|
-
cursor: move;
|
|
134
|
-
width: 100%;
|
|
135
|
-
overflow: hidden;
|
|
136
|
-
}
|
|
137
|
-
.donobu-hidden {
|
|
138
|
-
opacity: 0 !important;
|
|
139
|
-
pointer-events: none !important;
|
|
140
|
-
}
|
|
141
|
-
#donobu-control-panel-expandable-content {
|
|
142
|
-
display: none;
|
|
143
|
-
padding: 15px;
|
|
144
|
-
max-height: 300px;
|
|
145
|
-
overflow-y: auto;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
.navbar {
|
|
149
|
-
display: flex;
|
|
150
|
-
align-items: center;
|
|
151
|
-
justify-content: space-between;
|
|
152
|
-
padding: 15px;
|
|
153
|
-
font-weight: 600;
|
|
154
|
-
background-color: rgba(6,8,7,0.9);
|
|
155
|
-
border-bottom: 1px solid rgba(251,188,5, 0.5);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
.icon-btn {
|
|
159
|
-
margin-right: 8px;
|
|
160
|
-
display: flex;
|
|
161
|
-
cursor: pointer;
|
|
162
|
-
opacity: 0.5;
|
|
163
|
-
transition: opacity 0.2s ease-in-out;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
#donobu-instructions-input {
|
|
167
|
-
width: 100%;
|
|
168
|
-
margin-bottom: 10px;
|
|
169
|
-
padding: 8px;
|
|
170
|
-
border: 1px solid #ddd;
|
|
171
|
-
border-radius: 4px;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.icon-container {
|
|
175
|
-
display: flex;
|
|
176
|
-
align-items: center;
|
|
177
|
-
margin-right: 5px;
|
|
178
|
-
}
|
|
179
|
-
`;
|
|
180
227
|
shadow.appendChild(styleEl);
|
|
181
228
|
|
|
182
229
|
// Main panel container
|
|
@@ -270,15 +317,28 @@
|
|
|
270
317
|
// Expandable content
|
|
271
318
|
const expandableContent = document.createElement('div');
|
|
272
319
|
expandableContent.id = 'donobu-control-panel-expandable-content';
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
320
|
+
|
|
321
|
+
// User message input section (initially hidden)
|
|
322
|
+
const userMessageSection = document.createElement('div');
|
|
323
|
+
userMessageSection.id = 'donobu-user-message-section';
|
|
324
|
+
userMessageSection.style.display = 'none';
|
|
325
|
+
userMessageSection.style.marginBottom = '10px';
|
|
326
|
+
|
|
327
|
+
const userMessageInput = document.createElement('textarea');
|
|
328
|
+
userMessageInput.id = 'donobu-user-message-input';
|
|
329
|
+
userMessageInput.placeholder =
|
|
330
|
+
'Additional instructions...\n(Press Enter or Resume to submit)';
|
|
331
|
+
userMessageInput.style.width = '100%';
|
|
332
|
+
userMessageInput.style.height = '60px';
|
|
333
|
+
userMessageInput.style.padding = '8px';
|
|
334
|
+
userMessageInput.style.border = '1px solid #ddd';
|
|
335
|
+
userMessageInput.style.borderRadius = '4px';
|
|
336
|
+
userMessageInput.style.resize = 'vertical';
|
|
337
|
+
userMessageInput.style.fontFamily = 'inherit';
|
|
338
|
+
userMessageInput.style.fontSize = '12px';
|
|
339
|
+
|
|
340
|
+
userMessageSection.appendChild(userMessageInput);
|
|
341
|
+
expandableContent.appendChild(userMessageSection);
|
|
282
342
|
|
|
283
343
|
// Attach everything
|
|
284
344
|
panelContent.appendChild(navbar);
|
|
@@ -297,12 +357,84 @@
|
|
|
297
357
|
btn.style.cursor = active ? 'pointer' : 'default';
|
|
298
358
|
}
|
|
299
359
|
|
|
360
|
+
// Helper function to handle resume logic (shared by play button and Enter key)
|
|
361
|
+
function handleResume() {
|
|
362
|
+
if (hostEl.donobuFlowState === 'PAUSED' && !isTransitioningToEnd) {
|
|
363
|
+
// Capture the user message if present
|
|
364
|
+
const userMessageInput = shadow.getElementById(
|
|
365
|
+
'donobu-user-message-input',
|
|
366
|
+
);
|
|
367
|
+
const userMessage = userMessageInput
|
|
368
|
+
? userMessageInput.value.trim()
|
|
369
|
+
: '';
|
|
370
|
+
hostEl.donobuFlowState = 'RESUMING';
|
|
371
|
+
isTransitioningToPause = false;
|
|
372
|
+
titleText.textContent = 'Resuming...';
|
|
373
|
+
window.__donobu.nextState = 'RESUMING';
|
|
374
|
+
window.__donobu.userMessage = userMessage || null;
|
|
375
|
+
// Clear the input after capturing
|
|
376
|
+
if (userMessageInput) {
|
|
377
|
+
userMessageInput.value = '';
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
updateButtonStates();
|
|
381
|
+
return true; // Indicate that resume was handled
|
|
382
|
+
}
|
|
383
|
+
return false; // Indicate that resume was not applicable
|
|
384
|
+
}
|
|
385
|
+
|
|
300
386
|
function updateButtonStates() {
|
|
301
387
|
if (!document.contains(hostEl)) {
|
|
302
388
|
document.body.appendChild(hostEl);
|
|
303
389
|
}
|
|
304
390
|
|
|
305
391
|
const currentState = hostEl.donobuFlowState;
|
|
392
|
+
const runMode = hostEl.donobuRunMode || 'AUTONOMOUS';
|
|
393
|
+
const userMessageSection = shadow.getElementById(
|
|
394
|
+
'donobu-user-message-section',
|
|
395
|
+
);
|
|
396
|
+
|
|
397
|
+
// Show user input if:
|
|
398
|
+
// 1. Currently paused and in autonomous mode, OR
|
|
399
|
+
// 2. Transitioning to pause (eager expansion)
|
|
400
|
+
const shouldShowUserInput =
|
|
401
|
+
(currentState === 'PAUSED' && runMode === 'AUTONOMOUS') ||
|
|
402
|
+
isTransitioningToPause;
|
|
403
|
+
|
|
404
|
+
if (userMessageSection) {
|
|
405
|
+
// Smooth show/hide user input section
|
|
406
|
+
if (shouldShowUserInput) {
|
|
407
|
+
// Show and expand the panel
|
|
408
|
+
expandableContent.classList.add('expanded');
|
|
409
|
+
// Small delay to ensure the expandable content animation starts first
|
|
410
|
+
setTimeout(() => {
|
|
411
|
+
userMessageSection.style.display = 'block';
|
|
412
|
+
// Trigger reflow, then add visible class for smooth transition
|
|
413
|
+
userMessageSection.offsetHeight;
|
|
414
|
+
userMessageSection.classList.add('visible');
|
|
415
|
+
// Auto-focus the textarea when it becomes visible and we're actually paused
|
|
416
|
+
// (not just transitioning)
|
|
417
|
+
if (currentState === 'PAUSED') {
|
|
418
|
+
const textarea = shadow.getElementById(
|
|
419
|
+
'donobu-user-message-input',
|
|
420
|
+
);
|
|
421
|
+
if (textarea) {
|
|
422
|
+
textarea.focus();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}, 100);
|
|
426
|
+
} else {
|
|
427
|
+
// Hide user input section first
|
|
428
|
+
userMessageSection.classList.remove('visible');
|
|
429
|
+
|
|
430
|
+
// After the user section animation, collapse the panel
|
|
431
|
+
setTimeout(() => {
|
|
432
|
+
userMessageSection.style.display = 'none';
|
|
433
|
+
expandableContent.classList.remove('expanded');
|
|
434
|
+
}, 300); // Match the CSS transition duration
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
306
438
|
// This block handles the visual state while waiting for the backend.
|
|
307
439
|
// We check if the final state has arrived. If it has NOT, we show the
|
|
308
440
|
// "transitioning" UI and then `return` to wait for the next update.
|
|
@@ -389,13 +521,7 @@
|
|
|
389
521
|
// --- Button event listeners ---
|
|
390
522
|
|
|
391
523
|
playButton.addEventListener('click', () => {
|
|
392
|
-
|
|
393
|
-
hostEl.donobuFlowState = 'RESUMING';
|
|
394
|
-
isTransitioningToPause = false;
|
|
395
|
-
titleText.textContent = 'Resuming...';
|
|
396
|
-
window.__donobu.nextState = 'RESUMING';
|
|
397
|
-
updateButtonStates();
|
|
398
|
-
}
|
|
524
|
+
handleResume();
|
|
399
525
|
});
|
|
400
526
|
|
|
401
527
|
// PAUSE button: signals user wants to pause
|
|
@@ -404,16 +530,10 @@
|
|
|
404
530
|
const isPauseActive = pauseButton.style.opacity === '1';
|
|
405
531
|
if (isPauseActive && !isTransitioningToPause && !isTransitioningToEnd) {
|
|
406
532
|
isTransitioningToPause = true;
|
|
407
|
-
|
|
408
|
-
// Grab the current action's text BEFORE overwriting it.
|
|
409
|
-
const currentActionText = titleText.textContent;
|
|
410
|
-
|
|
411
533
|
// Provide immediate, informative feedback to the user.
|
|
412
|
-
titleText.textContent = `
|
|
413
|
-
|
|
534
|
+
titleText.textContent = `Pausing...`;
|
|
414
535
|
// Expose next state so external script can pick it up
|
|
415
536
|
window.__donobu.nextState = 'PAUSED';
|
|
416
|
-
|
|
417
537
|
// Manually update button states for immediate feedback
|
|
418
538
|
updateButtonStates();
|
|
419
539
|
}
|
|
@@ -424,18 +544,27 @@
|
|
|
424
544
|
const isEndActive = endButton.style.opacity === '1';
|
|
425
545
|
if (isEndActive && !isTransitioningToEnd) {
|
|
426
546
|
isTransitioningToEnd = true;
|
|
427
|
-
|
|
428
|
-
const currentActionText = titleText.textContent;
|
|
429
|
-
titleText.textContent = `Quit pending (after '${currentActionText}')`;
|
|
430
|
-
|
|
547
|
+
titleText.textContent = `Quitting...`;
|
|
431
548
|
// Expose next state
|
|
432
549
|
window.__donobu.nextState = 'SUCCESS';
|
|
433
|
-
|
|
434
550
|
// Manually update button states for immediate feedback
|
|
435
551
|
updateButtonStates();
|
|
436
552
|
}
|
|
437
553
|
});
|
|
438
554
|
|
|
555
|
+
// Add Enter key listener to the textarea
|
|
556
|
+
userMessageInput.addEventListener('keydown', (e) => {
|
|
557
|
+
// Handle Enter key (but not Shift+Enter, which should create new lines)
|
|
558
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
559
|
+
e.preventDefault(); // Prevent default textarea behavior
|
|
560
|
+
|
|
561
|
+
// Only trigger resume if we're in a paused state
|
|
562
|
+
if (handleResume()) {
|
|
563
|
+
// Resume was successful, the handleResume function took care of everything
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
|
|
439
568
|
// --- Drag-and-drop logic ---
|
|
440
569
|
let isDragging = false;
|
|
441
570
|
let offsetX = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1248
|