priyadip commited on
Commit
4873c62
·
1 Parent(s): dc138e1

Fix: use <details>/<summary> for native toggle, no JS needed for cards

Browse files
Files changed (1) hide show
  1. app.py +23 -34
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
- <div class="calc-card cat-{cat}" data-idx="{i}">
115
- <div 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
- </div>
121
- <div class="calc-body" style="display:none">
122
  {formula_html}
123
  {note_html}
124
  <div class="matrix-wrap">{matrix_html}</div>
125
  </div>
126
- </div>""")
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-header { display: flex; align-items: center; gap: 8px; padding: 8px 12px; cursor: pointer; user-select: none; transition: background 0.15s; }
389
- .calc-header:hover { background: rgba(255,255,255,0.03); }
390
- .calc-body { padding: 10px 14px; background: var(--bg2); border-top: 1px solid var(--border); }
 
 
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.open { transform: rotate(90deg); }
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
- // Card toggle
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-body').forEach(b => b.style.display='block');
499
- document.querySelectorAll('.toggle-arrow').forEach(a => a.classList.add('open'));
500
  };
501
  window._collapseAll = function() {
502
- document.querySelectorAll('.calc-body').forEach(b => b.style.display='none');
503
- document.querySelectorAll('.toggle-arrow').forEach(a => a.classList.remove('open'));
504
  };
505
  window._filterCards = function(cat) {
506
- document.querySelectorAll('.calc-card').forEach(c => {
507
- c.style.display = (!cat || c.classList.contains('cat-'+cat)) ? '' : 'none';
508
  });
509
  };
510
- // Event delegation — works even if Gradio strips onclick attrs
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
- const a = btn.dataset.ga;
517
- if (a === 'expand') window._expandAll();
518
- else if (a === 'collapse') window._collapseAll();
519
- else if (a.startsWith('filter:')) window._filterCards(a.slice(7));
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