From 20b8196d2d9133fe825cdceae2dd7eed7e25931f Mon Sep 17 00:00:00 2001 From: sercanvr Date: Sat, 17 Oct 2026 06:25:15 +0300 Subject: [PATCH 1/6] refactor(mobile): convert isolated cards to unified fintech table rows --- src/components/CardSkeleton.tsx | 2 +- src/components/TechTable.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/CardSkeleton.tsx b/src/components/CardSkeleton.tsx index b348e2d..5ca33e4 100644 --- a/src/components/CardSkeleton.tsx +++ b/src/components/CardSkeleton.tsx @@ -8,7 +8,7 @@ export interface CardSkeletonProps { export const CardSkeleton: React.FC = ({ className = '' }) => { return (
= ({ ))}
) : ( -
+
{[1, 2].map((idx) => ( ))} @@ -327,7 +327,7 @@ export const TechTable: React.FC = ({
) : ( -
+
{processedEntries.map((entry, index) => ( ))} @@ -723,7 +723,7 @@ const MobileCard: React.FC = ({ entry, maxStars }) => { return (
{/* Top: Blurred Icon Container + Name */}
From 085785a019c88eded9644cfad447e72d21743571 Mon Sep 17 00:00:00 2001 From: sercanvr Date: Sat, 17 Oct 2026 06:39:40 +0300 Subject: [PATCH 2/6] style(mobile): enhance table row divider line contrast --- src/components/TechTable.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/TechTable.tsx b/src/components/TechTable.tsx index ad806c8..d25c92d 100644 --- a/src/components/TechTable.tsx +++ b/src/components/TechTable.tsx @@ -297,7 +297,7 @@ export const TechTable: React.FC = ({ ))}
) : ( -
+
{[1, 2].map((idx) => ( ))} @@ -327,7 +327,7 @@ export const TechTable: React.FC = ({
) : ( -
+
{processedEntries.map((entry, index) => ( ))} From 2f4efea5efa1fc04320ce9f0e4669a2f643bba71 Mon Sep 17 00:00:00 2001 From: sercanvr Date: Sat, 17 Oct 2026 06:58:31 +0300 Subject: [PATCH 3/6] fix(responsive): optimize proximity sidebar and table headers for laptop resolution --- src/components/ProximitySidebar.tsx | 20 ++++++++++---------- src/components/TechTable.tsx | 20 ++++++++++---------- src/i18n/de.json | 2 +- src/i18n/en.json | 2 +- src/i18n/es.json | 2 +- src/i18n/fr.json | 2 +- src/i18n/it.json | 2 +- src/i18n/pt.json | 2 +- src/i18n/ru.json | 2 +- src/i18n/tr.json | 2 +- src/i18n/zh.json | 2 +- 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/components/ProximitySidebar.tsx b/src/components/ProximitySidebar.tsx index 914dd9b..060ae16 100644 --- a/src/components/ProximitySidebar.tsx +++ b/src/components/ProximitySidebar.tsx @@ -82,7 +82,7 @@ export const ProximitySidebar: React.FC = ({ return (
{Array.from({ length: totalDashes }).map((_, index) => { @@ -92,24 +92,24 @@ export const ProximitySidebar: React.FC = ({ const distance = Math.abs(index - activeDashCenter); const isHovered = hoveredIndex === index; - let widthClass = 'w-6 bg-neutral-300/80 dark:bg-neutral-700/80'; + let widthClass = 'w-3 xl:w-4 2xl:w-6 bg-neutral-300/80 dark:bg-neutral-700/80'; let glowClass = ''; if (isHovered) { - widthClass = 'w-16 bg-neutral-900 dark:bg-white'; + widthClass = 'w-8 xl:w-10 2xl:w-16 bg-neutral-900 dark:bg-white'; glowClass = 'shadow-sm dark:shadow-[0_0_5px_rgba(255,255,255,0.3)]'; } else if (distance === 0) { - widthClass = 'w-16 bg-[#3f6e00] dark:bg-[#CEFF00]'; + widthClass = 'w-7 xl:w-9 2xl:w-16 bg-[#3f6e00] dark:bg-[#CEFF00]'; glowClass = 'shadow-[0_0_4px_rgba(63,110,0,0.25)] dark:shadow-[0_0_4px_rgba(206,255,0,0.35)]'; } else if (distance === 1) { - widthClass = 'w-12 bg-[#3f6e00]/85 dark:bg-[#CEFF00]/80'; + widthClass = 'w-5 xl:w-7 2xl:w-12 bg-[#3f6e00]/85 dark:bg-[#CEFF00]/80'; glowClass = 'dark:shadow-[0_0_2px_rgba(206,255,0,0.2)]'; } else if (distance === 2) { - widthClass = 'w-10 bg-[#3f6e00]/55 dark:bg-[#CEFF00]/50'; + widthClass = 'w-4 xl:w-5 2xl:w-10 bg-[#3f6e00]/55 dark:bg-[#CEFF00]/50'; } else if (distance === 3) { - widthClass = 'w-8 bg-[#3f6e00]/30 dark:bg-[#CEFF00]/25'; + widthClass = 'w-3.5 xl:w-4 2xl:w-8 bg-[#3f6e00]/30 dark:bg-[#CEFF00]/25'; } else if (isTitle) { - widthClass = 'w-9 bg-neutral-400 dark:bg-neutral-500'; + widthClass = 'w-4 xl:w-5 2xl:w-9 bg-neutral-400 dark:bg-neutral-500'; } return ( @@ -118,7 +118,7 @@ export const ProximitySidebar: React.FC = ({ onClick={() => scrollToDash(index, section.id, isTitle)} onMouseEnter={() => setHoveredIndex(index)} onMouseLeave={() => setHoveredIndex(null)} - className="group relative flex items-center justify-start w-20 py-0.5 sm:py-1 cursor-pointer focus:outline-none" + className="group relative flex items-center justify-start w-9 xl:w-11 2xl:w-20 py-0.5 sm:py-1 cursor-pointer focus:outline-none" aria-label={isTitle ? section.label : undefined} >
= ({ {/* Tooltip for Section Title Bars or Hovered Dash */} {isHovered && isTitle && ( - + {section.label} )} diff --git a/src/components/TechTable.tsx b/src/components/TechTable.tsx index d25c92d..fce0676 100644 --- a/src/components/TechTable.tsx +++ b/src/components/TechTable.tsx @@ -307,16 +307,16 @@ export const TechTable: React.FC = ({
- - - - - - - - - - + + + + + + + + + + diff --git a/src/i18n/de.json b/src/i18n/de.json index 3d18702..b68b0a3 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -69,7 +69,7 @@ "latestVersion": "AKTUELLE VERSION", "community": "COMMUNITY", "ecosystem": "ÖKOSYSTEM-VOLUMEN", - "github": "GITHUB", + "github": "REPO", "sortAria": "Sortierkriterium", "sortName": "Name (A-Z)", "sortStars": "Meiste Sterne", diff --git a/src/i18n/en.json b/src/i18n/en.json index 2b0b48b..707e2dd 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -70,7 +70,7 @@ "latestVersion": "LATEST VERSION", "community": "COMMUNITY", "ecosystem": "ECOSYSTEM VOLUME", - "github": "GITHUB", + "github": "REPO", "sortAria": "Sort Criteria", "sortName": "Name (A-Z)", "sortStars": "Most Stars", diff --git a/src/i18n/es.json b/src/i18n/es.json index 9e2c122..c390695 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -69,7 +69,7 @@ "latestVersion": "ÚLTIMA VERSIÓN", "community": "COMUNIDAD", "ecosystem": "VOLUMEN DEL ECOSISTEMA", - "github": "GITHUB", + "github": "REPO", "sortAria": "Criterios de ordenación", "sortName": "Nombre (A-Z)", "sortStars": "Más estrellas", diff --git a/src/i18n/fr.json b/src/i18n/fr.json index f5c58e1..0057418 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -69,7 +69,7 @@ "latestVersion": "DERNIÈRE VERSION", "community": "COMMUNAUTÉ", "ecosystem": "VOLUME DE L'ÉCOSYSTÈME", - "github": "GITHUB", + "github": "REPO", "sortAria": "Critères de tri", "sortName": "Nom (A-Z)", "sortStars": "Plus d'étoiles", diff --git a/src/i18n/it.json b/src/i18n/it.json index 061f6d5..afc0b3b 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -69,7 +69,7 @@ "latestVersion": "ULTIMA VERSIONE", "community": "COMMUNITY", "ecosystem": "VOLUME ECOSISTEMA", - "github": "GITHUB", + "github": "REPO", "sortAria": "Criteri di ordinamento", "sortName": "Nome (A-Z)", "sortStars": "Più stelle", diff --git a/src/i18n/pt.json b/src/i18n/pt.json index 0c05046..936f675 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -69,7 +69,7 @@ "latestVersion": "ÚLTIMA VERSÃO", "community": "COMUNIDADE", "ecosystem": "VOLUME DO ECOSSISTEMA", - "github": "GITHUB", + "github": "REPO", "sortAria": "Critérios de Ordenação", "sortName": "Nome (A-Z)", "sortStars": "Mais Estrelas", diff --git a/src/i18n/ru.json b/src/i18n/ru.json index e80817f..9c174b1 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -69,7 +69,7 @@ "latestVersion": "ПОСЛЕДНЯЯ ВЕРСИЯ", "community": "СООБЩЕСТВО", "ecosystem": "ОБЪЕМ ЭКОСИСТЕМЫ", - "github": "GITHUB", + "github": "REPO", "sortAria": "Критерии сортировки", "sortName": "Имя (А-Я / A-Z)", "sortStars": "Больше звезд", diff --git a/src/i18n/tr.json b/src/i18n/tr.json index 2e885ee..91d6f32 100644 --- a/src/i18n/tr.json +++ b/src/i18n/tr.json @@ -70,7 +70,7 @@ "latestVersion": "GÜNCEL SÜRÜM", "community": "TOPLULUK", "ecosystem": "EKOSİSTEM HACMİ", - "github": "GİTHUB", + "github": "REPO", "sortAria": "Sıralama Ölçütü", "sortName": "İsim (A-Z)", "sortStars": "En Çok Yıldız", diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 54a5ce1..700b454 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -69,7 +69,7 @@ "latestVersion": "最新版本", "community": "社区", "ecosystem": "生态总量", - "github": "GITHUB", + "github": "REPO", "sortAria": "排序标准", "sortName": "名称 (A-Z)", "sortStars": "星标最多", From 2aa4a37813387ff3524b693373581178e0d5c028 Mon Sep 17 00:00:00 2001 From: sercanvr Date: Sat, 17 Oct 2026 07:09:51 +0300 Subject: [PATCH 4/6] feat(popularity): apply square root scaling to popularity progress bars --- src/components/TechBar.tsx | 3 ++- src/components/TechTable.tsx | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/TechBar.tsx b/src/components/TechBar.tsx index 6a91c50..7f4b077 100644 --- a/src/components/TechBar.tsx +++ b/src/components/TechBar.tsx @@ -24,9 +24,10 @@ export const TechBar: React.FC = ({ entry, maxStars }) => { const cleanVersion = entry.creator && entry.creator.latestVersion ? sanitizeText(entry.creator.latestVersion) : ''; const liveVersion = useGitHubRelease(entry.githubUrl, cleanVersion); + const rawRatio = Math.max(0, entry.popularity.totalStars) / (maxStars || 1); const starPercentage = Math.min( 100, - Math.max(8, (entry.popularity.totalStars / (maxStars || 1)) * 100) + Math.max(8, Math.round(Math.sqrt(rawRatio) * 1000) / 10) ); const formattedStars = formatNumber(entry.popularity.totalStars, i18n.language); diff --git a/src/components/TechTable.tsx b/src/components/TechTable.tsx index fce0676..a106832 100644 --- a/src/components/TechTable.tsx +++ b/src/components/TechTable.tsx @@ -368,9 +368,10 @@ const TableRow: React.FC = ({ entry, maxStars }) => { const isHostedOnGitHub = isGitHubRepo(entry.githubUrl); + const rawRatio = Math.max(0, entry.popularity.totalStars) / (maxStars || 1); const percentage = Math.min( 100, - Math.max(5, (entry.popularity.totalStars / (maxStars || 1)) * 100) + Math.max(5, Math.round(Math.sqrt(rawRatio) * 1000) / 10) ); const formattedStars = formatNumber(entry.popularity.totalStars, i18n.language); const formattedNewRepos = formatNumber(entry.momentum.newReposLast30Days, i18n.language); @@ -712,9 +713,10 @@ const MobileCard: React.FC = ({ entry, maxStars }) => { const isHostedOnGitHub = isGitHubRepo(entry.githubUrl); + const rawRatio = Math.max(0, entry.popularity.totalStars) / (maxStars || 1); const percentage = Math.min( 100, - Math.max(5, (entry.popularity.totalStars / (maxStars || 1)) * 100) + Math.max(5, Math.round(Math.sqrt(rawRatio) * 1000) / 10) ); const formattedStars = formatNumber(entry.popularity.totalStars, i18n.language); const formattedNewRepos = formatNumber(entry.momentum.newReposLast30Days, i18n.language); From 7ffbaac34fdd6ea8afa5004d7013cb4af797718f Mon Sep 17 00:00:00 2001 From: sercanvr Date: Sat, 17 Oct 2026 07:34:40 +0300 Subject: [PATCH 5/6] style(dropdown): add container padding and rounded inset buttons to dropdown menus --- src/components/LanguageSwitcher.tsx | 10 +++++----- src/components/TechTable.tsx | 6 +++--- src/components/ThemeToggle.tsx | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/LanguageSwitcher.tsx b/src/components/LanguageSwitcher.tsx index 32a124f..aca59de 100644 --- a/src/components/LanguageSwitcher.tsx +++ b/src/components/LanguageSwitcher.tsx @@ -91,14 +91,14 @@ export const LanguageSwitcher: React.FC = ({ {isOpen && ( -
+
{languages.map((lang) => { const isActive = i18n.language.startsWith(lang.code); return ( {isOpen && ( -
+
{options.map((opt) => { const isSelected = opt.value === value; return ( @@ -92,9 +92,9 @@ const CustomDropdown: React.FC<{ onChange(opt.value); setIsOpen(false); }} - className={`w-full flex items-center justify-between px-3.5 py-2 text-xs transition-colors cursor-pointer ${ + className={`w-full flex items-center justify-between px-3 py-2 rounded-xl text-xs transition-colors cursor-pointer ${ isSelected - ? 'bg-[#CEFF00]/10 text-foreground font-bold' + ? 'bg-[#CEFF00]/15 dark:bg-[#CEFF00]/15 text-foreground font-bold' : 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800/80 hover:text-foreground' }`} > diff --git a/src/components/ThemeToggle.tsx b/src/components/ThemeToggle.tsx index af5ce14..d87bd6b 100644 --- a/src/components/ThemeToggle.tsx +++ b/src/components/ThemeToggle.tsx @@ -57,10 +57,10 @@ export const ThemeToggle: React.FC = ({ {isOpen && ( -
+
{isOpen && ( -
+
{languages.map((lang) => { const isActive = i18n.language.startsWith(lang.code); return (
{t('table.technology')}{t('table.creator')}{t('table.type')}{t('table.popularity')}{t('table.momentum')}{t('table.ecosystem')}{t('table.community')}{t('table.latestVersion')}{t('table.github')}
{t('table.technology')}{t('table.creator')}{t('table.type')}{t('table.popularity')}{t('table.momentum')}{t('table.ecosystem')}{t('table.community')}{t('table.latestVersion')}{t('table.github')}