claw-design 1.0.1

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/cli/commands/start.d.ts +7 -0
  4. package/dist/cli/commands/start.d.ts.map +1 -0
  5. package/dist/cli/commands/start.js +176 -0
  6. package/dist/cli/commands/start.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +20 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/utils/claude.d.ts +21 -0
  12. package/dist/cli/utils/claude.d.ts.map +1 -0
  13. package/dist/cli/utils/claude.js +42 -0
  14. package/dist/cli/utils/claude.js.map +1 -0
  15. package/dist/cli/utils/dev-server.d.ts +14 -0
  16. package/dist/cli/utils/dev-server.d.ts.map +1 -0
  17. package/dist/cli/utils/dev-server.js +57 -0
  18. package/dist/cli/utils/dev-server.js.map +1 -0
  19. package/dist/cli/utils/electron.d.ts +7 -0
  20. package/dist/cli/utils/electron.d.ts.map +1 -0
  21. package/dist/cli/utils/electron.js +36 -0
  22. package/dist/cli/utils/electron.js.map +1 -0
  23. package/dist/cli/utils/output.d.ts +6 -0
  24. package/dist/cli/utils/output.d.ts.map +1 -0
  25. package/dist/cli/utils/output.js +21 -0
  26. package/dist/cli/utils/output.js.map +1 -0
  27. package/dist/cli/utils/port-detect.d.ts +30 -0
  28. package/dist/cli/utils/port-detect.d.ts.map +1 -0
  29. package/dist/cli/utils/port-detect.js +95 -0
  30. package/dist/cli/utils/port-detect.js.map +1 -0
  31. package/dist/cli/utils/preflight.d.ts +20 -0
  32. package/dist/cli/utils/preflight.d.ts.map +1 -0
  33. package/dist/cli/utils/preflight.js +33 -0
  34. package/dist/cli/utils/preflight.js.map +1 -0
  35. package/dist/cli/utils/process.d.ts +23 -0
  36. package/dist/cli/utils/process.d.ts.map +1 -0
  37. package/dist/cli/utils/process.js +57 -0
  38. package/dist/cli/utils/process.js.map +1 -0
  39. package/out/main/index.js +1123 -0
  40. package/out/preload/overlay.cjs +56 -0
  41. package/out/preload/sidebar.cjs +29 -0
  42. package/out/renderer/assets/overlay-Bsx1u_qg.css +449 -0
  43. package/out/renderer/assets/overlay-DZl3I3jq.js +689 -0
  44. package/out/renderer/assets/sidebar-Bt34gvPU.js +563 -0
  45. package/out/renderer/assets/sidebar-BxEPS84k.css +515 -0
  46. package/out/renderer/assets/toast-CLlgwMU_.js +110 -0
  47. package/out/renderer/overlay.html +131 -0
  48. package/out/renderer/sidebar.html +64 -0
  49. package/package.json +67 -0
  50. package/resources/icon.icns +0 -0
  51. package/resources/icon.png +0 -0
  52. package/scripts/postinstall.cjs +56 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ const electron = require("electron");
