typescript on both client and server with communication via socket.io

This commit is contained in:
Gavin McDonald
2025-04-09 11:28:35 -04:00
parent 9f2773f45d
commit 3c4b8cf56e
73 changed files with 1233 additions and 41 deletions

View File

@@ -2,40 +2,12 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useParams } from 'next/navigation'; import { useParams } from 'next/navigation';
import { socket } from "../../socket"; import { socket } from "@/socket";
//import Card from '@/components/Card'; import Card from '@/components/Card';
//import type { GameCard } from '@/types'; import type { GameCard } from '@/types';
export default function GamePage() {
const { gameID } = useParams();
const [cards, setCards] = useState();
useEffect(() => {
socket.emit('join', gameID);
socket.on('init', data => {
console.log('init', data);
setCards(data.id);
});
socket.on('card-flipped', (data) => {
console.log('>>>', data);
setCards(data.id);
});
return () => {
socket.off('init');
socket.off('card-flipped');
};
}, []);
return <h1>A Page! {cards}</h1>
}
/*
export default function GamePage() { export default function GamePage() {
const { gameID } = useParams(); const { gameID } = useParams();
@@ -91,4 +63,3 @@ export default function GamePage() {
</main> </main>
) : null; ) : null;
} }
*/

28
components/Card.tsx Normal file
View File

@@ -0,0 +1,28 @@
'use client';
type CardProps = {
id: string;
flipped: boolean;
onFlip: (id: string) => void;
};
export default function Card({ id, flipped, onFlip }: CardProps) {
return (
<div
className={`w-24 h-32 flex items-center justify-center cursor-pointer`}
onClick={() => onFlip(id)}
>
{flipped ? (
<img
src={`/cards/${id}.svg`}
/>
) : (
<img
src="/cards/1B.svg"
/>
)
}
</div>
);
}

453
const/cards.js Normal file
View File

@@ -0,0 +1,453 @@
const cards = [
{
"id": "1B",
"back": true,
"face": false,
"joker": false,
"suit": null,
"url": "/cards/1B.svg"
},
{
"id": "2B",
"back": true,
"face": false,
"joker": false,
"suit": null,
"url": "/cards/2B.svg"
},
{
"id": "1J",
"back": false,
"face": false,
"joker": true,
"suit": null,
"url": "/cards/1J.svg"
},
{
"id": "2J",
"back": false,
"face": false,
"joker": true,
"suit": null,
"url": "/cards/2J.svg"
},
{
"id": "AC",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/AC.svg"
},
{
"id": "AD",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/AD.svg"
},
{
"id": "AH",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/AH.svg"
},
{
"id": "AS",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/AS.svg"
},
{
"id": "2C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/2C.svg"
},
{
"id": "2D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/2D.svg"
},
{
"id": "2H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/2H.svg"
},
{
"id": "2S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/2S.svg"
},
{
"id": "3C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/3C.svg"
},
{
"id": "3D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/3D.svg"
},
{
"id": "3H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/3H.svg"
},
{
"id": "3S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/3S.svg"
},
{
"id": "4C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/4C.svg"
},
{
"id": "4D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/4D.svg"
},
{
"id": "4H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/4H.svg"
},
{
"id": "4S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/4S.svg"
},
{
"id": "5C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/5C.svg"
},
{
"id": "5D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/5D.svg"
},
{
"id": "5H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/5H.svg"
},
{
"id": "5S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/5S.svg"
},
{
"id": "6C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/6C.svg"
},
{
"id": "6D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/6D.svg"
},
{
"id": "6H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/6H.svg"
},
{
"id": "6S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/6S.svg"
},
{
"id": "7C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/7C.svg"
},
{
"id": "7D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/7D.svg"
},
{
"id": "7H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/7H.svg"
},
{
"id": "7S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/7S.svg"
},
{
"id": "8C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/8C.svg"
},
{
"id": "8D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/8D.svg"
},
{
"id": "8H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/8H.svg"
},
{
"id": "8S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/8S.svg"
},
{
"id": "9C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/9C.svg"
},
{
"id": "9D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/9D.svg"
},
{
"id": "9H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/9H.svg"
},
{
"id": "9S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/9S.svg"
},
{
"id": "10C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/10C.svg"
},
{
"id": "10D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/10D.svg"
},
{
"id": "10H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/10H.svg"
},
{
"id": "10S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/10S.svg"
},
{
"id": "JC",
"back": false,
"face": true,
"joker": false,
"suit": "Clubs",
"url": "/cards/JC.svg"
},
{
"id": "JD",
"back": false,
"face": true,
"joker": false,
"suit": "Diamonds",
"url": "/cards/JD.svg"
},
{
"id": "JH",
"back": false,
"face": true,
"joker": false,
"suit": "Hearts",
"url": "/cards/JH.svg"
},
{
"id": "JS",
"back": false,
"face": true,
"joker": false,
"suit": "Spades",
"url": "/cards/JS.svg"
},
{
"id": "KC",
"back": false,
"face": true,
"joker": false,
"suit": "Clubs",
"url": "/cards/KC.svg"
},
{
"id": "KD",
"back": false,
"face": true,
"joker": false,
"suit": "Diamonds",
"url": "/cards/KD.svg"
},
{
"id": "KH",
"back": false,
"face": true,
"joker": false,
"suit": "Hearts",
"url": "/cards/KH.svg"
},
{
"id": "KS",
"back": false,
"face": true,
"joker": false,
"suit": "Spades",
"url": "/cards/KS.svg"
},
{
"id": "QC",
"back": false,
"face": true,
"joker": false,
"suit": "Clubs",
"url": "/cards/QC.svg"
},
{
"id": "QD",
"back": false,
"face": true,
"joker": false,
"suit": "Diamonds",
"url": "/cards/QD.svg"
},
{
"id": "QH",
"back": false,
"face": true,
"joker": false,
"suit": "Hearts",
"url": "/cards/QH.svg"
},
{
"id": "QS",
"back": false,
"face": true,
"joker": false,
"suit": "Spades",
"url": "/cards/QS.svg"
}
];
export default cards;

