Add conversion-rate tooltips to category calculator cards

This commit is contained in:
Codex Agent
2026-03-09 18:36:47 +00:00
parent 5651ecb6d4
commit 66d02c7f14
4 changed files with 53 additions and 2 deletions

View File

@@ -674,6 +674,7 @@ a:focus-visible {
}
.calc-list-item {
display: block;
position: relative;
padding: 1rem 1.25rem;
background: var(--card-bg);
border: 1px solid var(--border);
@@ -695,6 +696,32 @@ a:focus-visible {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-glow);
}
.calc-list-tooltip {
position: absolute;
bottom: calc(100% + 0.4rem);
left: 50%;
background: var(--section-bg);
color: var(--text);
border: 1px solid var(--border);
border-radius: 6px;
padding: 0.35rem 0.55rem;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.02em;
pointer-events: none;
opacity: 0;
visibility: hidden;
transform: translate(-50%, 0.2rem);
transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
white-space: nowrap;
z-index: 2;
}
.calc-list-item:hover .calc-list-tooltip,
.calc-list-item:focus-visible .calc-list-tooltip {
opacity: 1;
visibility: visible;
transform: translate(-50%, 0);
}
/* ─── Related Converters ─────────────────────────────────── */

View File

@@ -4,6 +4,7 @@
import { page } from '$app/stores';
import { onDestroy, onMount } from 'svelte';
import { browser } from '$app/environment';
import { getConversionRateText } from '$lib/utils/conversionRate';
import QuickDefinitionCard from '$lib/components/QuickDefinitionCard.svelte';
import QuickConversionExample from '$lib/components/QuickConversionExample.svelte';
import QuickConversionTable from '$lib/components/QuickConversionTable.svelte';
@@ -27,9 +28,11 @@
let tooltipX = 20;
let copyStatusMessage = '';
let initializedSlug: string | null = null;
let conversionRateText: string | null = null;
$: has3 = ['3col', '3col-mul'].includes(config.type) || !!config.labels.in3;
$: isTextInput = ['base', 'text-bin', 'bin-text', 'dec-frac', 'dms-dd', 'dd-dms'].includes(config.type);
$: conversionRateText = getConversionRateText(config);
// Clear inputs only when navigating to a different calculator slug.
$: if (config?.slug) {
@@ -337,9 +340,9 @@
{copyStatusMessage}
</span>
</div>
{#if config.factor && config.type === 'standard'}
{#if conversionRateText}
<span class="formula-hint">
1 {config.labels.in1} = {config.factor}{config.offset ? ` + ${config.offset}` : ''} {config.labels.in2}
{conversionRateText}
</span>
{/if}
</div>

View File

@@ -0,0 +1,16 @@
import type { CalculatorDef } from '$lib/data/calculators';
type RateConfig = Pick<CalculatorDef, 'type' | 'factor' | 'offset' | 'labels'>;
export const getConversionRateText = (config: RateConfig): string | null => {
if (config.type !== 'standard' || !config.factor) {
return null;
}
const { in1, in2 } = config.labels;
if (!in1 || !in2) {
return null;
}
return `1 ${in1} = ${config.factor}${config.offset ? ` + ${config.offset}` : ''} ${in2}`;
};

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import type { PageData } from './$types';
import { buildSeoMeta, canonicalUrl, SITE_NAME, SITE_URL, toJsonLd } from '$lib/seo';
import { getConversionRateText } from '$lib/utils/conversionRate';
export let data: PageData;
@@ -85,8 +86,12 @@
<div class="calc-list">
{#each data.calculators as calc}
{@const conversionRateText = getConversionRateText(calc)}
<a href="/{calc.slug}" class="calc-list-item">
{calc.name}
{#if conversionRateText}
<span class="calc-list-tooltip" role="tooltip">{conversionRateText}</span>
{/if}
</a>
{/each}
</div>