@@ -204,7 +204,7 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
204204 </ div >
205205
206206 < div className = "w-full rounded border border-white/10 bg-black/40 p-4 shadow-2xl sm:p-2" >
207- < div className = "grid grid-cols-1 gap-2 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4" >
207+ < div className = "grid grid-cols-1 justify-items-center gap-x-8 gap-y-10 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4" >
208208 { memoizedAggregatedData . map ( ( card ) => {
209209 if ( ! card ) return null ;
210210
@@ -282,14 +282,14 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
282282 return (
283283 < div
284284 key = { card . _id }
285- className = "group relative flex flex-wrap mx-auto sm:w-fit lg:w -full min-h-96 h -full flex-col rounded border border-white/10 bg-black/30 transition hover:border-indigo-400/50 "
285+ className = "group relative mx-auto flex h -full min-h-96 w -full max-w-[16rem] flex-col rounded-[6px] transition"
286286 >
287- < div className = "rounded relative mx-auto w-full max-w-[24rem ] [perspective:1250px ]" >
287+ < div className = "relative mx-auto w-full max-w-[16rem ] [perspective:1500px ]" >
288288 < div
289- className = { `grid w-full transition-transform duration-[800ms] [transform-style:preserve-3d] will-change-transform ${ isFlipped ? "[transform:rotateY(180deg)]" : "" } ` }
289+ className = { `grid w-full transition-transform duration-[800ms] [transform-style:preserve-3d] [transition-timing-function:cubic-bezier(0.75,0,0.85,1)] ${ isFlipped ? "[transform:rotateY(180deg)]" : "" } ` }
290290 >
291291 < div
292- className = "col-start-1 row-start-1 flex w-full flex-col rounded [backface-visibility:hidden]"
292+ className = "col-start-1 row-start-1 flex w-full flex-col overflow-hidden rounded-[6px] shadow-lg [backface-visibility:hidden] [transform-style:preserve-3d ]"
293293 role = "button"
294294 tabIndex = { 0 }
295295 aria-pressed = { isFlipped }
@@ -301,22 +301,26 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
301301 }
302302 } }
303303 >
304- < div className = "relative flex max-h-[31rem ] h-full w-full items-center justify-center overflow-hidden rounded border border-white/10 bg-black/40 shadow-lg transition duration-200 group-hover:border-indigo-400/60 dark:border-white/20 dark:bg-gray-900/60" >
304+ < div className = "relative flex aspect-[260/360 ] h-full max-h-[31rem] w-full items-center justify-center overflow-hidden rounded-[6px] border border-white/10 bg-black/40 transition duration-300 group-hover:border-indigo-400/60 dark:border-white/20 dark:bg-gray-900/60" >
305305 < img
306306 className = "mx-auto h-full w-full object-top object-cover"
307307 src = { imageSrc }
308308 alt = { `Card Image - ${ card . productName } ` }
309309 loading = "lazy"
310310 />
311+ < div
312+ aria-hidden = "true"
313+ className = "absolute -inset-px rounded-[6px] bg-gradient-to-t from-black/90 via-black/45 to-black/25 opacity-95 transition-opacity duration-300 group-hover:opacity-100"
314+ />
311315 { ( formatCurrency ( card . marketPrice ) || card . rarity || card . printing ) && (
312- < div className = "pointer-events-none absolute inset-x-0 top-0 flex h-full items-end justify-start overflow-hidden rounded" >
316+ < div className = "pointer-events-none absolute inset-0 flex h-full items-end justify-start overflow-hidden rounded-[6px] [transform:translateZ(80px)] " >
313317 < div
314318 aria-hidden = "true"
315- className = "absolute inset-x-0 bottom-0 min-h-[24rem] bg-gradient-to-t from-black/80 via-black/30 to-transparent opacity-90"
319+ className = "absolute inset-0 bg-gradient-to-t from-black/90 via-black/35 to-transparent opacity-90"
316320 />
317321
318- < div className = "relative flex flex-col gap-1 p-2 text-white text-shadow glass w-full bg-transparent " >
319- < h3 className = "text-lg font-semibold text-pretty break-words" > { card . productName } </ h3 >
322+ < div className = "relative flex w-full flex-col gap-1 p-4 text-left text-white text-shadow " >
323+ < h3 className = "line-clamp-3 text-base font-semibold leading-tight text-pretty break-words" > { card . productName } </ h3 >
320324 { formatCurrency ( card . marketPrice ) && (
321325 < div className = "flex flex-wrap items-center justify-between gap-2" >
322326 < p className = "text-lg font-semibold" > { formatCurrency ( card . marketPrice ) } </ p >
@@ -330,47 +334,54 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
330334 < p className = "text-xs font-medium uppercase tracking-wide" >
331335 { [ card . rarity , card . printing ] . filter ( Boolean ) . join ( " • " ) }
332336 </ p >
337+ < span className = "mt-2 inline-flex min-h-10 w-fit min-w-10 items-center justify-center rounded-[4px] border border-white/35 bg-black/35 px-4 py-2 text-center text-xs font-semibold uppercase leading-tight tracking-[0.08em] text-white shadow-[0_0_6px_rgba(0,0,0,0.3)]" >
338+ Details
339+ </ span >
333340 </ div >
334341 </ div >
335342 ) }
336343 </ div >
337344 </ div >
338- < div className = "col-start-1 row-start-1 flex w-full flex-col justify-between gap-3 rounded border border-white/10 bg-black p-4 text-white shadow-lg dark:border-white/20 dark:bg-gray-900/80 [backface-visibility:hidden] [transform:rotateY(180deg)]" >
339- < div className = "space-y-3" >
340- < h3 className = "text-lg font-semibold text-center text-pretty break-words" > { card . productName } </ h3 >
341- < div className = "space-y-1 text-xs text-white/70 sm:text-sm" >
345+ < div className = "col-start-1 row-start-1 flex aspect-[260/360] min-h-0 w-full flex-col overflow-hidden rounded-[6px] border border-white/10 bg-black p-5 text-white shadow-lg dark:border-white/20 dark:bg-gray-900/80 [backface-visibility:hidden] [transform:rotateY(180deg)] [transform-style:preserve-3d]" >
346+ < div className = "flex h-full min-h-0 flex-col justify-between gap-2 [transform:translateZ(80px)_scale(0.94)]" >
347+ < div className = "text-[0.8rem] font-semibold text-white" >
348+ < h3 className = "line-clamp-3 min-w-0 break-words text-center text-base font-semibold leading-tight text-white" >
349+ { card . productName }
350+ </ h3 >
351+ </ div >
352+ < div className = "min-h-0 flex-1 overflow-y-auto pr-2 text-[0.86rem] font-semibold leading-[1.4] text-white/80 [scrollbar-width:thin]" >
342353 { detailEntries . map ( ( entry ) => (
343- < div key = { entry . label } className = "flex min-w-0 items-start justify-between gap-3 border-b border-white/5 pb-1 last:border-b-0" >
344- < span className = "text-[0.65rem] font-semibold uppercase tracking-wide text-white/60 sm:text-xs" >
354+ < div key = { entry . label } className = "mb-2 rounded-[5px] border-b border-white/5 pb-2 last:border-b-0" >
355+ < span className = "block text-[0.65rem] font-bold uppercase tracking-wide text-white/60 sm:text-xs" >
345356 { entry . label }
346357 </ span >
347- < span className = "min-w-0 text-right break-words text-white" > { entry . value } </ span >
358+ < span className = "block min-w-0 break-words text-white" > { entry . value } </ span >
348359 </ div >
349360 ) ) }
350361 </ div >
351- </ div >
352- < div className = "mx-auto mt-2 flex flex-wrap w-full gap-2 text-pretty sm:gap-3" >
353- < Link
354- className = "inline-flex w-full items-center justify-center rounded border border-white/20 bg-white/10 px-2 py-1 text-sm font-semibold text-white transition hover:border-indigo-400 hover:bg-indigo-500/20"
355- href = { {
356- pathname : "/yugioh/sets/[letter]/cards/card-details" ,
357- query : cardDetailsQuery ,
358- } }
359- >
360- View Details
361- </ Link >
362- < button
363- type = "button "
364- className = "inline-flex w-full items-center justify-center rounded border border-white/20 px-2 py-1 text-sm font-medium text-white transition hover:border-indigo-400 hover:text-indigo-200"
365- onClick = { ( ) => toggleFlip ( card . _id , false ) }
366- >
367- Show Card Front
368- </ button >
362+ < div className = "mx-auto flex w-full flex-wrap gap-1.5 text-pretty" >
363+ < Link
364+ className = "inline-flex min-h-8 w-full items-center justify-center rounded-[4px] border border-white/20 bg-white/10 px-3 py-1.5 text-center text-xs font-semibold uppercase leading-tight tracking-[0.08em] text-white transition duration-300 hover:border-indigo-400 hover:bg-indigo-500/20 hover:text-indigo-100"
365+ href = { {
366+ pathname : "/yugioh/sets/[letter]/cards/card-details" ,
367+ query : cardDetailsQuery ,
368+ } }
369+ >
370+ View Details
371+ </ Link >
372+ < button
373+ type = " button"
374+ className = "inline-flex min-h-8 w-full items-center justify-center rounded-[4px] border border-white/20 bg-transparent px-3 py-1.5 text-center text-xs font-semibold uppercase leading-tight tracking-[0.08em] text-white transition duration-300 hover:border-indigo-400 hover:text-indigo-200 "
375+ onClick = { ( ) => toggleFlip ( card . _id , false ) }
376+ >
377+ Show Card Front
378+ </ button >
379+ </ div >
369380 </ div >
370381 </ div >
371382 </ div >
372383 </ div >
373- < div className = "mt-5 space-y-5 rounded border border-white/10 bg-white/5 p-4 text-sm text-white/80" >
384+ < div className = "mt-5 space-y-5 rounded-[6px] border border-white/10 bg-black/35 p-4 text-sm text-white/80" >
374385 < div className = "flex flex-wrap items-center justify-between gap-4" >
375386 < span className = "text-xs font-semibold uppercase tracking-wide text-white/60" > Quantity</ span >
376387 { edit [ card . _id ] === "quantity" ? (
@@ -443,19 +454,3 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
443454} ;
444455
445456export default GridView ;
446-
447-
448-
449-
450-
451-
452-
453-
454-
455-
456-
457-
458-
459-
460-
461-
0 commit comments