+
+
Something went wrong
+
{this.state.error.message}
-
+
+
+ {/* If the error recurs immediately, "Try again" loops — a full reload
+ is the recovery path that always works. */}
+
+
);
}
diff --git a/packages/studio/src/components/StudioFeedbackBar.tsx b/packages/studio/src/components/StudioFeedbackBar.tsx
index 11100cc67..90428aa82 100644
--- a/packages/studio/src/components/StudioFeedbackBar.tsx
+++ b/packages/studio/src/components/StudioFeedbackBar.tsx
@@ -69,6 +69,7 @@ function markPrompted(): void {
// fallow-ignore-next-line complexity
export const StudioFeedbackBar = memo(function StudioFeedbackBar() {
const [visible, setVisible] = useState(false);
+ const [entered, setEntered] = useState(false);
const [rating, setRating] = useState
(null);
const [comment, setComment] = useState("");
const [submitted, setSubmitted] = useState(false);
@@ -88,6 +89,14 @@ export const StudioFeedbackBar = memo(function StudioFeedbackBar() {
return () => clearTimeout(showTimer);
}, []);
+ // Animate height in on entrance — appearing 3s after load, an instant 32px
+ // bar shoves the whole preview stack up mid-task.
+ useEffect(() => {
+ if (!visible) return;
+ const raf = requestAnimationFrame(() => setEntered(true));
+ return () => cancelAnimationFrame(raf);
+ }, [visible]);
+
// Auto-dismiss timer — reset when user interacts (sets rating)
useEffect(() => {
if (!visible || rating !== null || submitted) return;
@@ -141,8 +150,8 @@ export const StudioFeedbackBar = memo(function StudioFeedbackBar() {
return (
{submitted ? (
diff --git a/packages/studio/src/components/StudioGlobalDragOverlay.tsx b/packages/studio/src/components/StudioGlobalDragOverlay.tsx
index d7ffcae87..ecd65cb61 100644
--- a/packages/studio/src/components/StudioGlobalDragOverlay.tsx
+++ b/packages/studio/src/components/StudioGlobalDragOverlay.tsx
@@ -1,6 +1,6 @@
export function StudioGlobalDragOverlay() {
return (
-
+