Skip to content

Commit f29fa18

Browse files
committed
feat: fullscreen card preview
1 parent 3f842a5 commit f29fa18

3 files changed

Lines changed: 294 additions & 8 deletions

File tree

‎assets/css/app.css‎

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,49 @@
317317
}
318318
}
319319

320+
.card-fullscreen-frame {
321+
transform-style: preserve-3d;
322+
}
323+
324+
.card-fullscreen-frame .card-tile-foil-overlay::before {
325+
animation-play-state: running;
326+
}
327+
328+
.card-fullscreen-set-grain {
329+
position: absolute;
330+
inset: 0;
331+
z-index: 7;
332+
border-radius: inherit;
333+
background: rgb(255 255 255 / 0.18);
334+
mask-image: var(--card-set-grain);
335+
mask-position: center;
336+
mask-repeat: repeat;
337+
mask-size: 3.75rem;
338+
-webkit-mask-image: var(--card-set-grain);
339+
-webkit-mask-position: center;
340+
-webkit-mask-repeat: repeat;
341+
-webkit-mask-size: 3.75rem;
342+
mix-blend-mode: screen;
343+
opacity: 0.24;
344+
pointer-events: none;
345+
animation: card-fullscreen-set-grain 18s linear infinite;
346+
}
347+
348+
@keyframes card-fullscreen-set-grain {
349+
0% {
350+
mask-position: 0 0;
351+
-webkit-mask-position: 0 0;
352+
}
353+
354+
100% {
355+
mask-position: 3.75rem 3.75rem;
356+
-webkit-mask-position: 3.75rem 3.75rem;
357+
}
358+
}
359+
320360
@media (prefers-reduced-motion: reduce) {
321-
.card-tile-foil-overlay::before {
361+
.card-tile-foil-overlay::before,
362+
.card-fullscreen-set-grain {
322363
animation: none;
323364
}
324365
}

‎assets/react/src/components/card-tile.tsx‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export function CardTile({
4545
menuActions = [],
4646
name,
4747
onSelect,
48+
primaryActionLabel,
49+
primaryActionRole = "link",
4850
price,
4951
rarity,
5052
selectable = false,
@@ -71,6 +73,8 @@ export function CardTile({
7173
name: ReactNode
7274
onSelect?: () => void
7375
onToggleSelected?: () => void
76+
primaryActionLabel?: string
77+
primaryActionRole?: "button" | "link"
7478
price?: ReactNode
7579
rarity?: string | null
7680
selectable?: boolean
@@ -129,7 +133,9 @@ export function CardTile({
129133

130134
return (
131135
<div
132-
aria-label={onSelect && typeof name === "string" ? `View ${name}` : undefined}
136+
aria-label={
137+
primaryActionLabel || (onSelect && typeof name === "string" ? `View ${name}` : undefined)
138+
}
133139
aria-pressed={selectionClickActive ? selected : undefined}
134140
className={cn(
135141
"group/card relative w-full max-w-[14.25rem] overflow-visible rounded-xl bg-transparent transition duration-200 focus-within:z-50",
@@ -139,7 +145,7 @@ export function CardTile({
139145
)}
140146
onClick={hasPrimaryAction ? handleClick : undefined}
141147
onKeyDown={handleKeyDown}
142-
role={selectionClickActive ? "button" : onSelect ? "link" : undefined}
148+
role={selectionClickActive ? "button" : onSelect ? primaryActionRole : undefined}
143149
tabIndex={hasPrimaryAction ? 0 : undefined}
144150
>
145151
{showMenu ? (

0 commit comments

Comments
 (0)