Spaces:
Sleeping
Sleeping
priyadip commited on
Commit ·
4873c62
1
Parent(s): dc138e1
Fix: use <details>/<summary> for native toggle, no JS needed for cards
Browse files
app.py
CHANGED
|
@@ -111,19 +111,19 @@ def calc_log_to_html(steps):
|
|
| 111 |
elif "MASK" in n: cat = "mask"
|
| 112 |
|
| 113 |
cards.append(f"""
|
| 114 |
-
<
|
| 115 |
-
<
|
| 116 |
<span class="step-num">#{i+1}</span>
|
| 117 |
<span class="step-name cat-label-{cat}">{name.replace('_',' ')}</span>
|
| 118 |
{shape_badge}
|
| 119 |
<span class="toggle-arrow">▶</span>
|
| 120 |
-
</
|
| 121 |
-
<div class="calc-body"
|
| 122 |
{formula_html}
|
| 123 |
{note_html}
|
| 124 |
<div class="matrix-wrap">{matrix_html}</div>
|
| 125 |
</div>
|
| 126 |
-
</
|
| 127 |
|
| 128 |
return "\n".join(cards)
|
| 129 |
|
|
@@ -384,14 +384,16 @@ button.primary { background: linear-gradient(135deg, #0d3d30, #0d3d4d) !importan
|
|
| 384 |
button.primary:hover { background: linear-gradient(135deg, #1a5c4a, #1a5c6d) !important; box-shadow: 0 0 12px rgba(100,255,218,0.3) !important; }
|
| 385 |
|
| 386 |
/* ── calc cards ── */
|
| 387 |
-
.calc-card { border-radius: 8px; margin: 4px 0; border: 1px solid var(--border); background: var(--card); overflow: hidden; }
|
| 388 |
-
.calc-
|
| 389 |
-
.calc-
|
| 390 |
-
.calc-
|
|
|
|
|
|
|
| 391 |
.step-num { color: var(--muted); font-size: 11px; min-width: 28px; }
|
| 392 |
.step-name { font-weight: 600; font-size: 12px; flex: 1; }
|
| 393 |
.toggle-arrow { color: var(--muted); font-size: 10px; transition: transform 0.2s; }
|
| 394 |
-
.toggle-arrow
|
| 395 |
.shape-badge { background: var(--bg3); color: var(--muted); font-size: 10px; padding: 1px 6px; border-radius: 4px; border: 1px solid var(--border); }
|
| 396 |
.formula { color: var(--accent); font-size: 11px; font-style: italic; margin-bottom: 4px; background: rgba(100,255,218,0.05); padding: 4px 8px; border-radius: 4px; border-left: 2px solid var(--accent); }
|
| 397 |
.step-note { color: var(--muted); font-size: 11px; margin-bottom: 6px; }
|
|
@@ -485,39 +487,26 @@ button.primary:hover { background: linear-gradient(135deg, #1a5c4a, #1a5c6d) !im
|
|
| 485 |
"""
|
| 486 |
|
| 487 |
CUSTOM_JS = """
|
| 488 |
-
//
|
| 489 |
-
window._toggleCard = function(header) {
|
| 490 |
-
const body = header.nextElementSibling;
|
| 491 |
-
const arrow = header.querySelector('.toggle-arrow');
|
| 492 |
-
if (!body) return;
|
| 493 |
-
const open = body.style.display === 'block';
|
| 494 |
-
body.style.display = open ? 'none' : 'block';
|
| 495 |
-
if (arrow) arrow.classList.toggle('open', !open);
|
| 496 |
-
};
|
| 497 |
window._expandAll = function() {
|
| 498 |
-
document.querySelectorAll('.calc-
|
| 499 |
-
document.querySelectorAll('.toggle-arrow').forEach(a => a.classList.add('open'));
|
| 500 |
};
|
| 501 |
window._collapseAll = function() {
|
| 502 |
-
document.querySelectorAll('.calc-
|
| 503 |
-
document.querySelectorAll('.toggle-arrow').forEach(a => a.classList.remove('open'));
|
| 504 |
};
|
| 505 |
window._filterCards = function(cat) {
|
| 506 |
-
document.querySelectorAll('.calc-card').forEach(
|
| 507 |
-
|
| 508 |
});
|
| 509 |
};
|
| 510 |
-
//
|
| 511 |
document.addEventListener('click', function(e) {
|
| 512 |
-
const header = e.target.closest('.calc-header');
|
| 513 |
-
if (header) { window._toggleCard(header); return; }
|
| 514 |
const btn = e.target.closest('[data-ga]');
|
| 515 |
-
if (btn)
|
| 516 |
-
|
| 517 |
-
|
| 518 |
-
|
| 519 |
-
|
| 520 |
-
}
|
| 521 |
}, true);
|
| 522 |
"""
|
| 523 |
|
|
|
|
| 111 |
elif "MASK" in n: cat = "mask"
|
| 112 |
|
| 113 |
cards.append(f"""
|
| 114 |
+
<details class="calc-card cat-{cat}" data-idx="{i}">
|
| 115 |
+
<summary class="calc-header">
|
| 116 |
<span class="step-num">#{i+1}</span>
|
| 117 |
<span class="step-name cat-label-{cat}">{name.replace('_',' ')}</span>
|
| 118 |
{shape_badge}
|
| 119 |
<span class="toggle-arrow">▶</span>
|
| 120 |
+
</summary>
|
| 121 |
+
<div class="calc-body">
|
| 122 |
{formula_html}
|
| 123 |
{note_html}
|
| 124 |
<div class="matrix-wrap">{matrix_html}</div>
|
| 125 |
</div>
|
| 126 |
+
</details>""")
|
| 127 |
|
| 128 |
return "\n".join(cards)
|
| 129 |
|
|
|
|
| 384 |
button.primary:hover { background: linear-gradient(135deg, #1a5c4a, #1a5c6d) !important; box-shadow: 0 0 12px rgba(100,255,218,0.3) !important; }
|
| 385 |
|
| 386 |
/* ── calc cards ── */
|
| 387 |
+
details.calc-card { border-radius: 8px; margin: 4px 0; border: 1px solid var(--border); background: var(--card); overflow: hidden; }
|
| 388 |
+
details.calc-card > summary { display: flex; align-items: center; gap: 8px; padding: 8px 12px; cursor: pointer; user-select: none; list-style: none; transition: background 0.15s; }
|
| 389 |
+
details.calc-card > summary::-webkit-details-marker { display: none; }
|
| 390 |
+
details.calc-card > summary::marker { display: none; }
|
| 391 |
+
details.calc-card > summary:hover { background: rgba(255,255,255,0.03); }
|
| 392 |
+
details.calc-card > .calc-body { padding: 10px 14px; background: var(--bg2); border-top: 1px solid var(--border); }
|
| 393 |
.step-num { color: var(--muted); font-size: 11px; min-width: 28px; }
|
| 394 |
.step-name { font-weight: 600; font-size: 12px; flex: 1; }
|
| 395 |
.toggle-arrow { color: var(--muted); font-size: 10px; transition: transform 0.2s; }
|
| 396 |
+
details[open] .toggle-arrow { transform: rotate(90deg); }
|
| 397 |
.shape-badge { background: var(--bg3); color: var(--muted); font-size: 10px; padding: 1px 6px; border-radius: 4px; border: 1px solid var(--border); }
|
| 398 |
.formula { color: var(--accent); font-size: 11px; font-style: italic; margin-bottom: 4px; background: rgba(100,255,218,0.05); padding: 4px 8px; border-radius: 4px; border-left: 2px solid var(--accent); }
|
| 399 |
.step-note { color: var(--muted); font-size: 11px; margin-bottom: 6px; }
|
|
|
|
| 487 |
"""
|
| 488 |
|
| 489 |
CUSTOM_JS = """
|
| 490 |
+
// <details> elements toggle natively — JS only needed for expand-all/collapse-all/filter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 491 |
window._expandAll = function() {
|
| 492 |
+
document.querySelectorAll('details.calc-card').forEach(d => d.open = true);
|
|
|
|
| 493 |
};
|
| 494 |
window._collapseAll = function() {
|
| 495 |
+
document.querySelectorAll('details.calc-card').forEach(d => d.open = false);
|
|
|
|
| 496 |
};
|
| 497 |
window._filterCards = function(cat) {
|
| 498 |
+
document.querySelectorAll('details.calc-card').forEach(d => {
|
| 499 |
+
d.style.display = (!cat || d.classList.contains('cat-'+cat)) ? '' : 'none';
|
| 500 |
});
|
| 501 |
};
|
| 502 |
+
// Toolbar button delegation
|
| 503 |
document.addEventListener('click', function(e) {
|
|
|
|
|
|
|
| 504 |
const btn = e.target.closest('[data-ga]');
|
| 505 |
+
if (!btn) return;
|
| 506 |
+
const a = btn.dataset.ga;
|
| 507 |
+
if (a === 'expand') window._expandAll();
|
| 508 |
+
else if (a === 'collapse') window._collapseAll();
|
| 509 |
+
else if (a.startsWith('filter:')) window._filterCards(a.slice(7));
|
|
|
|
| 510 |
}, true);
|
| 511 |
"""
|
| 512 |
|