3
+ const overlayAPI = {
4
+ /** Request activation of selection mode (expand overlay to full window).
5
+ * Returns the overlay view's pre-expansion bounds so the renderer can
6
+ * translate view-local toolbar coordinates into full-window coordinates. */
7
+ activateSelection: () => electron.ipcRenderer.invoke("overlay:activate-selection"),
8
+ /** Request deactivation of selection mode (shrink overlay to toolbar area) */
9
+ deactivateSelection: () => electron.ipcRenderer.invoke("overlay:deactivate-selection"),
10
+ /** Listen for overlay mode changes from main process */
11
+ onModeChange: (callback) => {
12
+ electron.ipcRenderer.on("overlay:mode-change", (_event, mode) => callback(mode));
13
+ },
14
+ /** Query the site view for the element at the given CSS-pixel coordinates */
15
+ getElementAtPoint: (x, y) => electron.ipcRenderer.invoke("overlay:get-element-at-point", x, y),
16
+ /** Listen for selection committed events (Phase 4 uses this to trigger capture) */
17
+ onSelectionCommitted: (callback) => {
18
+ electron.ipcRenderer.on(
19
+ "overlay:selection-committed",
20
+ (_event, bounds) => callback(bounds)
21
+ );
22
+ },
23
+ /** Capture screenshot of selected region as PNG buffer (Plan 03-02) */
24
+ captureScreenshot: (bounds) => electron.ipcRenderer.invoke("overlay:capture-screenshot", bounds),
25
+ /** Extract DOM elements within selected region (Plan 03-02) */
26
+ extractDom: (bounds) => electron.ipcRenderer.invoke("overlay:extract-dom", bounds),
27
+ /** Submit instruction with screenshot + DOM context to main process */
28
+ submitInstruction: (data) => electron.ipcRenderer.invoke("overlay:submit-instruction", data),
29
+ /** Listen for instruction prefill events (retry flow -- D-19) */
30
+ onPrefillInstruction: (callback) => {
31
+ electron.ipcRenderer.on("overlay:prefill-instruction", (_event, data) => callback(data));
32
+ },
33
+ /** Apply a drag delta to the toolbar position (returns new position) */
34
+ dragToolbar: (dx, dy) => electron.ipcRenderer.invoke("overlay:drag-toolbar", { dx, dy }),
35
+ /** Set absolute toolbar position (used to restore saved position) */
36
+ setToolbarPosition: (x, y) => electron.ipcRenderer.invoke("overlay:set-toolbar-position", { x, y }),
37
+ /** Switch viewport preset (ELEC-03) */
38
+ setViewport: (preset) => electron.ipcRenderer.invoke("viewport:set", { preset }),
39
+ /** Listen for viewport changes from main process (sync active state) */
40
+ onViewportChanged: (callback) => {
41
+ electron.ipcRenderer.on("viewport:changed", (_event, data) => callback(data));
42
+ },
43
+ /** Listen for toast show events from main process (D-08, D-09) */
44
+ onToastShow: (callback) => {
45
+ electron.ipcRenderer.on("toast:show", (_event, data) => callback(data));
46
+ },
47
+ /** Listen for toast dismiss events from main process */
48
+ onToastDismiss: (callback) => {
49
+ electron.ipcRenderer.on("toast:dismiss", (_event, data) => callback(data));
50
+ },
51
+ /** Listen for site load complete event from main process */
52
+ onSiteLoaded: (callback) => {
53
+ electron.ipcRenderer.on("site:loaded", () => callback());
54
+ }
55
+ };
56
+ electron.contextBridge.exposeInMainWorld("claw", overlayAPI);
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ const electron = require("electron");
3
+ const sidebarAPI = {
4
+ /** Listen for task status updates from main process */
5
+ onTaskUpdate: (callback) => {
6
+ electron.ipcRenderer.on("sidebar:task-update", (_event, data) => callback(data));
7
+ },
8
+ /** Request sidebar expand (main process adjusts view bounds) */
9
+ expand: () => electron.ipcRenderer.invoke("sidebar:expand"),
10
+ /** Request sidebar collapse (main process restores view bounds) */
11
+ collapse: () => electron.ipcRenderer.invoke("sidebar:collapse"),
12
+ /** Dismiss a completed or errored task */
13
+ dismissTask: (id) => electron.ipcRenderer.invoke("sidebar:task-dismiss", { id }),
14
+ /** Retry an errored task */
15
+ retryTask: (id) => electron.ipcRenderer.invoke("sidebar:task-retry", { id }),
16
+ /** Undo a completed task (asks Claude to revert the change) */
17
+ undoTask: (id) => electron.ipcRenderer.invoke("sidebar:task-undo", { id }),
18
+ /** Listen for sidebar state changes from main process (e.g. D-08 auto-minimize) */
19
+ onStateChange: (callback) => {
20
+ electron.ipcRenderer.on("sidebar:state-change", (_event, state) => callback(state));
21
+ },
22
+ /** Get logs for a specific task */
23
+ getTaskLogs: (id) => electron.ipcRenderer.invoke("sidebar:task-logs", { id }),
24
+ /** Apply a drag delta to the sidebar position (returns new position) */
25
+ dragDelta: (dx, dy) => electron.ipcRenderer.invoke("sidebar:drag-delta", { dx, dy }),
26
+ /** Set absolute sidebar position (used to restore saved position) */
27
+ setPosition: (x, y) => electron.ipcRenderer.invoke("sidebar:set-position", { x, y })
28
+ };
29
+ electron.contextBridge.exposeInMainWorld("clawSidebar", sidebarAPI);
@@ -0,0 +1,449 @@
1
+ /* Overlay page: fully transparent, no interaction by default */
2
+ html,
3
+ body {
4
+ margin: 0;
5
+ padding: 0;
6
+ width: 100%;
7
+ height: 100%;
8
+ background: transparent;
9
+ overflow: hidden;
10
+ user-select: none;
11
+ }
12
+
13
+ /* Active selection mode: near-invisible background to capture mouse events
14
+ across the full overlay surface. Without this, Chromium hit-testing passes
15
+ clicks through fully transparent regions to the site view underneath. */
16
+ body.claw-overlay--active {
17
+ /* background: rgba(0, 0, 0, 0.2); */
18
+ background: rgba(130, 163, 173, 0.2);
19
+ }
20
+
21
+ /* Vertical pill toolbar — view is already positioned at bottom-right by main process */
22
+ .claw-toolbar {
23
+ position: absolute;
24
+ bottom: 12px;
25
+ right: 8px;
26
+ display: flex;
27
+ flex-direction: column;
28
+ align-items: center;
29
+ gap: 4px;
30
+ padding: 10px 8px;
31
+ background: rgba(10, 10, 10, 0.88);
32
+ border-radius: 999px;
33
+ z-index: 9999;
34
+ transition: opacity 0.15s ease;
35
+ opacity: 0.75;
36
+ }
37
+
38
+ .claw-toolbar:hover {
39
+ opacity: 1;
40
+ }
41
+
42
+ /* Drag handle - non-interactive visual indicator */
43
+ .claw-toolbar-handle {
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ width: 36px;
48
+ height: 36px;
49
+ color: rgba(255, 255, 255, 0.3);
50
+ cursor: grab;
51
+ }
52
+
53
+ /* Toolbar button */
54
+ .claw-toolbar-btn {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ width: 36px;
59
+ height: 36px;
60
+ padding: 0;
61
+ border: none;
62
+ border-radius: 12px;
63
+ background: transparent;
64
+ color: rgba(255, 255, 255, 0.55);
65
+ cursor: pointer;
66
+ transition: color 0.12s ease, background 0.12s ease;
67
+ }
68
+
69
+ .claw-toolbar-btn:hover {
70
+ color: #fff;
71
+ background: rgba(255, 255, 255, 0.15);
72
+ }
73
+
74
+ /* Toolbar divider -- separates selection controls from viewport controls (D-01) */
75
+ .claw-toolbar-divider {
76
+ width: 24px;
77
+ height: 1px;
78
+ background: rgba(255, 255, 255, 0.1);
79
+ margin: 4px 0;
80
+ flex-shrink: 0;
81
+ }
82
+
83
+ /* Collapsible viewport group -- hidden by default, expands toolbar on toggle */
84
+ .claw-viewport-group {
85
+ display: flex;
86
+ flex-direction: column;
87
+ align-items: center;
88
+ gap: 4px;
89
+ overflow: hidden;
90
+ max-height: 0;
91
+ opacity: 0;
92
+ transition: max-height 200ms ease-out, opacity 150ms ease-out;
93
+ }
94
+
95
+ .claw-viewport-group--open {
96
+ max-height: 132px;
97
+ opacity: 1;
98
+ }
99
+
100
+ /* Selection rectangle (freeform drawing) -- per D-05, D-07, UI spec selection accent detail */
101
+ .claw-selection-rect {
102
+ position: absolute;
103
+ border: 2px solid rgba(138, 180, 248, 0.8);
104
+ background: rgba(138, 180, 248, 0.08);
105
+ border-radius: 6px;
106
+ pointer-events: none;
107
+ z-index: 100;
108
+ }
109
+
110
+ .claw-selection-rect--committed {
111
+ border-color: rgba(138, 180, 248, 0.9);
112
+ background: rgba(138, 180, 248, 0.10);
113
+ }
114
+
115
+ /* Element hover highlight -- per D-06, UI spec */
116
+ .claw-element-highlight {
117
+ position: absolute;
118
+ border: 2px solid rgba(138, 180, 248, 0.6);
119
+ background: rgba(138, 180, 248, 0.06);
120
+ border-radius: 6px;
121
+ pointer-events: none;
122
+ z-index: 100;
123
+ opacity: 0;
124
+ transition: opacity 80ms ease-out;
125
+ }
126
+
127
+ .claw-element-highlight--visible {
128
+ opacity: 1;
129
+ }
130
+
131
+ .claw-element-highlight--committed {
132
+ border-color: rgba(138, 180, 248, 0.9);
133
+ background: rgba(138, 180, 248, 0.10);
134
+ opacity: 1;
135
+ }
136
+
137
+ /* Toolbar button active state -- per UI spec text colors */
138
+ .claw-toolbar-btn--active {
139
+ color: rgba(138, 180, 248, 1) !important;
140
+ background: rgba(138, 180, 248, 0.15) !important;
141
+ }
142
+
143
+ /* Viewport toggle "expanded" state -- subtler than selection active */
144
+ .claw-toolbar-btn--toggle-open {
145
+ color: rgba(255, 255, 255, 0.75) !important;
146
+ background: rgba(255, 255, 255, 0.1) !important;
147
+ }
148
+
149
+ /* Instruction input bar — per D-09, UI spec */
150
+ .claw-input-bar {
151
+ position: absolute;
152
+ z-index: 200;
153
+ min-width: 240px;
154
+ max-width: 480px;
155
+ opacity: 0;
156
+ transform: translateY(4px);
157
+ transition: opacity 150ms ease-out, transform 150ms ease-out;
158
+ }
159
+
160
+ .claw-input-bar--visible {
161
+ opacity: 1;
162
+ transform: translateY(0);
163
+ }
164
+
165
+ .claw-input-bar__inner {
166
+ display: flex;
167
+ align-items: flex-end;
168
+ gap: 12px;
169
+ background: rgba(10, 10, 10, 0.88);
170
+ border: 1px solid rgba(255, 255, 255, 0.1);
171
+ border-radius: 12px;
172
+ padding: 12px 12px 12px 16px;
173
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
174
+ }
175
+
176
+ .claw-input-bar__textarea {
177
+ flex: 1;
178
+ background: transparent;
179
+ border: none;
180
+ outline: none;
181
+ color: #ffffff;
182
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
183
+ font-size: 14px;
184
+ font-weight: 400;
185
+ line-height: 1.5;
186
+ resize: none;
187
+ min-height: 21px;
188
+ max-height: 160px;
189
+ overflow-y: auto;
190
+ -webkit-font-smoothing: antialiased;
191
+ -moz-osx-font-smoothing: grayscale;
192
+ }
193
+
194
+ .claw-input-bar__textarea::placeholder {
195
+ color: rgba(255, 255, 255, 0.4);
196
+ }
197
+
198
+ .claw-input-bar__submit {
199
+ display: flex;
200
+ align-items: center;
201
+ justify-content: center;
202
+ width: 28px;
203
+ height: 28px;
204
+ min-width: 28px;
205
+ padding: 0;
206
+ border: none;
207
+ border-radius: 8px;
208
+ background: transparent;
209
+ color: rgba(255, 255, 255, 0.25);
210
+ cursor: pointer;
211
+ transition: color 120ms ease;
212
+ }
213
+
214
+ .claw-input-bar__submit--enabled {
215
+ color: rgba(138, 180, 248, 1);
216
+ }
217
+
218
+ .claw-input-bar__submit:hover {
219
+ color: rgba(138, 180, 248, 1);
220
+ }
221
+
222
+ .claw-input-bar__footer {
223
+ display: flex;
224
+ align-items: center;
225
+ gap: 8px;
226
+ padding: 4px 0 0 12px;
227
+ }
228
+
229
+ .claw-input-bar__model {
230
+ background: rgba(255, 255, 255, 0.06);
231
+ border: 1px solid rgba(255, 255, 255, 0.08);
232
+ border-radius: 6px;
233
+ color: rgba(255, 255, 255, 0.5);
234
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
235
+ font-size: 11px;
236
+ font-weight: 400;
237
+ padding: 2px 6px;
238
+ cursor: pointer;
239
+ -webkit-font-smoothing: antialiased;
240
+ -webkit-appearance: none;
241
+ appearance: none;
242
+ }
243
+
244
+ .claw-input-bar__model:hover {
245
+ color: rgba(255, 255, 255, 0.7);
246
+ border-color: rgba(255, 255, 255, 0.15);
247
+ }
248
+
249
+ .claw-input-bar__model:focus {
250
+ outline: none;
251
+ border-color: rgba(138, 180, 248, 0.5);
252
+ }
253
+
254
+ .claw-input-bar__model option {
255
+ background: #1a1a1a;
256
+ color: #ffffff;
257
+ }
258
+
259
+ .claw-input-bar__hint {
260
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
261
+ font-size: 12px;
262
+ font-weight: 500;
263
+ line-height: 1.33;
264
+ color: rgba(255, 255, 255, 0.35);
265
+ -webkit-font-smoothing: antialiased;
266
+ -moz-osx-font-smoothing: grayscale;
267
+ }
268
+
269
+ /* Toast notification container -- top center of window (D-09, D-10) */
270
+ .claw-toast-container {
271
+ position: fixed;
272
+ top: 16px;
273
+ left: 50%;
274
+ transform: translateX(-50%);
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: 8px;
278
+ z-index: 300;
279
+ pointer-events: none;
280
+ max-width: 400px;
281
+ width: 100%;
282
+ }
283
+
284
+ /* Individual toast notification */
285
+ .claw-toast {
286
+ display: flex;
287
+ align-items: flex-start;
288
+ gap: 8px;
289
+ background: rgba(10, 10, 10, 0.92);
290
+ border: 1px solid rgba(255, 255, 255, 0.08);
291
+ border-radius: 12px;
292
+ padding: 8px 16px;
293
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
294
+ pointer-events: auto;
295
+ opacity: 0;
296
+ transform: translateY(-8px);
297
+ transition: opacity 200ms ease-out, transform 200ms ease-out;
298
+ }
299
+
300
+ .claw-toast--visible {
301
+ opacity: 1;
302
+ transform: translateY(0);
303
+ }
304
+
305
+ .claw-toast--exiting {
306
+ opacity: 0;
307
+ transform: translateY(-8px);
308
+ transition: opacity 150ms ease-in, transform 150ms ease-in;
309
+ }
310
+
311
+ /* Severity border-left colors */
312
+ .claw-toast--info {
313
+ border-left: 2px solid rgba(138, 180, 248, 0.5);
314
+ }
315
+
316
+ .claw-toast--warning {
317
+ border-left: 2px solid rgba(255, 200, 120, 0.5);
318
+ }
319
+
320
+ .claw-toast--error {
321
+ border-left: 2px solid rgba(248, 150, 138, 0.5);
322
+ }
323
+
324
+ /* Toast icon */
325
+ .claw-toast__icon {
326
+ flex-shrink: 0;
327
+ width: 20px;
328
+ height: 20px;
329
+ margin-top: 2px;
330
+ }
331
+
332
+ .claw-toast--info .claw-toast__icon { color: rgba(138, 180, 248, 0.9); }
333
+ .claw-toast--warning .claw-toast__icon { color: rgba(255, 200, 120, 0.9); }
334
+ .claw-toast--error .claw-toast__icon { color: rgba(248, 150, 138, 0.9); }
335
+
336
+ /* Toast content */
337
+ .claw-toast__content {
338
+ flex: 1;
339
+ min-width: 0;
340
+ }
341
+
342
+ .claw-toast__title {
343
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
344
+ font-size: 14px;
345
+ font-weight: 600;
346
+ line-height: 1.25;
347
+ color: rgba(255, 255, 255, 0.9);
348
+ -webkit-font-smoothing: antialiased;
349
+ -moz-osx-font-smoothing: grayscale;
350
+ }
351
+
352
+ .claw-toast__message {
353
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
354
+ font-size: 12px;
355
+ font-weight: 400;
356
+ line-height: 1.5;
357
+ color: rgba(255, 255, 255, 0.7);
358
+ margin-top: 2px;
359
+ -webkit-font-smoothing: antialiased;
360
+ -moz-osx-font-smoothing: grayscale;
361
+ }
362
+
363
+ /* Toast dismiss button */
364
+ .claw-toast__dismiss {
365
+ background: none;
366
+ border: none;
367
+ padding: 0;
368
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
369
+ font-size: 12px;
370
+ font-weight: 400;
371
+ color: rgba(255, 255, 255, 0.4);
372
+ cursor: pointer;
373
+ margin-top: 4px;
374
+ transition: color 120ms ease;
375
+ -webkit-font-smoothing: antialiased;
376
+ }
377
+
378
+ .claw-toast__dismiss:hover {
379
+ color: rgba(255, 255, 255, 0.7);
380
+ }
381
+
382
+ /* Tooltip (D-22) -- positioned to the left of toolbar buttons */
383
+ .claw-tooltip {
384
+ position: fixed;
385
+ z-index: 10000;
386
+ background: rgba(10, 10, 10, 0.95);
387
+ border-radius: 8px;
388
+ padding: 4px 8px;
389
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
390
+ font-size: 11px;
391
+ font-weight: 400;
392
+ line-height: 1.36;
393
+ color: rgba(255, 255, 255, 0.9);
394
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
395
+ max-width: 160px;
396
+ white-space: nowrap;
397
+ pointer-events: none;
398
+ -webkit-font-smoothing: antialiased;
399
+ -moz-osx-font-smoothing: grayscale;
400
+ }
401
+
402
+ /* Loading indicator -- centered spinner while site loads */
403
+ .claw-loading {
404
+ position: fixed;
405
+ top: 0;
406
+ left: 0;
407
+ width: 100%;
408
+ height: 100%;
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: center;
412
+ z-index: 50;
413
+ pointer-events: none;
414
+ }
415
+
416
+ .claw-loading--hidden {
417
+ display: none;
418
+ }
419
+
420
+ .claw-loading__spinner {
421
+ width: 28px;
422
+ height: 28px;
423
+ border: 2px solid transparent;
424
+ border-top-color: rgba(138, 180, 248, 0.7);
425
+ border-radius: 50%;
426
+ animation: claw-spin 800ms linear infinite;
427
+ }
428
+
429
+ @keyframes claw-spin {
430
+ to { transform: rotate(360deg); }
431
+ }
432
+
433
+ /* Accessibility: reduced motion */
434
+ @media (prefers-reduced-motion: reduce) {
435
+
436
+ .claw-element-highlight,
437
+ .claw-toolbar,
438
+ .claw-toolbar-btn,
439
+ .claw-input-bar,
440
+ .claw-toast,
441
+ .claw-toast--exiting {
442
+ transition: none !important;
443
+ }
444
+
445
+ .claw-loading__spinner {
446
+ animation: none;
447
+ border-top-color: rgba(138, 180, 248, 0.5);
448
+ }
449
+ }