SummaryCards.svelte 1.5 KB

1234567891011121314151617181920212223242526272829303132333435
  1. <script>
  2. let { cards = [], onCardSelect = () => {}, selectedCardId = null } = $props();
  3. </script>
  4. <section class="space-y-3 transition-colors duration-200">
  5. <h2 class="text-sm font-bold tracking-wider text-slate-500 dark:text-slate-400 uppercase">
  6. Resumo Rápido
  7. </h2>
  8. <div class="grid grid-cols-2 gap-4 xl:grid-cols-4">
  9. {#each cards as card}
  10. <button
  11. type="button"
  12. class={`w-full rounded-xl border p-4 text-left shadow-sm transition-all duration-200 ${
  13. selectedCardId === card.id
  14. ? 'border-indigo-300 bg-indigo-50 dark:border-indigo-500/50 dark:bg-indigo-500/10 ring-1 ring-indigo-200 dark:ring-indigo-500/20'
  15. : 'border-slate-200 bg-white hover:border-slate-300 hover:bg-slate-50 dark:border-slate-800 dark:bg-[#1e293b] dark:hover:border-slate-700 dark:hover:bg-slate-800/80'
  16. }`}
  17. onclick={() => onCardSelect(card)}
  18. >
  19. <div class="flex items-start justify-between gap-3">
  20. <div>
  21. <p class="text-3xl leading-none font-extrabold text-slate-900 dark:text-white transition-colors">{card.value}</p>
  22. <p class="mt-2 text-xs font-semibold text-slate-500 dark:text-slate-400 transition-colors">{card.label}</p>
  23. </div>
  24. {#if card.image}
  25. <div class="h-10 w-10 shrink-0 rounded-lg border border-slate-200 dark:border-slate-700/50 bg-slate-50 dark:bg-slate-900/50 p-2 flex items-center justify-center transition-colors">
  26. <img src={card.image} alt={card.label} class="h-full w-full object-contain opacity-80 dark:opacity-100" />
  27. </div>
  28. {/if}
  29. </div>
  30. </button>
  31. {/each}
  32. </div>
  33. </section>