Compare commits
51 Commits
6905f26b56
...
v0.25.1
| Author | SHA1 | Date | |
|---|---|---|---|
| ab35fcf906 | |||
| 32991301dd | |||
| c5fd928dcb | |||
| f6907671be | |||
| a54fff7257 | |||
| 533bcec2d8 | |||
| ba786f5a09 | |||
| 7ee7cb6d93 | |||
| 14324b09ef | |||
| 124f1f5cf5 | |||
| a6a73b5f36 | |||
| b84fe79806 | |||
| 3248f00d66 | |||
| c680a043ae | |||
| d0ab7ed97b | |||
| 1144a96757 | |||
| ac6668cee7 | |||
| eba1f66b45 | |||
| 90959728b1 | |||
| 8b30f8778b | |||
| d6a7924f14 | |||
| 4db43fb3fb | |||
| 01d6b27e61 | |||
| 3cffbc2c51 | |||
| 2ef25934ac | |||
| bb670d6cc6 | |||
| 76911c57c9 | |||
| 8391235a1a | |||
| 2f3a6b9586 | |||
| 4d20b70809 | |||
| bfadcf0e0d | |||
| 356dbebe57 | |||
| c90c783177 | |||
| bbf4b2c14a | |||
| 62be72e918 | |||
| 1f46785b31 | |||
| 2e5d82f83c | |||
| 396ba6bc97 | |||
| 88298206bb | |||
| 0f65031114 | |||
| c91ce9436e | |||
| ace96b4a47 | |||
| ea079af9e1 | |||
| c66d81c73a | |||
| 20b7a617e0 | |||
| 7a0d57b2b1 | |||
| 93ec4a7478 | |||
| 72dfd741c4 | |||
| 3837a10b15 | |||
| 574115cb71 | |||
| 1707553790 |
@@ -0,0 +1,131 @@
|
|||||||
|
name: Android Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
# Rebuild whenever app/engine/asset code changes.
|
||||||
|
# Skip server-only, deploy, and doc changes.
|
||||||
|
paths-ignore:
|
||||||
|
- 'deploy/**'
|
||||||
|
- 'argocd/**'
|
||||||
|
- 'solitaire_server/**'
|
||||||
|
- '**.md'
|
||||||
|
|
||||||
|
env:
|
||||||
|
ANDROID_SDK: /opt/android-sdk
|
||||||
|
NDK_VERSION: "25.2.9519653"
|
||||||
|
BUILD_TOOLS_VERSION: "34.0.0"
|
||||||
|
PLATFORM: "android-34"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-apk:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set short SHA
|
||||||
|
id: meta
|
||||||
|
run: echo "sha=${GITHUB_SHA::8}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# ── System dependencies ────────────────────────────────────────────
|
||||||
|
- name: Install system dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y openjdk-17-jdk-headless unzip zip
|
||||||
|
|
||||||
|
# ── Android SDK (shared cache key with release workflow) ──────────
|
||||||
|
- name: Cache Android SDK
|
||||||
|
uses: actions/cache@v4
|
||||||
|
id: sdk-cache
|
||||||
|
with:
|
||||||
|
path: ${{ env.ANDROID_SDK }}
|
||||||
|
key: v2-android-sdk-ndk${{ env.NDK_VERSION }}-bt${{ env.BUILD_TOOLS_VERSION }}
|
||||||
|
|
||||||
|
- name: Install Android SDK + NDK
|
||||||
|
if: steps.sdk-cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
sudo mkdir -p ${{ env.ANDROID_SDK }}/cmdline-tools
|
||||||
|
curl -sL \
|
||||||
|
"https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" \
|
||||||
|
-o /tmp/cmdtools.zip
|
||||||
|
unzip -q /tmp/cmdtools.zip -d /tmp/cmdtools
|
||||||
|
sudo mv /tmp/cmdtools/cmdline-tools ${{ env.ANDROID_SDK }}/cmdline-tools/latest
|
||||||
|
yes | sudo ${{ env.ANDROID_SDK }}/cmdline-tools/latest/bin/sdkmanager \
|
||||||
|
--sdk_root=${{ env.ANDROID_SDK }} --licenses > /dev/null 2>&1 || true
|
||||||
|
sudo ${{ env.ANDROID_SDK }}/cmdline-tools/latest/bin/sdkmanager \
|
||||||
|
--sdk_root=${{ env.ANDROID_SDK }} \
|
||||||
|
"build-tools;${{ env.BUILD_TOOLS_VERSION }}" \
|
||||||
|
"platforms;${{ env.PLATFORM }}" \
|
||||||
|
"ndk;${{ env.NDK_VERSION }}"
|
||||||
|
|
||||||
|
# ── Rust toolchain ─────────────────────────────────────────────────
|
||||||
|
- name: Install Rust stable
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
||||||
|
| sh -s -- -y --default-toolchain stable --no-modify-path
|
||||||
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Add Android cross-compilation targets
|
||||||
|
run: |
|
||||||
|
rustup target add \
|
||||||
|
aarch64-linux-android \
|
||||||
|
armv7-linux-androideabi \
|
||||||
|
x86_64-linux-android
|
||||||
|
|
||||||
|
# ── Cargo caches ───────────────────────────────────────────────────
|
||||||
|
- name: Cache Cargo registry
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/registry/index
|
||||||
|
~/.cargo/registry/cache
|
||||||
|
~/.cargo/git/db
|
||||||
|
key: cargo-registry-${{ hashFiles('**/Cargo.lock') }}
|
||||||
|
restore-keys: cargo-registry-
|
||||||
|
|
||||||
|
- name: Cache cargo-ndk binary
|
||||||
|
uses: actions/cache@v4
|
||||||
|
id: ndk-tool-cache
|
||||||
|
with:
|
||||||
|
path: ~/.cargo/bin/cargo-ndk
|
||||||
|
key: cargo-ndk-${{ runner.os }}-stable
|
||||||
|
|
||||||
|
- name: Cache build artifacts
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: target
|
||||||
|
key: android-target-${{ hashFiles('**/Cargo.lock') }}-${{ github.sha }}
|
||||||
|
restore-keys: android-target-${{ hashFiles('**/Cargo.lock') }}-
|
||||||
|
|
||||||
|
- name: Install cargo-ndk
|
||||||
|
if: steps.ndk-tool-cache.outputs.cache-hit != 'true'
|
||||||
|
run: cargo install cargo-ndk --locked
|
||||||
|
|
||||||
|
# ── Build APK ──────────────────────────────────────────────────────
|
||||||
|
# Debug CI only builds arm64-v8a — full three-ABI debug builds blow
|
||||||
|
# past the runner's disk budget (~25 GB of target/ + intermediate
|
||||||
|
# APKs caused apksigner to OOM-on-disk in the previous run). Release
|
||||||
|
# CI still ships all three ABIs from android-release.yml.
|
||||||
|
- name: Build debug APK
|
||||||
|
env:
|
||||||
|
ANDROID_HOME: ${{ env.ANDROID_SDK }}
|
||||||
|
ANDROID_NDK_HOME: ${{ env.ANDROID_SDK }}/ndk/${{ env.NDK_VERSION }}
|
||||||
|
BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOLS_VERSION }}
|
||||||
|
PLATFORM: ${{ env.PLATFORM }}
|
||||||
|
PROFILE: debug
|
||||||
|
ABIS: arm64-v8a
|
||||||
|
run: ./scripts/build_android_apk.sh
|
||||||
|
|
||||||
|
# ── Artifact ───────────────────────────────────────────────────────
|
||||||
|
# Pinned to v3 because Gitea Actions doesn't implement the github.com
|
||||||
|
# artifact service that upload-artifact@v4+ requires; v3 uses the
|
||||||
|
# older chunked HTTP API that Gitea's GHES-compatibility layer
|
||||||
|
# supports.
|
||||||
|
- name: Upload APK
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: solitaire-quest-debug-${{ steps.meta.outputs.sha }}
|
||||||
|
path: target/debug/apk/solitaire-quest.apk
|
||||||
|
retention-days: 30
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
name: Android Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*.*.*'
|
||||||
|
|
||||||
|
env:
|
||||||
|
ANDROID_SDK: /opt/android-sdk
|
||||||
|
NDK_VERSION: "25.2.9519653"
|
||||||
|
BUILD_TOOLS_VERSION: "34.0.0"
|
||||||
|
PLATFORM: "android-34"
|
||||||
|
GITEA_API: https://git.aleshym.co/api/v1
|
||||||
|
REPO: funman300/Rusty_Solitare
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-release-apk:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Extract version from tag
|
||||||
|
id: meta
|
||||||
|
run: echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# ── Free disk space ────────────────────────────────────────────────
|
||||||
|
# A 2-ABI release build (arm64 + armv7) generates ~15 GB of target/
|
||||||
|
# output. Remove pre-installed runner tooling that is never used
|
||||||
|
# during an Android build to reclaim ~10 GB before we start.
|
||||||
|
- name: Free disk space
|
||||||
|
run: |
|
||||||
|
sudo rm -rf /usr/local/lib/android # runner pre-installed SDK
|
||||||
|
sudo rm -rf /usr/share/dotnet
|
||||||
|
sudo rm -rf /opt/ghc
|
||||||
|
sudo rm -rf /usr/local/share/boost
|
||||||
|
df -h /
|
||||||
|
|
||||||
|
# ── System dependencies ────────────────────────────────────────────
|
||||||
|
- name: Install system dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y openjdk-17-jdk-headless unzip zip jq
|
||||||
|
|
||||||
|
# ── Android SDK (shared cache key with debug workflow) ─────────────
|
||||||
|
- name: Cache Android SDK
|
||||||
|
uses: actions/cache@v4
|
||||||
|
id: sdk-cache
|
||||||
|
with:
|
||||||
|
path: ${{ env.ANDROID_SDK }}
|
||||||
|
key: v2-android-sdk-ndk${{ env.NDK_VERSION }}-bt${{ env.BUILD_TOOLS_VERSION }}
|
||||||
|
|
||||||
|
- name: Install Android SDK + NDK
|
||||||
|
if: steps.sdk-cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
sudo mkdir -p ${{ env.ANDROID_SDK }}/cmdline-tools
|
||||||
|
curl -sL \
|
||||||
|
"https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" \
|
||||||
|
-o /tmp/cmdtools.zip
|
||||||
|
unzip -q /tmp/cmdtools.zip -d /tmp/cmdtools
|
||||||
|
sudo mv /tmp/cmdtools/cmdline-tools ${{ env.ANDROID_SDK }}/cmdline-tools/latest
|
||||||
|
yes | sudo ${{ env.ANDROID_SDK }}/cmdline-tools/latest/bin/sdkmanager \
|
||||||
|
--sdk_root=${{ env.ANDROID_SDK }} --licenses > /dev/null 2>&1 || true
|
||||||
|
sudo ${{ env.ANDROID_SDK }}/cmdline-tools/latest/bin/sdkmanager \
|
||||||
|
--sdk_root=${{ env.ANDROID_SDK }} \
|
||||||
|
"build-tools;${{ env.BUILD_TOOLS_VERSION }}" \
|
||||||
|
"platforms;${{ env.PLATFORM }}" \
|
||||||
|
"ndk;${{ env.NDK_VERSION }}"
|
||||||
|
|
||||||
|
# ── Rust toolchain ─────────────────────────────────────────────────
|
||||||
|
- name: Install Rust stable
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
||||||
|
| sh -s -- -y --default-toolchain stable --no-modify-path
|
||||||
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Add Android cross-compilation targets
|
||||||
|
run: |
|
||||||
|
rustup target add \
|
||||||
|
aarch64-linux-android \
|
||||||
|
armv7-linux-androideabi
|
||||||
|
|
||||||
|
# ── Cargo caches ───────────────────────────────────────────────────
|
||||||
|
- name: Cache Cargo registry
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/registry/index
|
||||||
|
~/.cargo/registry/cache
|
||||||
|
~/.cargo/git/db
|
||||||
|
key: cargo-registry-${{ hashFiles('**/Cargo.lock') }}
|
||||||
|
restore-keys: cargo-registry-
|
||||||
|
|
||||||
|
- name: Cache cargo-ndk binary
|
||||||
|
uses: actions/cache@v4
|
||||||
|
id: ndk-tool-cache
|
||||||
|
with:
|
||||||
|
path: ~/.cargo/bin/cargo-ndk
|
||||||
|
key: cargo-ndk-${{ runner.os }}-stable
|
||||||
|
|
||||||
|
- name: Cache build artifacts
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: target
|
||||||
|
key: android-release-target-${{ hashFiles('**/Cargo.lock') }}-${{ github.sha }}
|
||||||
|
restore-keys: android-release-target-${{ hashFiles('**/Cargo.lock') }}-
|
||||||
|
|
||||||
|
- name: Install cargo-ndk
|
||||||
|
if: steps.ndk-tool-cache.outputs.cache-hit != 'true'
|
||||||
|
run: cargo install cargo-ndk --locked
|
||||||
|
|
||||||
|
# ── Build & sign with release keystore ─────────────────────────────
|
||||||
|
- name: Decode keystore
|
||||||
|
run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > /tmp/solitaire-release.jks
|
||||||
|
|
||||||
|
- name: Build signed release APK
|
||||||
|
env:
|
||||||
|
ANDROID_HOME: ${{ env.ANDROID_SDK }}
|
||||||
|
ANDROID_NDK_HOME: ${{ env.ANDROID_SDK }}/ndk/${{ env.NDK_VERSION }}
|
||||||
|
BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOLS_VERSION }}
|
||||||
|
PLATFORM: ${{ env.PLATFORM }}
|
||||||
|
PROFILE: release
|
||||||
|
# arm64-v8a covers all modern Android phones; armeabi-v7a covers
|
||||||
|
# legacy ARM devices. x86_64 is emulator-only and dropped to
|
||||||
|
# stay within the runner's ~25 GB disk budget.
|
||||||
|
ABIS: arm64-v8a armeabi-v7a
|
||||||
|
KEYSTORE: /tmp/solitaire-release.jks
|
||||||
|
KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }}
|
||||||
|
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
|
||||||
|
KEY_PASS: ${{ secrets.KEY_PASS }}
|
||||||
|
APK_OUT: ferrous-solitaire-${{ steps.meta.outputs.tag }}.apk
|
||||||
|
run: ./scripts/build_android_apk.sh
|
||||||
|
|
||||||
|
# ── Publish to Gitea release ───────────────────────────────────────
|
||||||
|
- name: Create Gitea release
|
||||||
|
id: release
|
||||||
|
run: |
|
||||||
|
TAG="${{ steps.meta.outputs.tag }}"
|
||||||
|
RESPONSE=$(curl -s -o /tmp/release.json -w "%{http_code}" \
|
||||||
|
-X POST "$GITEA_API/repos/$REPO/releases" \
|
||||||
|
-H "Authorization: token ${{ secrets.CI_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"draft\":false,\"prerelease\":false}")
|
||||||
|
if [ "$RESPONSE" = "409" ]; then
|
||||||
|
curl -sf "$GITEA_API/repos/$REPO/releases/tags/$TAG" \
|
||||||
|
-H "Authorization: token ${{ secrets.CI_TOKEN }}" \
|
||||||
|
> /tmp/release.json
|
||||||
|
elif [ "$RESPONSE" != "201" ]; then
|
||||||
|
echo "Release creation failed with HTTP $RESPONSE"
|
||||||
|
cat /tmp/release.json
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
RELEASE_ID=$(jq -r '.id' /tmp/release.json)
|
||||||
|
echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Upload signed APK
|
||||||
|
run: |
|
||||||
|
TAG="${{ steps.meta.outputs.tag }}"
|
||||||
|
APK="ferrous-solitaire-${TAG}.apk"
|
||||||
|
curl -sf -X POST \
|
||||||
|
"$GITEA_API/repos/$REPO/releases/${{ steps.release.outputs.release_id }}/assets?name=$APK" \
|
||||||
|
-H "Authorization: token ${{ secrets.CI_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/octet-stream" \
|
||||||
|
--data-binary @"$APK"
|
||||||
@@ -20,4 +20,4 @@ resources:
|
|||||||
images:
|
images:
|
||||||
- name: solitaire-server
|
- name: solitaire-server
|
||||||
newName: git.aleshym.co/funman300/solitaire-server
|
newName: git.aleshym.co/funman300/solitaire-server
|
||||||
newTag: 3e006a1e
|
newTag: f6907671
|
||||||
|
|||||||
@@ -17,18 +17,20 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: matomo
|
- name: matomo
|
||||||
image: bitnami/matomo:5
|
image: matomo:5.10.0
|
||||||
env:
|
env:
|
||||||
- name: MATOMO_DATABASE_HOST
|
- name: MATOMO_DATABASE_HOST
|
||||||
value: mariadb
|
value: mariadb
|
||||||
- name: MATOMO_DATABASE_PORT_NUMBER
|
- name: MATOMO_DATABASE_PORT
|
||||||
value: "3306"
|
value: "3306"
|
||||||
- name: MATOMO_DATABASE_NAME
|
- name: MATOMO_DATABASE_ADAPTER
|
||||||
|
value: PDO\MYSQL
|
||||||
|
- name: MATOMO_DATABASE_DBNAME
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: matomo-secret
|
name: matomo-secret
|
||||||
key: MYSQL_DATABASE
|
key: MYSQL_DATABASE
|
||||||
- name: MATOMO_DATABASE_USER
|
- name: MATOMO_DATABASE_USERNAME
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: matomo-secret
|
name: matomo-secret
|
||||||
@@ -38,40 +40,32 @@ spec:
|
|||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: matomo-secret
|
name: matomo-secret
|
||||||
key: MYSQL_PASSWORD
|
key: MYSQL_PASSWORD
|
||||||
- name: MATOMO_USERNAME
|
# Traefik terminates SSL; tell Matomo to trust X-Forwarded-* headers
|
||||||
value: admin
|
- name: MATOMO_GENERAL_ASSUME_SECURE_PROTOCOL
|
||||||
- name: MATOMO_PASSWORD
|
value: "1"
|
||||||
valueFrom:
|
- name: MATOMO_GENERAL_PROXY_CLIENT_HEADERS
|
||||||
secretKeyRef:
|
value: HTTP_X_FORWARDED_FOR
|
||||||
name: matomo-secret
|
- name: MATOMO_GENERAL_PROXY_HOST_HEADERS
|
||||||
key: MATOMO_ADMIN_PASSWORD
|
value: HTTP_X_FORWARDED_HOST
|
||||||
- name: MATOMO_EMAIL
|
|
||||||
value: funman300@gmail.com
|
|
||||||
- name: MATOMO_WEBSITE_NAME
|
|
||||||
value: "Solitaire Quest"
|
|
||||||
- name: MATOMO_WEBSITE_HOST
|
|
||||||
value: "https://klondike.aleshym.co"
|
|
||||||
- name: MATOMO_HOST
|
|
||||||
value: analytics.aleshym.co
|
|
||||||
- name: MATOMO_ENABLE_PROXY_URI_HEADER
|
|
||||||
value: "yes"
|
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 8080
|
- containerPort: 80
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: matomo-data
|
- name: matomo-data
|
||||||
mountPath: /bitnami/matomo
|
mountPath: /var/www/html
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /index.php
|
path: /matomo.php
|
||||||
port: 8080
|
port: 80
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 30
|
periodSeconds: 30
|
||||||
|
timeoutSeconds: 5
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /index.php
|
path: /matomo.php
|
||||||
port: 8080
|
port: 80
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
periodSeconds: 10
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
cpu: 100m
|
cpu: 100m
|
||||||
|
|||||||
@@ -9,4 +9,4 @@ spec:
|
|||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
port: 80
|
port: 80
|
||||||
targetPort: 8080
|
targetPort: 80
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build a self-signed Android APK from solitaire_app's cdylib targets.
|
||||||
|
#
|
||||||
|
# Replaces the cargo-apk pipeline with explicit cargo-ndk + aapt2 + apksigner
|
||||||
|
# steps. The CI runner was hitting an SDK-discovery bug inside cargo-apk's
|
||||||
|
# ndk-build crate that we couldn't isolate; running each Android toolchain
|
||||||
|
# step explicitly gives us a debuggable pipeline.
|
||||||
|
#
|
||||||
|
# Required environment:
|
||||||
|
# ANDROID_HOME Path to Android SDK root
|
||||||
|
# ANDROID_NDK_HOME Path to the specific NDK version
|
||||||
|
# BUILD_TOOLS_VERSION e.g. "34.0.0"
|
||||||
|
# PLATFORM e.g. "android-34"
|
||||||
|
#
|
||||||
|
# Optional environment:
|
||||||
|
# PROFILE "debug" (default) | "release"
|
||||||
|
# ABIS Space-separated Android ABIs to build (default:
|
||||||
|
# "arm64-v8a armeabi-v7a x86_64"). Reduce in CI to
|
||||||
|
# fit the runner's disk budget — a full three-ABI
|
||||||
|
# debug build can exceed 25 GB of target/ output.
|
||||||
|
# APK_OUT Output APK path (default: target/$PROFILE/apk/solitaire-quest.apk)
|
||||||
|
# KEYSTORE Path to keystore for signing (default: generates a debug keystore)
|
||||||
|
# KEYSTORE_PASS Keystore password (default: "android" for the generated debug keystore)
|
||||||
|
# KEY_ALIAS Key alias (default: "androiddebugkey")
|
||||||
|
# KEY_PASS Key password (default: same as KEYSTORE_PASS)
|
||||||
|
#
|
||||||
|
# Outputs:
|
||||||
|
# $APK_OUT Signed, zipaligned APK
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
: "${ANDROID_HOME:?ANDROID_HOME must be set}"
|
||||||
|
: "${ANDROID_NDK_HOME:?ANDROID_NDK_HOME must be set}"
|
||||||
|
: "${BUILD_TOOLS_VERSION:?BUILD_TOOLS_VERSION must be set}"
|
||||||
|
: "${PLATFORM:?PLATFORM must be set (e.g. android-34)}"
|
||||||
|
|
||||||
|
PROFILE="${PROFILE:-debug}"
|
||||||
|
ABIS="${ABIS:-arm64-v8a armeabi-v7a x86_64}"
|
||||||
|
APK_OUT="${APK_OUT:-target/${PROFILE}/apk/solitaire-quest.apk}"
|
||||||
|
|
||||||
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
cd "$REPO_ROOT"
|
||||||
|
|
||||||
|
BT="$ANDROID_HOME/build-tools/$BUILD_TOOLS_VERSION"
|
||||||
|
PLATFORM_JAR="$ANDROID_HOME/platforms/$PLATFORM/android.jar"
|
||||||
|
MANIFEST="solitaire_app/android/AndroidManifest.xml"
|
||||||
|
RES_DIR="solitaire_app/res"
|
||||||
|
ASSETS_DIR="assets"
|
||||||
|
|
||||||
|
# --- sanity ----------------------------------------------------------------
|
||||||
|
for f in "$BT/aapt2" "$BT/zipalign" "$BT/apksigner" "$PLATFORM_JAR" "$MANIFEST"; do
|
||||||
|
[ -e "$f" ] || { echo "missing: $f"; exit 1; }
|
||||||
|
done
|
||||||
|
|
||||||
|
STAGING="$(mktemp -d)"
|
||||||
|
trap 'rm -rf "$STAGING"' EXIT
|
||||||
|
mkdir -p "$STAGING/lib" "$STAGING/compiled-res"
|
||||||
|
|
||||||
|
# --- 1. native libraries via cargo-ndk -------------------------------------
|
||||||
|
# `-o $STAGING/lib` lays out files as $STAGING/lib/<abi>/libsolitaire_app.so
|
||||||
|
# which is the directory structure the APK expects under lib/.
|
||||||
|
CARGO_NDK_ARGS=( --platform 26 -o "$STAGING/lib" )
|
||||||
|
for abi in $ABIS; do
|
||||||
|
CARGO_NDK_ARGS+=( -t "$abi" )
|
||||||
|
done
|
||||||
|
CARGO_NDK_ARGS+=( build --package solitaire_app --lib )
|
||||||
|
if [ "$PROFILE" = "release" ]; then
|
||||||
|
CARGO_NDK_ARGS+=( --release )
|
||||||
|
fi
|
||||||
|
echo ">>> cargo ndk ${CARGO_NDK_ARGS[*]}"
|
||||||
|
cargo ndk "${CARGO_NDK_ARGS[@]}"
|
||||||
|
|
||||||
|
# --- 2. compile + link resources and manifest ------------------------------
|
||||||
|
if [ -d "$RES_DIR" ]; then
|
||||||
|
echo ">>> aapt2 compile resources"
|
||||||
|
"$BT/aapt2" compile --dir "$RES_DIR" -o "$STAGING/compiled-res"
|
||||||
|
fi
|
||||||
|
|
||||||
|
LINK_ARGS=(
|
||||||
|
link
|
||||||
|
-o "$STAGING/app-unsigned.apk"
|
||||||
|
-I "$PLATFORM_JAR"
|
||||||
|
--manifest "$MANIFEST"
|
||||||
|
)
|
||||||
|
[ -d "$ASSETS_DIR" ] && LINK_ARGS+=( -A "$ASSETS_DIR" )
|
||||||
|
# Add compiled resources if any
|
||||||
|
shopt -s nullglob
|
||||||
|
RES_FLATS=( "$STAGING/compiled-res"/*.flat )
|
||||||
|
shopt -u nullglob
|
||||||
|
if [ ${#RES_FLATS[@]} -gt 0 ]; then
|
||||||
|
LINK_ARGS+=( "${RES_FLATS[@]}" )
|
||||||
|
fi
|
||||||
|
echo ">>> aapt2 link"
|
||||||
|
"$BT/aapt2" "${LINK_ARGS[@]}"
|
||||||
|
|
||||||
|
# --- 3. add native libraries to the APK ------------------------------------
|
||||||
|
echo ">>> bundle native libraries"
|
||||||
|
( cd "$STAGING" && zip -r -q app-unsigned.apk lib/ )
|
||||||
|
|
||||||
|
# --- 4. zipalign -----------------------------------------------------------
|
||||||
|
echo ">>> zipalign"
|
||||||
|
"$BT/zipalign" -p -f 4 "$STAGING/app-unsigned.apk" "$STAGING/app-aligned.apk"
|
||||||
|
# Free the unsigned intermediate now — apksigner reads $app-aligned.apk and
|
||||||
|
# writes $APK_OUT, and the runner's disk is tight after a multi-ABI build.
|
||||||
|
rm -f "$STAGING/app-unsigned.apk"
|
||||||
|
|
||||||
|
# --- 5. sign ---------------------------------------------------------------
|
||||||
|
if [ -z "${KEYSTORE:-}" ]; then
|
||||||
|
# Generate a deterministic debug keystore on the fly.
|
||||||
|
KEYSTORE="$STAGING/debug.keystore"
|
||||||
|
KEYSTORE_PASS="${KEYSTORE_PASS:-android}"
|
||||||
|
KEY_ALIAS="${KEY_ALIAS:-androiddebugkey}"
|
||||||
|
KEY_PASS="${KEY_PASS:-$KEYSTORE_PASS}"
|
||||||
|
echo ">>> generating debug keystore at $KEYSTORE"
|
||||||
|
keytool -genkeypair -v \
|
||||||
|
-keystore "$KEYSTORE" \
|
||||||
|
-storepass "$KEYSTORE_PASS" \
|
||||||
|
-alias "$KEY_ALIAS" \
|
||||||
|
-keypass "$KEY_PASS" \
|
||||||
|
-keyalg RSA -keysize 2048 -validity 10000 \
|
||||||
|
-dname "CN=Android Debug,O=Android,C=US" > /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
KEYSTORE_PASS="${KEYSTORE_PASS:-android}"
|
||||||
|
KEY_ALIAS="${KEY_ALIAS:-androiddebugkey}"
|
||||||
|
KEY_PASS="${KEY_PASS:-$KEYSTORE_PASS}"
|
||||||
|
|
||||||
|
mkdir -p "$(dirname "$APK_OUT")"
|
||||||
|
echo ">>> apksigner sign -> $APK_OUT"
|
||||||
|
"$BT/apksigner" sign \
|
||||||
|
--ks "$KEYSTORE" \
|
||||||
|
--ks-pass "pass:$KEYSTORE_PASS" \
|
||||||
|
--ks-key-alias "$KEY_ALIAS" \
|
||||||
|
--key-pass "pass:$KEY_PASS" \
|
||||||
|
--out "$APK_OUT" \
|
||||||
|
"$STAGING/app-aligned.apk"
|
||||||
|
|
||||||
|
echo ">>> verify"
|
||||||
|
"$BT/apksigner" verify --verbose "$APK_OUT"
|
||||||
|
|
||||||
|
echo ">>> done: $APK_OUT"
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Mirrors what cargo-apk would generate from [package.metadata.android]
|
||||||
|
in solitaire_app/Cargo.toml. Kept in-tree so the CI workflow can drive
|
||||||
|
aapt2 directly without going through cargo-apk's brittle SDK discovery.
|
||||||
|
|
||||||
|
Keep in sync with:
|
||||||
|
* Cargo.toml: package, min_sdk_version, target_sdk_version,
|
||||||
|
uses_feature, uses_permission, application label/icon,
|
||||||
|
activity orientation
|
||||||
|
* [lib].name (currently "solitaire_app") — matches the
|
||||||
|
`android.app.lib_name` meta-data value below, which is the
|
||||||
|
shared object name without the `lib` prefix or `.so` suffix.
|
||||||
|
-->
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.solitairequest.app"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="26"
|
||||||
|
android:targetSdkVersion="34" />
|
||||||
|
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.touchscreen"
|
||||||
|
android:required="true" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:label="Ferrous Solitaire"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:hasCode="false">
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="android.app.NativeActivity"
|
||||||
|
android:exported="true"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation|screenLayout">
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="android.app.lib_name"
|
||||||
|
android:value="solitaire_app" />
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
@@ -143,11 +143,10 @@ pub struct Settings {
|
|||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub window_geometry: Option<WindowGeometry>,
|
pub window_geometry: Option<WindowGeometry>,
|
||||||
/// Identifier of the active card-art theme. Matches `meta.id` from
|
/// Identifier of the active card-art theme. Matches `meta.id` from
|
||||||
/// the theme's `theme.ron` manifest. `"default"` is the bundled
|
/// the theme's `theme.ron` manifest. `"dark"` and `"classic"` are
|
||||||
/// theme and is always present in the registry; user-supplied
|
/// always present; user-supplied themes register under their own ids.
|
||||||
/// themes register under their own ids when they're imported.
|
/// Older `settings.json` files that stored `"default"` or `"classic"`
|
||||||
/// Older `settings.json` files default cleanly to `"default"` via
|
/// are migrated to `"dark"` by [`Settings::sanitized`].
|
||||||
/// `#[serde(default = ...)]`.
|
|
||||||
#[serde(default = "default_theme_id")]
|
#[serde(default = "default_theme_id")]
|
||||||
pub selected_theme_id: String,
|
pub selected_theme_id: String,
|
||||||
/// Set to `true` once the achievement-onboarding info-toast has been
|
/// Set to `true` once the achievement-onboarding info-toast has been
|
||||||
@@ -273,7 +272,7 @@ fn default_music_volume() -> f32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn default_theme_id() -> String {
|
fn default_theme_id() -> String {
|
||||||
"default".to_string()
|
"dark".to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default tooltip-hover dwell delay in seconds. Mirrors
|
/// Default tooltip-hover dwell delay in seconds. Mirrors
|
||||||
@@ -396,6 +395,13 @@ impl Settings {
|
|||||||
/// their respective ranges after deserialization or hand-editing of
|
/// their respective ranges after deserialization or hand-editing of
|
||||||
/// `settings.json`.
|
/// `settings.json`.
|
||||||
pub fn sanitized(self) -> Self {
|
pub fn sanitized(self) -> Self {
|
||||||
|
// Migrate stale theme IDs: "default" was removed when the theme was
|
||||||
|
// renamed to "dark"; "classic" was briefly the default before "dark"
|
||||||
|
// was restored as the shipped default.
|
||||||
|
let selected_theme_id = match self.selected_theme_id.as_str() {
|
||||||
|
"default" | "classic" => "dark".to_string(),
|
||||||
|
_ => self.selected_theme_id,
|
||||||
|
};
|
||||||
Self {
|
Self {
|
||||||
sfx_volume: self.sfx_volume.clamp(0.0, 1.0),
|
sfx_volume: self.sfx_volume.clamp(0.0, 1.0),
|
||||||
music_volume: self.music_volume.clamp(0.0, 1.0),
|
music_volume: self.music_volume.clamp(0.0, 1.0),
|
||||||
@@ -408,6 +414,7 @@ impl Settings {
|
|||||||
replay_move_interval_secs: self
|
replay_move_interval_secs: self
|
||||||
.replay_move_interval_secs
|
.replay_move_interval_secs
|
||||||
.clamp(REPLAY_MOVE_INTERVAL_MIN_SECS, REPLAY_MOVE_INTERVAL_MAX_SECS),
|
.clamp(REPLAY_MOVE_INTERVAL_MIN_SECS, REPLAY_MOVE_INTERVAL_MAX_SECS),
|
||||||
|
selected_theme_id,
|
||||||
..self
|
..self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<defs>
|
||||||
|
<pattern id="dp" x="0" y="0" width="28" height="28" patternUnits="userSpaceOnUse">
|
||||||
|
<rect width="28" height="28" fill="#1a3a6e"/>
|
||||||
|
<polygon points="14,2 26,14 14,26 2,14" fill="#2255aa"/>
|
||||||
|
<polygon points="14,7 21,14 14,21 7,14" fill="#1a3a6e"/>
|
||||||
|
</pattern>
|
||||||
|
</defs>
|
||||||
|
<!-- White card background -->
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14" fill="#FAFAF8"/>
|
||||||
|
<!-- Red outer border -->
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="none" stroke="#CC1111" stroke-width="4"/>
|
||||||
|
<!-- Navy diamond pattern inset -->
|
||||||
|
<rect x="16" y="16" width="224" height="352" rx="8" ry="8" fill="url(#dp)"/>
|
||||||
|
<!-- Thin red frame around pattern -->
|
||||||
|
<rect x="16" y="16" width="224" height="352" rx="8" ry="8"
|
||||||
|
fill="none" stroke="#CC1111" stroke-width="2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 924 B |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,2 L 30,16 L 16,30 L 2,16 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#CC1111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#CC1111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="11" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">10</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">2</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">3</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">4</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">5</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">6</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">7</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">8</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">9</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">A</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">J</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">K</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
|
||||||
|
<rect x="2" y="2" width="252" height="380" rx="14" ry="14"
|
||||||
|
fill="#FAFAF8" stroke="#AAAAAA" stroke-width="1.5"/>
|
||||||
|
|
||||||
|
<!-- Top-left corner: rank label + small suit -->
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Centre: large suit, 64x64 in 256x384 card -->
|
||||||
|
<g transform="translate(96 160) scale(2)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Bottom-right corner: mirrored via 180° rotation around card centre -->
|
||||||
|
<g transform="rotate(180 128 192)">
|
||||||
|
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
|
||||||
|
fill="#111111">Q</text>
|
||||||
|
<g transform="translate(14 50) scale(0.625)">
|
||||||
|
<path d="M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#111111"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,64 @@
|
|||||||
|
(
|
||||||
|
meta: (
|
||||||
|
id: "classic",
|
||||||
|
name: "Classic",
|
||||||
|
author: "Ferrous Solitaire",
|
||||||
|
version: "1.0.0",
|
||||||
|
card_aspect: (2, 3),
|
||||||
|
),
|
||||||
|
back: "back.svg",
|
||||||
|
faces: {
|
||||||
|
"clubs_ace": "clubs_ace.svg",
|
||||||
|
"clubs_2": "clubs_2.svg",
|
||||||
|
"clubs_3": "clubs_3.svg",
|
||||||
|
"clubs_4": "clubs_4.svg",
|
||||||
|
"clubs_5": "clubs_5.svg",
|
||||||
|
"clubs_6": "clubs_6.svg",
|
||||||
|
"clubs_7": "clubs_7.svg",
|
||||||
|
"clubs_8": "clubs_8.svg",
|
||||||
|
"clubs_9": "clubs_9.svg",
|
||||||
|
"clubs_10": "clubs_10.svg",
|
||||||
|
"clubs_jack": "clubs_jack.svg",
|
||||||
|
"clubs_queen": "clubs_queen.svg",
|
||||||
|
"clubs_king": "clubs_king.svg",
|
||||||
|
"diamonds_ace": "diamonds_ace.svg",
|
||||||
|
"diamonds_2": "diamonds_2.svg",
|
||||||
|
"diamonds_3": "diamonds_3.svg",
|
||||||
|
"diamonds_4": "diamonds_4.svg",
|
||||||
|
"diamonds_5": "diamonds_5.svg",
|
||||||
|
"diamonds_6": "diamonds_6.svg",
|
||||||
|
"diamonds_7": "diamonds_7.svg",
|
||||||
|
"diamonds_8": "diamonds_8.svg",
|
||||||
|
"diamonds_9": "diamonds_9.svg",
|
||||||
|
"diamonds_10": "diamonds_10.svg",
|
||||||
|
"diamonds_jack": "diamonds_jack.svg",
|
||||||
|
"diamonds_queen": "diamonds_queen.svg",
|
||||||
|
"diamonds_king": "diamonds_king.svg",
|
||||||
|
"hearts_ace": "hearts_ace.svg",
|
||||||
|
"hearts_2": "hearts_2.svg",
|
||||||
|
"hearts_3": "hearts_3.svg",
|
||||||
|
"hearts_4": "hearts_4.svg",
|
||||||
|
"hearts_5": "hearts_5.svg",
|
||||||
|
"hearts_6": "hearts_6.svg",
|
||||||
|
"hearts_7": "hearts_7.svg",
|
||||||
|
"hearts_8": "hearts_8.svg",
|
||||||
|
"hearts_9": "hearts_9.svg",
|
||||||
|
"hearts_10": "hearts_10.svg",
|
||||||
|
"hearts_jack": "hearts_jack.svg",
|
||||||
|
"hearts_queen": "hearts_queen.svg",
|
||||||
|
"hearts_king": "hearts_king.svg",
|
||||||
|
"spades_ace": "spades_ace.svg",
|
||||||
|
"spades_2": "spades_2.svg",
|
||||||
|
"spades_3": "spades_3.svg",
|
||||||
|
"spades_4": "spades_4.svg",
|
||||||
|
"spades_5": "spades_5.svg",
|
||||||
|
"spades_6": "spades_6.svg",
|
||||||
|
"spades_7": "spades_7.svg",
|
||||||
|
"spades_8": "spades_8.svg",
|
||||||
|
"spades_9": "spades_9.svg",
|
||||||
|
"spades_10": "spades_10.svg",
|
||||||
|
"spades_jack": "spades_jack.svg",
|
||||||
|
"spades_queen": "spades_queen.svg",
|
||||||
|
"spades_king": "spades_king.svg",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
Before Width: | Height: | Size: 956 B After Width: | Height: | Size: 956 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |