Add Direct URL Anchors for Individual Models

#235
by appvoid - opened
Files changed (1) hide show
  1. index.html +19 -4
index.html CHANGED
@@ -2297,6 +2297,10 @@
2297
  return models.filter(m => !m.type);
2298
  }
2299
 
 
 
 
 
2300
  function getFilteredModels(models = MODELS, filter = activeFilter) {
2301
  let arr = getModelEntries(models);
2302
  if (filter === '<3M') arr = arr.filter(m => m.params && m.params < 3000000);
@@ -2632,7 +2636,7 @@ function getFilteredModels(models = MODELS, filter = activeFilter) {
2632
  const inCompare = compareSet.has(m.name);
2633
 
2634
  return `
2635
- <tr>
2636
  <td class="td-compare"><button class="compare-toggle ${inCompare ? 'active' : ''}" onclick="toggleCompare('${encodeURIComponent(m.name)}')" title="${inCompare ? 'Remove from comparison' : 'Add to comparison'}" aria-pressed="${inCompare}">${inCompare ? '−' : '+'}</button></td>
2637
  <td class="td-rank">${rank}</td>
2638
  <td class="td-model"><a class="${categoryLeaders.has(m.name) ? 'category-leader' : ''}" title="${getCategoryLeaderTitle(categoryLeaders.get(m.name))}" href="${m.links.card}" target="_blank">${m.name}</a>${cutoffTag}<span class="model-org"><a href="${org.url}" target="_blank">${org.name}</a> &middot; ${m.paramsDisplay}</span></td>
@@ -3306,10 +3310,11 @@ function getFilteredModels(models = MODELS, filter = activeFilter) {
3306
  const href = model.links && model.links.card ? model.links.card : '#';
3307
  const score = '<span class="filter-leader-score">' + escapeHtml(formatMetricValue(entry.score, metric, 2)) + '</span>';
3308
  const params = escapeHtml(model.paramsDisplay || model.params) + ' params';
 
3309
  const details = showSizeLabel
3310
  ? '<div class="highlight-leader-footer"><span class="filter-leader-meta"><span class="highlight-leader-org">' + escapeHtml(org.name) + '</span><span class="highlight-leader-params">' + params + '</span></span><div class="highlight-leader-score">' + score + '<span class="size-score-label">Int Index</span></div></div>'
3311
  : score + '<span class="filter-leader-meta">' + escapeHtml(org.name) + ' · ' + params + '</span>';
3312
- return '<article class="filter-leader-card' + (active ? ' active' : '') + '" role="button" tabindex="0" ' +
3313
  attribute + '="' + escapeHtml(value) + '" style="--leader-org-color:' + escapeHtml(orgColor) + '" aria-pressed="' + active + '" aria-label="' + escapeHtml(kicker + ': ' + model.name) + '">' +
3314
  '<span class="filter-leader-kicker"><span>' + escapeHtml(kicker) + '</span></span>' +
3315
  '<a class="filter-leader-name" href="' + escapeHtml(href) + '" target="_blank" rel="noopener noreferrer">' + escapeHtml(model.name) + '</a>' +
@@ -3370,9 +3375,19 @@ function getFilteredModels(models = MODELS, filter = activeFilter) {
3370
  if (filterBar) filterObserver.observe(filterBar, { childList: true });
3371
  });
3372
 
3373
- window.addEventListener('load', renderFilterLeaders);
 
 
 
 
 
 
 
 
 
 
3374
  renderFilterLeaders();
3375
  })();
3376
  </script>
3377
  </body>
3378
- </html>
 
2297
  return models.filter(m => !m.type);
2298
  }
2299
 
2300
+ function modelAnchorId(model) {
2301
+ return `${model.org}-${model.name}`.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
2302
+ }
2303
+
2304
  function getFilteredModels(models = MODELS, filter = activeFilter) {
2305
  let arr = getModelEntries(models);
2306
  if (filter === '<3M') arr = arr.filter(m => m.params && m.params < 3000000);
 
2636
  const inCompare = compareSet.has(m.name);
2637
 
2638
  return `
2639
+ <tr id="${modelAnchorId(m)}">
2640
  <td class="td-compare"><button class="compare-toggle ${inCompare ? 'active' : ''}" onclick="toggleCompare('${encodeURIComponent(m.name)}')" title="${inCompare ? 'Remove from comparison' : 'Add to comparison'}" aria-pressed="${inCompare}">${inCompare ? '−' : '+'}</button></td>
2641
  <td class="td-rank">${rank}</td>
2642
  <td class="td-model"><a class="${categoryLeaders.has(m.name) ? 'category-leader' : ''}" title="${getCategoryLeaderTitle(categoryLeaders.get(m.name))}" href="${m.links.card}" target="_blank">${m.name}</a>${cutoffTag}<span class="model-org"><a href="${org.url}" target="_blank">${org.name}</a> &middot; ${m.paramsDisplay}</span></td>
 
3310
  const href = model.links && model.links.card ? model.links.card : '#';
3311
  const score = '<span class="filter-leader-score">' + escapeHtml(formatMetricValue(entry.score, metric, 2)) + '</span>';
3312
  const params = escapeHtml(model.paramsDisplay || model.params) + ' params';
3313
+ const cardId = modelAnchorId(model) + '-' + (showSizeLabel ? 'highlight' : attribute === 'data-size-filter' ? 'size' : 'benchmark') + '-' + String(value).toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
3314
  const details = showSizeLabel
3315
  ? '<div class="highlight-leader-footer"><span class="filter-leader-meta"><span class="highlight-leader-org">' + escapeHtml(org.name) + '</span><span class="highlight-leader-params">' + params + '</span></span><div class="highlight-leader-score">' + score + '<span class="size-score-label">Int Index</span></div></div>'
3316
  : score + '<span class="filter-leader-meta">' + escapeHtml(org.name) + ' · ' + params + '</span>';
3317
+ return '<article class="filter-leader-card' + (active ? ' active' : '') + '" id="' + escapeHtml(cardId) + '" role="button" tabindex="0" ' +
3318
  attribute + '="' + escapeHtml(value) + '" style="--leader-org-color:' + escapeHtml(orgColor) + '" aria-pressed="' + active + '" aria-label="' + escapeHtml(kicker + ': ' + model.name) + '">' +
3319
  '<span class="filter-leader-kicker"><span>' + escapeHtml(kicker) + '</span></span>' +
3320
  '<a class="filter-leader-name" href="' + escapeHtml(href) + '" target="_blank" rel="noopener noreferrer">' + escapeHtml(model.name) + '</a>' +
 
3375
  if (filterBar) filterObserver.observe(filterBar, { childList: true });
3376
  });
3377
 
3378
+ function scrollToModelHash() {
3379
+ let id;
3380
+ try { id = decodeURIComponent(window.location.hash.slice(1)); } catch { return; }
3381
+ if (!id) return;
3382
+ const highlight = Array.from(document.querySelectorAll('#highlight-leader-grid .filter-leader-card[id]')).find(card => card.id.startsWith(id + '-highlight-'));
3383
+ const target = highlight || document.getElementById(id);
3384
+ if (target && (target.matches('.filter-leader-card') || target.matches('#leaderboard-body > tr'))) target.scrollIntoView({ block: 'center' });
3385
+ }
3386
+
3387
+ window.addEventListener('load', function () { renderFilterLeaders(); scrollToModelHash(); });
3388
+ window.addEventListener('hashchange', scrollToModelHash);
3389
  renderFilterLeaders();
3390
  })();
3391
  </script>
3392
  </body>
3393
+ </html>