454
const/cards.ts Normal file
View File

@@ -0,0 +1,454 @@
import { CardImage } from '@/types';
const cards: CardImage[] = [
{
"id": "1B",
"back": true,
"face": false,
"joker": false,
"suit": null,
"url": "/cards/1B.svg"
},
{
"id": "2B",
"back": true,
"face": false,
"joker": false,
"suit": null,
"url": "/cards/2B.svg"
},
{
"id": "1J",
"back": false,
"face": false,
"joker": true,
"suit": null,
"url": "/cards/1J.svg"
},
{
"id": "2J",
"back": false,
"face": false,
"joker": true,
"suit": null,
"url": "/cards/2J.svg"
},
{
"id": "AC",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/AC.svg"
},
{
"id": "AD",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/AD.svg"
},
{
"id": "AH",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/AH.svg"
},
{
"id": "AS",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/AS.svg"
},
{
"id": "2C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/2C.svg"
},
{
"id": "2D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/2D.svg"
},
{
"id": "2H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/2H.svg"
},
{
"id": "2S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/2S.svg"
},
{
"id": "3C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/3C.svg"
},
{
"id": "3D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/3D.svg"
},
{
"id": "3H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/3H.svg"
},
{
"id": "3S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/3S.svg"
},
{
"id": "4C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/4C.svg"
},
{
"id": "4D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/4D.svg"
},
{
"id": "4H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/4H.svg"
},
{
"id": "4S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/4S.svg"
},
{
"id": "5C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/5C.svg"
},
{
"id": "5D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/5D.svg"
},
{
"id": "5H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/5H.svg"
},
{
"id": "5S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/5S.svg"
},
{
"id": "6C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/6C.svg"
},
{
"id": "6D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/6D.svg"
},
{
"id": "6H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/6H.svg"
},
{
"id": "6S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/6S.svg"
},
{
"id": "7C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/7C.svg"
},
{
"id": "7D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/7D.svg"
},
{
"id": "7H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/7H.svg"
},
{
"id": "7S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/7S.svg"
},
{
"id": "8C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/8C.svg"
},
{
"id": "8D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/8D.svg"
},
{
"id": "8H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/8H.svg"
},
{
"id": "8S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/8S.svg"
},
{
"id": "9C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/9C.svg"
},
{
"id": "9D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/9D.svg"
},
{
"id": "9H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/9H.svg"
},
{
"id": "9S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/9S.svg"
},
{
"id": "10C",
"back": false,
"face": false,
"joker": false,
"suit": "Clubs",
"url": "/cards/10C.svg"
},
{
"id": "10D",
"back": false,
"face": false,
"joker": false,
"suit": "Diamonds",
"url": "/cards/10D.svg"
},
{
"id": "10H",
"back": false,
"face": false,
"joker": false,
"suit": "Hearts",
"url": "/cards/10H.svg"
},
{
"id": "10S",
"back": false,
"face": false,
"joker": false,
"suit": "Spades",
"url": "/cards/10S.svg"
},
{
"id": "JC",
"back": false,
"face": true,
"joker": false,
"suit": "Clubs",
"url": "/cards/JC.svg"
},
{
"id": "JD",
"back": false,
"face": true,
"joker": false,
"suit": "Diamonds",
"url": "/cards/JD.svg"
},
{
"id": "JH",
"back": false,
"face": true,
"joker": false,
"suit": "Hearts",
"url": "/cards/JH.svg"
},
{
"id": "JS",
"back": false,
"face": true,
"joker": false,
"suit": "Spades",
"url": "/cards/JS.svg"
},
{
"id": "KC",
"back": false,
"face": true,
"joker": false,
"suit": "Clubs",
"url": "/cards/KC.svg"
},
{
"id": "KD",
"back": false,
"face": true,
"joker": false,
"suit": "Diamonds",
"url": "/cards/KD.svg"
},
{
"id": "KH",
"back": false,
"face": true,
"joker": false,
"suit": "Hearts",
"url": "/cards/KH.svg"
},
{
"id": "KS",
"back": false,
"face": true,
"joker": false,
"suit": "Spades",
"url": "/cards/KS.svg"
},
{
"id": "QC",
"back": false,
"face": true,
"joker": false,
"suit": "Clubs",
"url": "/cards/QC.svg"
},
{
"id": "QD",
"back": false,
"face": true,
"joker": false,
"suit": "Diamonds",
"url": "/cards/QD.svg"
},
{
"id": "QH",
"back": false,
"face": true,
"joker": false,
"suit": "Hearts",
"url": "/cards/QH.svg"
},
{
"id": "QS",
"back": false,
"face": true,
"joker": false,
"suit": "Spades",
"url": "/cards/QS.svg"
}
];
export default cards;

48
lib/Cards.ts Normal file
View File

@@ -0,0 +1,48 @@
import getRandomItems from '../tools/getRandomItems';
import cards from '../const/cards';
import type { CardImage } from '@/types';
export interface Options {
back: number;
jokers: boolean;
}
export interface OptionProps {
back?: number;
jokers?: boolean;
}
const DEFAULT_OPTIONS = {
jokers: false,
back: 1,
};
export default class Cards {
private options: Options;
private deck: CardImage[] = [];
private backs: CardImage[] = [];
private jokers: CardImage[] = [];
constructor(options: OptionProps = {}) {
this.options = { ...DEFAULT_OPTIONS, ...options };
this.deck = cards.filter(card => !card.back && (this.options.jokers || !card.joker));
this.backs = cards.filter(card => card.back);
this.jokers = cards.filter(card => card.joker);
}
select(count: number): CardImage[] {
return getRandomItems(this.deck, count);
}
getBack(style: number): CardImage {
style = style || this.options.back;
return this.backs.find(card => card.id.startsWith(String(style))) || this.backs[0];
}
getJokers(): CardImage[] {
return this.jokers;
}
}

