|
300 | 300 | brands.forEach(function(b) { if (b.count > maxBrandCount) maxBrandCount = b.count; }); |
301 | 301 |
|
302 | 302 | brands.forEach(function(brand, i) { |
303 | | - var barY = rightY + 35 + i * 38; |
| 303 | + var barY = rightY + 35 + i * 32; |
304 | 304 | var barMaxW = 380; |
305 | 305 | var barW = Math.max(40, (brand.count / maxBrandCount) * barMaxW); |
306 | 306 | var barH = 26; |
|
332 | 332 | }); |
333 | 333 |
|
334 | 334 | // "Categories" section below brands. |
335 | | - var catY = rightY + 35 + Math.max(brands.length, 1) * 38 + 25; |
| 335 | + var catY = rightY + 35 + Math.max(brands.length, 1) * 32 + 20; |
336 | 336 | ctx.fillStyle = colors.textHeading; |
337 | 337 | ctx.font = 'bold 18px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'; |
338 | 338 | ctx.textBaseline = 'top'; |
339 | 339 | ctx.fillText('Categories', rightX, catY); |
340 | 340 |
|
341 | 341 | var cats = (data.categories || []).slice(0, 4); |
342 | | - var catStartY = catY + 32; |
| 342 | + var catStartY = catY + 28; |
| 343 | + var catMaxRow = 0; |
343 | 344 | cats.forEach(function(cat, i) { |
344 | 345 | var chipX = rightX + i * 130; |
345 | 346 | // Wrap to second row if needed. |
346 | 347 | var row = 0; |
347 | 348 | if (i >= 3) { row = 1; chipX = rightX + (i - 3) * 130; } |
| 349 | + if (row > catMaxRow) catMaxRow = row; |
348 | 350 |
|
349 | | - var tagY = catStartY + row * 36; |
| 351 | + var tagY = catStartY + row * 34; |
350 | 352 | var tagText = cat.name + ' (' + cat.count + ')'; |
351 | 353 |
|
352 | 354 | // Pill background. |
|
365 | 367 | }); |
366 | 368 |
|
367 | 369 | // --- Top rated tire callout --- |
| 370 | + // Position dynamically below both the left stat cards and right categories. |
| 371 | + var leftBottom = gridStartY + 2 * (cardH + cardGap) - cardGap; |
| 372 | + var rightBottom = cats.length > 0 ? catStartY + catMaxRow * 34 + 26 : catY + 18; |
| 373 | + var contentBottom = Math.max(leftBottom, rightBottom); |
| 374 | + |
368 | 375 | if (data.topTire) { |
369 | | - var calloutY = 440; |
| 376 | + var calloutY = contentBottom + 15; |
370 | 377 | roundRect(ctx, 60, calloutY, W - 120, 60, 10); |
371 | 378 | ctx.fillStyle = colors.bgCard; |
372 | 379 | ctx.fill(); |
|
0 commit comments