Spaces:
Running on Zero
Running on Zero
Persist accordion open/closed state separately for main view and Animate All
Browse filesMain view defaults to collapsed, Animate All defaults to expanded.
Each context saves independently to localStorage so toggling in one
doesn't affect the other.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- src/ui/interface.py +1 -1
- src/ui/static/animate-all.js +18 -0
- src/ui/static/animation-core.js +9 -4
src/ui/interface.py
CHANGED
|
@@ -129,7 +129,7 @@ def _build_left_column(c):
|
|
| 129 |
|
| 130 |
def _build_animation_settings(c):
|
| 131 |
"""Build the animation settings accordion."""
|
| 132 |
-
with gr.Accordion("Animation Settings", open=
|
| 133 |
with gr.Row(elem_id="anim-style-row"):
|
| 134 |
c.anim_granularity_radio = gr.Radio(
|
| 135 |
choices=ANIM_GRANULARITIES,
|
|
|
|
| 129 |
|
| 130 |
def _build_animation_settings(c):
|
| 131 |
"""Build the animation settings accordion."""
|
| 132 |
+
with gr.Accordion("Animation Settings", open=False, elem_id="anim-settings-accordion"):
|
| 133 |
with gr.Row(elem_id="anim-style-row"):
|
| 134 |
c.anim_granularity_radio = gr.Radio(
|
| 135 |
choices=ANIM_GRANULARITIES,
|
src/ui/static/animate-all.js
CHANGED
|
@@ -933,6 +933,15 @@ function stopAnimateAll() {
|
|
| 933 |
} else {
|
| 934 |
animateAllState.accordionParent.appendChild(animAccordion);
|
| 935 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 936 |
}
|
| 937 |
// Reset button
|
| 938 |
if (animateAllState.btn) {
|
|
@@ -1049,6 +1058,15 @@ function toggleAnimateAll(btn) {
|
|
| 1049 |
animateAllState.accordionNextSibling = animAccordion.nextElementSibling;
|
| 1050 |
var container = document.querySelector('.segments-container');
|
| 1051 |
if (container) container.parentNode.insertBefore(animAccordion, container);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1052 |
}
|
| 1053 |
var container = document.querySelector('.segments-container');
|
| 1054 |
// Add tip callout above the mega card
|
|
|
|
| 933 |
} else {
|
| 934 |
animateAllState.accordionParent.appendChild(animAccordion);
|
| 935 |
}
|
| 936 |
+
// Restore main-context accordion state (default: closed)
|
| 937 |
+
window._animateAllActive = false;
|
| 938 |
+
var _s = loadAnimSettings();
|
| 939 |
+
var wantOpen = _s && _s.accordionOpenMain === true;
|
| 940 |
+
var isOpen = animAccordion.classList.contains('open');
|
| 941 |
+
if (wantOpen !== isOpen) {
|
| 942 |
+
var btn = animAccordion.querySelector(':scope > .label-wrap');
|
| 943 |
+
if (btn) btn.click();
|
| 944 |
+
}
|
| 945 |
}
|
| 946 |
// Reset button
|
| 947 |
if (animateAllState.btn) {
|
|
|
|
| 1058 |
animateAllState.accordionNextSibling = animAccordion.nextElementSibling;
|
| 1059 |
var container = document.querySelector('.segments-container');
|
| 1060 |
if (container) container.parentNode.insertBefore(animAccordion, container);
|
| 1061 |
+
// Restore mega-context accordion state (default: open)
|
| 1062 |
+
window._animateAllActive = true;
|
| 1063 |
+
var _s = loadAnimSettings();
|
| 1064 |
+
var wantOpen = !_s || _s.accordionOpenMega !== false;
|
| 1065 |
+
var isOpen = animAccordion.classList.contains('open');
|
| 1066 |
+
if (wantOpen !== isOpen) {
|
| 1067 |
+
var btn = animAccordion.querySelector(':scope > .label-wrap');
|
| 1068 |
+
if (btn) btn.click();
|
| 1069 |
+
}
|
| 1070 |
}
|
| 1071 |
var container = document.querySelector('.segments-container');
|
| 1072 |
// Add tip callout above the mega card
|
src/ui/static/animation-core.js
CHANGED
|
@@ -65,7 +65,11 @@ function saveAnimSettings() {
|
|
| 65 |
}
|
| 66 |
s.playbackRate = window.ANIM_PLAYBACK_RATE || 1;
|
| 67 |
var accEl = document.getElementById('anim-settings-accordion');
|
| 68 |
-
if (accEl)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
localStorage.setItem(_ANIM_STORAGE_KEY, JSON.stringify(s));
|
| 70 |
} catch(e) {}
|
| 71 |
}
|
|
@@ -106,11 +110,12 @@ if (_saved) {
|
|
| 106 |
}
|
| 107 |
window.ANIM_PLAYBACK_RATE = (_saved && _saved.playbackRate) ? _saved.playbackRate : 1;
|
| 108 |
|
| 109 |
-
// --- Accordion open/close persistence ---
|
| 110 |
-
|
|
|
|
| 111 |
requestAnimationFrame(function() {
|
| 112 |
var acc = document.getElementById('anim-settings-accordion');
|
| 113 |
-
if (acc && acc.classList.contains('open')) {
|
| 114 |
var btn = acc.querySelector(':scope > .label-wrap');
|
| 115 |
if (btn) btn.click();
|
| 116 |
}
|
|
|
|
| 65 |
}
|
| 66 |
s.playbackRate = window.ANIM_PLAYBACK_RATE || 1;
|
| 67 |
var accEl = document.getElementById('anim-settings-accordion');
|
| 68 |
+
if (accEl) {
|
| 69 |
+
var accOpen = accEl.classList.contains('open');
|
| 70 |
+
if (window._animateAllActive) s.accordionOpenMega = accOpen;
|
| 71 |
+
else s.accordionOpenMain = accOpen;
|
| 72 |
+
}
|
| 73 |
localStorage.setItem(_ANIM_STORAGE_KEY, JSON.stringify(s));
|
| 74 |
} catch(e) {}
|
| 75 |
}
|
|
|
|
| 110 |
}
|
| 111 |
window.ANIM_PLAYBACK_RATE = (_saved && _saved.playbackRate) ? _saved.playbackRate : 1;
|
| 112 |
|
| 113 |
+
// --- Accordion open/close persistence (main view only; mega handled by animate-all.js) ---
|
| 114 |
+
window._animateAllActive = false;
|
| 115 |
+
if (_saved && _saved.accordionOpenMain === true) {
|
| 116 |
requestAnimationFrame(function() {
|
| 117 |
var acc = document.getElementById('anim-settings-accordion');
|
| 118 |
+
if (acc && !acc.classList.contains('open')) {
|
| 119 |
var btn = acc.querySelector(':scope > .label-wrap');
|
| 120 |
if (btn) btn.click();
|
| 121 |
}
|