70
lib/GameStore.ts Normal file
View File

@@ -0,0 +1,70 @@
import Cards from './Cards'
import { GameState } from '../types'
const deck = new Cards();
export default class GameStore {
private games: Map<string, GameState>;
constructor() {
this.games = new Map();
}
createGame(id: string): GameState {
if (this.games.has(id)) throw new Error(`Game ${id} already exists`);
const newGame: GameState = {
id,
players: new Set(),
cards: deck.select(5).map(card => ({ ...card, flipped: false })),
lastUpdated: Date.now(),
};
this.games.set(id, newGame);
return newGame;
}
joinGame(gameID: string, playerID: string): GameState {
const game = this.games.get(gameID) || this.createGame(gameID);
game.players.add(playerID);
game.lastUpdated = Date.now();
return game;
}
leaveGame(gameID: string, playerID: string): GameState {
const game = this.getGame(gameID);
game.players.delete(playerID);
game.lastUpdated = Date.now();
return game;
}
flipCard(gameID: string, cardID: string): GameState {
const game = this.getGame(gameID);
const card = game.cards.find(c => c.id === cardID);
if (!card) throw new Error(`Card ${cardID} not found`);
card.flipped = !card.flipped;
game.lastUpdated = Date.now();
return game;
}
getGame(gameID: string): GameState {
const game = this.games.get(gameID);
if (!game) throw new Error(`Game ${gameID} not found`);
return game;
}
deleteGame(gameID: string): void {
this.games.delete(gameID);
}
}

2
public/cards/10C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="TC" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SCT" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VCT" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-260 430L-260 -430M-50 0L-50 -310A150 150 0 0 1 250 -310L250 310A150 150 0 0 1 -50 310Z" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VCT" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SCT" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SCT" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SCT" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SCT" height="70" width="70" x="-87.501" y="-68.529"></use><use xlink:href="#SCT" height="70" width="70" x="17.501" y="-68.529"></use><use xlink:href="#SCT" height="70" width="70" x="-35" y="-102.058"></use><g transform="rotate(180)"><use xlink:href="#VCT" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SCT" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SCT" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SCT" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SCT" height="70" width="70" x="-87.501" y="-68.529"></use><use xlink:href="#SCT" height="70" width="70" x="17.501" y="-68.529"></use><use xlink:href="#SCT" height="70" width="70" x="-35" y="-102.058"></use></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

2
public/cards/10D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="TD" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SDT" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VDT" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-260 430L-260 -430M-50 0L-50 -310A150 150 0 0 1 250 -310L250 310A150 150 0 0 1 -50 310Z" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VDT" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SDT" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SDT" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SDT" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SDT" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SDT" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SDT" height="70" width="70" x="-35" y="-102"></use><g transform="rotate(180)"><use xlink:href="#VDT" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SDT" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SDT" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SDT" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SDT" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SDT" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SDT" height="70" width="70" x="-35" y="-102"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

2
public/cards/10H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="TH" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SHT" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VHT" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-260 430L-260 -430M-50 0L-50 -310A150 150 0 0 1 250 -310L250 310A150 150 0 0 1 -50 310Z" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VHT" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SHT" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SHT" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SHT" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SHT" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SHT" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SHT" height="70" width="70" x="-35" y="-102"></use><g transform="rotate(180)"><use xlink:href="#VHT" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SHT" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SHT" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SHT" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SHT" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SHT" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SHT" height="70" width="70" x="-35" y="-102"></use></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

2
public/cards/10S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="TS" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SST" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VST" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-260 430L-260 -430M-50 0L-50 -310A150 150 0 0 1 250 -310L250 310A150 150 0 0 1 -50 310Z" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VST" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SST" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SST" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SST" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SST" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SST" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SST" height="70" width="70" x="-35" y="-102"></use><g transform="rotate(180)"><use xlink:href="#VST" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SST" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SST" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SST" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SST" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SST" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SST" height="70" width="70" x="-35" y="-102"></use></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

2
public/cards/1B.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" class="card" face="1B" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><pattern id="B1" width="6" height="6" patternUnits="userSpaceOnUse"><path d="M3 0L6 3L3 6L0 3Z" fill="black"></path></pattern></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><rect fill="url(#B1)" width="216" height="312" x="-108" y="-156" rx="12" ry="12"></rect></svg>

After

Width:  |  Height:  |  Size: 539 B

2
public/cards/1J.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="1J" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="J14" preserveAspectRatio="none" viewBox="0 0 1300 2000"><path stroke="#44F" stroke-linecap="round" stroke-linejoin="round" stroke-width="6" fill="none" d="M317.05664,1294.416 100,1620l220,-60 40,240 140,-200 160,200 40,-200 180,180 60,-220 260,60 -236.67969,-304.3027M1241.1987,534.58948a75,75 0 0 1 -75,75 75,75 0 0 1 -75,-75 75,75 0 0 1 75,-75 75,75 0 0 1 75,75zM980.11493,234.09686a75,75 0 0 1 -75,75 75,75 0 0 1 -75,-75 75,75 0 0 1 75,-75 75,75 0 0 1 75,75zM190.29556,431.1412a75,75 0 0 1 -75,75 75,75 0 0 1 -74.999997,-75 75,75 0 0 1 74.999997,-75 75,75 0 0 1 75,75zM924.3457,650.27148c42.40088,-50.45397 91.5936,-93.35356 167.5059,-106.53906 -0.4037,-3.03138 -0.6215,-6.0846 -0.6524,-9.14258 0.03,-15.96068 5.1503,-31.4957 14.6172,-44.3457C1026.3517,437.47479 931.12146,446.83238 840,440 761.98041,388.07638 804.10248,338.17898 853.51758,288.4043 842.40414,277.84182 834.79487,264.12701 831.71484,249.10742 687.94378,262.65874 542.4812,256.33752 420,520 369.08062,331.38331 278.61481,370.61289 187.77148,412.01367c1.66108,6.24042 2.50924,12.66925 2.52344,19.12695 -0.0209,17.1896 -5.94587,33.85038 -16.7832,47.19336 66.82714,55.25532 117.5686,127.8306 155.76953,213.91016M384.88867,1140c51.89013,98.343 153.91815,159.9189 265.11133,160 111.19809,-0.076 213.23257,-61.6527 265.125,-160M1095,1000A445,445 0 0 1 650,1445 445,445 0 0 1 205,1000 445,445 0 0 1 650,555 445,445 0 0 1 1095,1000Z"></path></symbol><symbol id="J13" preserveAspectRatio="none" viewBox="0 0 1300 2000"><path fill="#44F" d="M879.65521,937.6026a40,40 0 0 1 -40,40 40,40 0 0 1 -40,-40 40,40 0 0 1 40,-40 40,40 0 0 1 40,40zm-379.31039,0a40,40 0 0 1 -40,40 40,40 0 0 1 -40,-40 40,40 0 0 1 40,-40 40,40 0 0 1 40,40z"></path></symbol><symbol id="J12" preserveAspectRatio="none" viewBox="0 0 1300 2000"><path fill="red" d="M317.05664,1294.416 100,1620l220,-60 40,240 140,-200 160,200 40,-200 180,180 60,-220 260,60 -236.67969,-304.3027A445,445 0 0 1 650,1445 445,445 0 0 1 317.05664,1294.416ZM831.71484,249.10742C687.94378,262.65874 542.4812,256.33752 420,520 369.08062,331.38331 278.61481,370.61289 187.77148,412.01367a75,75 0 0 1 2.52344,19.12695 75,75 0 0 1 -16.78515,47.19532c66.827,55.25537 117.57478,127.8247 155.77539,213.90429A445,445 0 0 1 650,555 445,445 0 0 1 924.33984,650.26562c42.39917,-50.4556 91.60026,-93.34711 167.51176,-106.5332a75,75 0 0 1 -0.6524,-9.14258 75,75 0 0 1 14.6172,-44.3457C1026.3517,437.47479 931.12146,446.83238 840,440 761.98041,388.07638 804.10248,338.17898 853.51758,288.4043a75,75 0 0 1 -21.80274,-39.29688z"></path></symbol><symbol id="J11" preserveAspectRatio="none" viewBox="0 0 1300 2000"><path fill="#FC4" d="M1095,1000A445,445 0 0 1 650,1445 445,445 0 0 1 205,1000 445,445 0 0 1 650,555 445,445 0 0 1 1095,1000Z"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use width="202.8" height="312" x="-101.4" y="-156" xlink:href="#J11"></use><use width="202.8" height="312" x="-101.4" y="-156" xlink:href="#J12"></use><use width="202.8" height="312" x="-101.4" y="-156" xlink:href="#J13"></use><use width="202.8" height="312" x="-101.4" y="-156" xlink:href="#J14"></use></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

2
public/cards/2B.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" class="card" face="2B" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><pattern id="B2" width="6" height="6" patternUnits="userSpaceOnUse"><path d="M3 0L6 3L3 6L0 3Z" fill="red"></path></pattern></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><rect fill="url(#B2)" width="216" height="312" x="-108" y="-156" rx="12" ry="12"></rect></svg>

After

Width:  |  Height:  |  Size: 537 B

2
public/cards/2C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="2C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC2" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC2" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-225 -225C-245 -265 -200 -460 0 -460C 200 -460 225 -325 225 -225C225 -25 -225 160 -225 460L225 460L225 300" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC2" height="70" width="70" x="-35" y="-135.588"></use><g transform="rotate(180)"><use xlink:href="#VC2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC2" height="70" width="70" x="-35" y="-135.588"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

2
public/cards/2D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="2D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD2" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD2" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-225 -225C-245 -265 -200 -460 0 -460C 200 -460 225 -325 225 -225C225 -25 -225 160 -225 460L225 460L225 300" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD2" height="70" width="70" x="-35" y="-135.501"></use><g transform="rotate(180)"><use xlink:href="#VD2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD2" height="70" width="70" x="-35" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

2
public/cards/2H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="2H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH2" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH2" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-225 -225C-245 -265 -200 -460 0 -460C 200 -460 225 -325 225 -225C225 -25 -225 160 -225 460L225 460L225 300" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH2" height="70" width="70" x="-35" y="-135.501"></use><g transform="rotate(180)"><use xlink:href="#VH2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH2" height="70" width="70" x="-35" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

2
public/cards/2J.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="2J" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="J22" preserveAspectRatio="none" viewBox="0 0 1300 2000"><path stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="6" fill="none" d="M317.05664,1294.416 100,1620l220,-60 40,240 140,-200 160,200 40,-200 180,180 60,-220 260,60 -236.67969,-304.3027M1241.1987,534.58948a75,75 0 0 1 -75,75 75,75 0 0 1 -75,-75 75,75 0 0 1 75,-75 75,75 0 0 1 75,75zM980.11493,234.09686a75,75 0 0 1 -75,75 75,75 0 0 1 -75,-75 75,75 0 0 1 75,-75 75,75 0 0 1 75,75zM190.29556,431.1412a75,75 0 0 1 -75,75 75,75 0 0 1 -74.999997,-75 75,75 0 0 1 74.999997,-75 75,75 0 0 1 75,75zM924.3457,650.27148c42.40088,-50.45397 91.5936,-93.35356 167.5059,-106.53906 -0.4037,-3.03138 -0.6215,-6.0846 -0.6524,-9.14258 0.03,-15.96068 5.1503,-31.4957 14.6172,-44.3457C1026.3517,437.47479 931.12146,446.83238 840,440 761.98041,388.07638 804.10248,338.17898 853.51758,288.4043 842.40414,277.84182 834.79487,264.12701 831.71484,249.10742 687.94378,262.65874 542.4812,256.33752 420,520 369.08062,331.38331 278.61481,370.61289 187.77148,412.01367c1.66108,6.24042 2.50924,12.66925 2.52344,19.12695 -0.0209,17.1896 -5.94587,33.85038 -16.7832,47.19336 66.82714,55.25532 117.5686,127.8306 155.76953,213.91016M384.88867,1140c51.89013,98.343 153.91815,159.9189 265.11133,160 111.19809,-0.076 213.23257,-61.6527 265.125,-160M1095,1000A445,445 0 0 1 650,1445 445,445 0 0 1 205,1000 445,445 0 0 1 650,555 445,445 0 0 1 1095,1000Z"></path></symbol><symbol id="J21" preserveAspectRatio="none" viewBox="0 0 1300 2000"><path fill="black" d="M879.65521,937.6026a40,40 0 0 1 -40,40 40,40 0 0 1 -40,-40 40,40 0 0 1 40,-40 40,40 0 0 1 40,40zm-379.31039,0a40,40 0 0 1 -40,40 40,40 0 0 1 -40,-40 40,40 0 0 1 40,-40 40,40 0 0 1 40,40z"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use width="202.8" height="312" x="-101.4" y="-156" xlink:href="#J21"></use><use width="202.8" height="312" x="-101.4" y="-156" xlink:href="#J22"></use></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

2
public/cards/2S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="2S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS2" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS2" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-225 -225C-245 -265 -200 -460 0 -460C 200 -460 225 -325 225 -225C225 -25 -225 160 -225 460L225 460L225 300" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS2" height="70" width="70" x="-35" y="-135.501"></use><g transform="rotate(180)"><use xlink:href="#VS2" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS2" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS2" height="70" width="70" x="-35" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

2
public/cards/3C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="3C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC3" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC3" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 -320L-250 -460L200 -460L-110 -80C-100 -90 -50 -120 0 -120C200 -120 250 0 250 150C250 350 170 460 -30 460C-230 460 -260 300 -260 300" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC3" height="70" width="70" x="-35" y="-135.588"></use><use xlink:href="#SC3" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VC3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC3" height="70" width="70" x="-35" y="-135.588"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

2
public/cards/3D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="3D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD3" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD3" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 -320L-250 -460L200 -460L-110 -80C-100 -90 -50 -120 0 -120C200 -120 250 0 250 150C250 350 170 460 -30 460C-230 460 -260 300 -260 300" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD3" height="70" width="70" x="-35" y="-135.501"></use><use xlink:href="#SD3" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VD3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD3" height="70" width="70" x="-35" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

2
public/cards/3H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="3H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH3" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH3" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 -320L-250 -460L200 -460L-110 -80C-100 -90 -50 -120 0 -120C200 -120 250 0 250 150C250 350 170 460 -30 460C-230 460 -260 300 -260 300" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH3" height="70" width="70" x="-35" y="-135.501"></use><use xlink:href="#SH3" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VH3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH3" height="70" width="70" x="-35" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

2
public/cards/3S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="3S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS3" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS3" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 -320L-250 -460L200 -460L-110 -80C-100 -90 -50 -120 0 -120C200 -120 250 0 250 150C250 350 170 460 -30 460C-230 460 -260 300 -260 300" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS3" height="70" width="70" x="-35" y="-135.501"></use><use xlink:href="#SS3" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VS3" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS3" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS3" height="70" width="70" x="-35" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

2
public/cards/4C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="4C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC4" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC4" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M50 460L250 460M150 460L150 -460L-300 175L-300 200L270 200" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC4" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC4" height="70" width="70" x="17.501" y="-135.588"></use><g transform="rotate(180)"><use xlink:href="#VC4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC4" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC4" height="70" width="70" x="17.501" y="-135.588"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

2
public/cards/4D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="4D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD4" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD4" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M50 460L250 460M150 460L150 -460L-300 175L-300 200L270 200" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD4" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD4" height="70" width="70" x="17.501" y="-135.501"></use><g transform="rotate(180)"><use xlink:href="#VD4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD4" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD4" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

2
public/cards/4H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="4H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH4" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH4" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M50 460L250 460M150 460L150 -460L-300 175L-300 200L270 200" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH4" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH4" height="70" width="70" x="17.501" y="-135.501"></use><g transform="rotate(180)"><use xlink:href="#VH4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH4" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH4" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

2
public/cards/4S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="4S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS4" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS4" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M50 460L250 460M150 460L150 -460L-300 175L-300 200L270 200" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS4" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS4" height="70" width="70" x="17.501" y="-135.501"></use><g transform="rotate(180)"><use xlink:href="#VS4" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS4" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS4" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS4" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

2
public/cards/5C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="5C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC5" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC5" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M170 -460L-175 -460L-210 -115C-210 -115 -200 -200 0 -200C100 -200 255 -80 255 120C255 320 180 460 -20 460C-220 460 -255 285 -255 285" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC5" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC5" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC5" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VC5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC5" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC5" height="70" width="70" x="17.501" y="-135.588"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/5D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="5D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD5" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD5" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M170 -460L-175 -460L-210 -115C-210 -115 -200 -200 0 -200C100 -200 255 -80 255 120C255 320 180 460 -20 460C-220 460 -255 285 -255 285" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD5" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD5" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD5" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VD5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD5" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD5" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

2
public/cards/5H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="5H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH5" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH5" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M170 -460L-175 -460L-210 -115C-210 -115 -200 -200 0 -200C100 -200 255 -80 255 120C255 320 180 460 -20 460C-220 460 -255 285 -255 285" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH5" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH5" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH5" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VH5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH5" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH5" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

2
public/cards/5S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="5S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS5" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS5" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M170 -460L-175 -460L-210 -115C-210 -115 -200 -200 0 -200C100 -200 255 -80 255 120C255 320 180 460 -20 460C-220 460 -255 285 -255 285" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS5" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS5" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS5" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VS5" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS5" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS5" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS5" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/6C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="6C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC6" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC6" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 100A250 250 0 0 1 250 100L250 210A250 250 0 0 1 -250 210L-250 -210A250 250 0 0 1 0 -460C150 -460 180 -400 200 -375" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC6" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC6" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC6" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SC6" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VC6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC6" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC6" height="70" width="70" x="17.501" y="-135.588"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/6D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="6D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD6" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD6" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 100A250 250 0 0 1 250 100L250 210A250 250 0 0 1 -250 210L-250 -210A250 250 0 0 1 0 -460C150 -460 180 -400 200 -375" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD6" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD6" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD6" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SD6" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VD6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD6" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD6" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

2
public/cards/6H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="6H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH6" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH6" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 100A250 250 0 0 1 250 100L250 210A250 250 0 0 1 -250 210L-250 -210A250 250 0 0 1 0 -460C150 -460 180 -400 200 -375" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH6" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH6" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH6" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SH6" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VH6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH6" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH6" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/6S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="6S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS6" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS6" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-250 100A250 250 0 0 1 250 100L250 210A250 250 0 0 1 -250 210L-250 -210A250 250 0 0 1 0 -460C150 -460 180 -400 200 -375" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS6" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS6" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS6" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SS6" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VS6" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS6" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS6" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS6" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/7C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="7C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC7" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC7" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-265 -320L-265 -460L265 -460C135 -200 -90 100 -90 460" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC7" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC7" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC7" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SC7" height="70" width="70" x="17.501" y="-35"></use><use xlink:href="#SC7" height="70" width="70" x="-35" y="-85.294"></use><g transform="rotate(180)"><use xlink:href="#VC7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC7" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC7" height="70" width="70" x="17.501" y="-135.588"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/7D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="7D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD7" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD7" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-265 -320L-265 -460L265 -460C135 -200 -90 100 -90 460" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD7" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD7" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD7" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SD7" height="70" width="70" x="17.501" y="-35"></use><use xlink:href="#SD7" height="70" width="70" x="-35" y="-85.25"></use><g transform="rotate(180)"><use xlink:href="#VD7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD7" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD7" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

2
public/cards/7H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="7H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH7" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH7" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-265 -320L-265 -460L265 -460C135 -200 -90 100 -90 460" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH7" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH7" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH7" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SH7" height="70" width="70" x="17.501" y="-35"></use><use xlink:href="#SH7" height="70" width="70" x="-35" y="-85.25"></use><g transform="rotate(180)"><use xlink:href="#VH7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH7" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH7" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/7S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="7S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS7" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS7" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-265 -320L-265 -460L265 -460C135 -200 -90 100 -90 460" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS7" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS7" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS7" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SS7" height="70" width="70" x="17.501" y="-35"></use><use xlink:href="#SS7" height="70" width="70" x="-35" y="-85.25"></use><g transform="rotate(180)"><use xlink:href="#VS7" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS7" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS7" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS7" height="70" width="70" x="17.501" y="-135.501"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/8C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="8C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC8" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC8" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-1 -50A205 205 0 1 1 1 -50L-1 -50A255 255 0 1 0 1 -50Z" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC8" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC8" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC8" height="70" width="70" x="-35" y="-85.294"></use><use xlink:href="#SC8" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SC8" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VC8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC8" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC8" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC8" height="70" width="70" x="-35" y="-85.294"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/8D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="8D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD8" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD8" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-1 -50A205 205 0 1 1 1 -50L-1 -50A255 255 0 1 0 1 -50Z" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD8" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD8" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD8" height="70" width="70" x="-35" y="-85.25"></use><use xlink:href="#SD8" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SD8" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VD8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD8" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD8" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD8" height="70" width="70" x="-35" y="-85.25"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/8H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="8H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH8" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH8" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-1 -50A205 205 0 1 1 1 -50L-1 -50A255 255 0 1 0 1 -50Z" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH8" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH8" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH8" height="70" width="70" x="-35" y="-85.25"></use><use xlink:href="#SH8" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SH8" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VH8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH8" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH8" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH8" height="70" width="70" x="-35" y="-85.25"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/8S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="8S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS8" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS8" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-1 -50A205 205 0 1 1 1 -50L-1 -50A255 255 0 1 0 1 -50Z" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS8" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS8" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS8" height="70" width="70" x="-35" y="-85.25"></use><use xlink:href="#SS8" height="70" width="70" x="-87.501" y="-35"></use><use xlink:href="#SS8" height="70" width="70" x="17.501" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VS8" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS8" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS8" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS8" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS8" height="70" width="70" x="-35" y="-85.25"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/9C.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="9C" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SC9" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol><symbol id="VC9" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M250 -100A250 250 0 0 1 -250 -100L-250 -210A250 250 0 0 1 250 -210L250 210A250 250 0 0 1 0 460C-150 460 -180 400 -200 375" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VC9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC9" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC9" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC9" height="70" width="70" x="-87.501" y="-68.529"></use><use xlink:href="#SC9" height="70" width="70" x="17.501" y="-68.529"></use><use xlink:href="#SC9" height="70" width="70" x="-35" y="-42"></use><g transform="rotate(180)"><use xlink:href="#VC9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SC9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SC9" height="70" width="70" x="-87.501" y="-135.588"></use><use xlink:href="#SC9" height="70" width="70" x="17.501" y="-135.588"></use><use xlink:href="#SC9" height="70" width="70" x="-87.501" y="-68.529"></use><use xlink:href="#SC9" height="70" width="70" x="17.501" y="-68.529"></use></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

2
public/cards/9D.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="9D" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SD9" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol><symbol id="VD9" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M250 -100A250 250 0 0 1 -250 -100L-250 -210A250 250 0 0 1 250 -210L250 210A250 250 0 0 1 0 460C-150 460 -180 400 -200 375" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VD9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD9" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD9" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD9" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SD9" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SD9" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VD9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SD9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SD9" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SD9" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SD9" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SD9" height="70" width="70" x="17.501" y="-68.5"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

2
public/cards/9H.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="9H" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SH9" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol><symbol id="VH9" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M250 -100A250 250 0 0 1 -250 -100L-250 -210A250 250 0 0 1 250 -210L250 210A250 250 0 0 1 0 460C-150 460 -180 400 -200 375" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VH9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH9" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH9" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH9" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SH9" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SH9" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VH9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SH9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SH9" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SH9" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SH9" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SH9" height="70" width="70" x="17.501" y="-68.5"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

2
public/cards/9S.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="9S" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="SS9" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z" fill="black"></path></symbol><symbol id="VS9" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M250 -100A250 250 0 0 1 -250 -100L-250 -210A250 250 0 0 1 250 -210L250 210A250 250 0 0 1 0 460C-150 460 -180 400 -200 375" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#VS9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS9" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS9" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS9" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SS9" height="70" width="70" x="17.501" y="-68.5"></use><use xlink:href="#SS9" height="70" width="70" x="-35" y="-35"></use><g transform="rotate(180)"><use xlink:href="#VS9" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SS9" height="26.769" width="26.769" x="-111.784" y="-119"></use><use xlink:href="#SS9" height="70" width="70" x="-87.501" y="-135.501"></use><use xlink:href="#SS9" height="70" width="70" x="17.501" y="-135.501"></use><use xlink:href="#SS9" height="70" width="70" x="-87.501" y="-68.5"></use><use xlink:href="#SS9" height="70" width="70" x="17.501" y="-68.5"></use></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

2
public/cards/AC.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="AC" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="VCA" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-270 460L-110 460M-200 450L0 -460L200 450M110 460L270 460M-120 130L120 130" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol><symbol id="SCA" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M30 150C35 385 85 400 130 500L-130 500C-85 400 -35 385 -30 150A10 10 0 0 0 -50 150A210 210 0 1 1 -124 -51A10 10 0 0 0 -110 -65A230 230 0 1 1 110 -65A10 10 0 0 0 124 -51A210 210 0 1 1 50 150A10 10 0 0 0 30 150Z" fill="black"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#SCA" height="70" width="70" x="-35" y="-35"></use><use xlink:href="#VCA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SCA" height="26.769" width="26.769" x="-111.784" y="-119"></use><g transform="rotate(180)"><use xlink:href="#VCA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SCA" height="26.769" width="26.769" x="-111.784" y="-119"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

2
public/cards/AD.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="AD" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="VDA" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-270 460L-110 460M-200 450L0 -460L200 450M110 460L270 460M-120 130L120 130" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol><symbol id="SDA" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M-400 0C-350 0 0 -450 0 -500C0 -450 350 0 400 0C350 0 0 450 0 500C0 450 -350 0 -400 0Z" fill="red"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#SDA" height="70" width="70" x="-35" y="-35"></use><use xlink:href="#VDA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SDA" height="26.769" width="26.769" x="-111.784" y="-119"></use><g transform="rotate(180)"><use xlink:href="#VDA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SDA" height="26.769" width="26.769" x="-111.784" y="-119"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

2
public/cards/AH.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="AH" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="VHA" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-270 460L-110 460M-200 450L0 -460L200 450M110 460L270 460M-120 130L120 130" stroke="red" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol><symbol id="SHA" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -300C0 -400 100 -500 200 -500C300 -500 400 -400 400 -250C400 0 0 400 0 500C0 400 -400 0 -400 -250C-400 -400 -300 -500 -200 -500C-100 -500 0 -400 -0 -300Z" fill="red"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#SHA" height="70" width="70" x="-35" y="-35"></use><use xlink:href="#VHA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SHA" height="26.769" width="26.769" x="-111.784" y="-119"></use><g transform="rotate(180)"><use xlink:href="#VHA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SHA" height="26.769" width="26.769" x="-111.784" y="-119"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

2
public/cards/AS.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="card" face="AS" height="3.5in" preserveAspectRatio="none" viewBox="-120 -168 240 336" width="2.5in"><defs><symbol id="VSA" viewBox="-500 -500 1000 1000" preserveAspectRatio="xMinYMid"><path d="M-270 460L-110 460M-200 450L0 -460L200 450M110 460L270 460M-120 130L120 130" stroke="black" stroke-width="80" stroke-linecap="square" stroke-miterlimit="1.5" fill="none"></path></symbol><symbol id="SSA" viewBox="-600 -600 1200 1200" preserveAspectRatio="xMinYMid"><path d="M0 -500C100 -250 355 -100 355 185A150 150 0 0 1 55 185A10 10 0 0 0 35 185C35 385 85 400 130 500L-130 500C-85 400 -35 385 -35 185A10 10 0 0 0 -55 185A150 150 0 0 1 -355 185C-355 -100 -100 -250 0 -500Z"></path></symbol></defs><rect width="239" height="335" x="-119.5" y="-167.5" rx="12" ry="12" fill="white" stroke="black"></rect><use xlink:href="#SSA" fill="black" height="247.2" width="247.2" x="-123.6" y="-123.6" stroke="black" stroke-width="100" stroke-dasharray="100,100" stroke-linecap="round"></use><use xlink:href="#SSA" fill="black" height="247.2" width="247.2" x="-123.6" y="-123.6" stroke="white" stroke-width="50"></use><use xlink:href="#SSA" fill="black" height="247.2" width="247.2" x="-123.6" y="-123.6"></use><use xlink:href="#VSA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SSA" fill="black" height="26.769" width="26.769" x="-111.784" y="-119"></use><g transform="rotate(180)"><use xlink:href="#VSA" height="32" width="32" x="-114.4" y="-156"></use><use xlink:href="#SSA" fill="black" height="26.769" width="26.769" x="-111.784" y="-119"></use></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

2
public/cards/JC.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

2
public/cards/JD.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

2
public/cards/JH.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

2
public/cards/JS.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 42 KiB

2
public/cards/KC.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 37 KiB

2
public/cards/KD.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

2
public/cards/KH.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

2
public/cards/KS.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 62 KiB

2
public/cards/QC.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 41 KiB

2
public/cards/QD.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 42 KiB

2
public/cards/QH.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 47 KiB

2
public/cards/QS.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

1
public/file.svg Normal file
View File

@@ -0,0 +1 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 391 B

1
public/globe.svg Normal file
View File

@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

1
public/next.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
public/vercel.svg Normal file
View File

@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 128 B

1
public/window.svg Normal file
View File

@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>

After

Width:  |  Height:  |  Size: 385 B

View File

@@ -2,7 +2,7 @@ import next from 'next';
import { createServer } from 'http'; import { createServer } from 'http';
import { Server as SocketIOServer, type Socket } from 'socket.io'; import { Server as SocketIOServer, type Socket } from 'socket.io';
//import GameStore from '@/lib/GameStore'; import GameStore from './lib/GameStore';
const dev = process.env.NODE_ENV !== 'production'; const dev = process.env.NODE_ENV !== 'production';
const hostname = 'localhost'; const hostname = 'localhost';
@@ -12,7 +12,7 @@ const port = 3000;
const app = next({ dev, hostname, port }); const app = next({ dev, hostname, port });
const handler = app.getRequestHandler(); const handler = app.getRequestHandler();
//const gameStore = new GameStore(); const gameStore = new GameStore();
app.prepare().then(() => { app.prepare().then(() => {
const httpServer = createServer(handler); const httpServer = createServer(handler);
@@ -24,22 +24,20 @@ app.prepare().then(() => {
socket.on('join', (gameID) => { socket.on('join', (gameID) => {
socket.join(gameID); socket.join(gameID);
//const game = gameStore.joinGame(gameID, socket.id); const game = gameStore.joinGame(gameID, socket.id);
console.log(`Socket ${socket.id} joined game ${gameID}`) console.log(`Socket ${socket.id} joined game ${gameID}`)
//socket.emit('init', { cards: game.cards }); socket.emit('init', { cards: game.cards });
socket.emit('init', { id: socket.id });
}) })
socket.on('flip-card', ({ gameID, cardID }) => { socket.on('flip-card', ({ gameID, cardID }) => {
console.log('Card flipped:', { gameID, cardID }); console.log('Card flipped:', { gameID, cardID });
//const game = gameStore.flipCard(gameID, cardID); const game = gameStore.flipCard(gameID, cardID);
//io.to(gameID).emit('card-flipped', { gameID, cards: game.cards }); io.to(gameID).emit('card-flipped', { gameID, cards: game.cards });
io.to(gameID).emit('card-flipped', { id: socket.id });
}); });
socket.on('disconnect', (obj) => { socket.on('disconnect', () => {
console.log(`Client disconnected: ${socket.id}`); console.log(`Client disconnected: ${socket.id}`);
}); });
}); });

12
tools/getRandomItems.js Normal file
View File

@@ -0,0 +1,12 @@
export default function getRandomItems(items, count) {
const shuffled = [...items];
// Fisher-Yates shuffle
for (let i = shuffled.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
}
return count > shuffled.length ? shuffled : shuffled.slice(0, count);
}

11
tools/getRandomItems.ts Normal file
View File

@@ -0,0 +1,11 @@
export default function getRandomItems<T>(items: T[], count: number): T[] {
const shuffled = [...items];
// Fisher-Yates shuffle
for (let i = shuffled.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
}
return count > shuffled.length ? shuffled : shuffled.slice(0, count);
}

8
tools/simpleID.ts Normal file
View File

@@ -0,0 +1,8 @@
import { customAlphabet } from 'nanoid';
const alphabet =
'0123456789abcdefghijklmnopqrstuvwxyz';
const generateID = (length: number = 6) => customAlphabet(alphabet, length);
export default generateID;

View File

@@ -19,6 +19,9 @@
"name": "next" "name": "next"
} }
], ],
"paths": {
"@/*": ["./*"]
},
"strictNullChecks": true "strictNullChecks": true
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],

19
types/index.ts Normal file
View File

@@ -0,0 +1,19 @@
export interface CardImage {
id: string;
back: boolean;
face: boolean;
joker: boolean;
suit: 'Clubs' | 'Diamonds' | 'Hearts' | 'Spades' | null;
url: string;
}
export interface GameCard extends CardImage {
flipped: boolean;
}
export interface GameState {
id: string;
players: Set<string>;
cards: GameCard[];
lastUpdated: number;
}