mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-07-15 04:43:36 +00:00
chore(deps): bump node from 24-slim to 26-slim in /docker in the docker-major-updates group (#1021)
* chore: fix release workflow to merge docs branch * fix: svg donation generator push fail * fix: svg donation generator push fail * Update termix.rb * fix: svg donation generator push fail * chore: move donation badge to badges branch to avoid ruleset conflicts * chore: remove unneeded token from donation badge workflow * chore: debug donation badge commit step * fix: escape < character in donation SVG * fix: point donation badge to badges branch * chore: remove unused donation badge svg from main * Add Rack Genius logo to README Added Rack Genius logo to the README. * chore: improve donation goal svg generator to include stablecoins * chore: donation goal generator syntax error * chore: donation goal generator incorrect docs url usage * chore(deps): bump node in /docker in the docker-major-updates group Bumps the docker-major-updates group in /docker with 1 update: node. Updates `node` from 24-slim to 26-slim --- updated-dependencies: - dependency-name: node dependency-version: 26-slim dependency-type: direct:production dependency-group: docker-major-updates ... Signed-off-by: dependabot[bot] <support@github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
@@ -12,6 +12,8 @@ jobs:
|
|||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: badges
|
||||||
|
|
||||||
- name: Generate donation goal SVG
|
- name: Generate donation goal SVG
|
||||||
run: |
|
run: |
|
||||||
@@ -20,9 +22,19 @@ jobs:
|
|||||||
EVM_ADDRESS="0x83eA1Db55cc6E34fCD11Da2b7849621af67b6E34"
|
EVM_ADDRESS="0x83eA1Db55cc6E34fCD11Da2b7849621af67b6E34"
|
||||||
BTC_ADDRESS="bc1qrxc3vpnl6qhh9p8akjmjukcgmgmq852ua64h05"
|
BTC_ADDRESS="bc1qrxc3vpnl6qhh9p8akjmjukcgmgmq852ua64h05"
|
||||||
SOL_ADDRESS="T4BF5ioySVUjwaPNw4Sdu7oK8SXLxgQRcMaTQ6YJ2UJ"
|
SOL_ADDRESS="T4BF5ioySVUjwaPNw4Sdu7oK8SXLxgQRcMaTQ6YJ2UJ"
|
||||||
DOCS_SNAPSHOT_URL="https://raw.githubusercontent.com/Termix-SSH/Termix-Docs/main/static/donation-snapshot.json"
|
DOCS_SNAPSHOT_URL="https://raw.githubusercontent.com/Termix-SSH/Docs/main/static/donation-snapshot.json"
|
||||||
MONTHLY_GOAL=750
|
MONTHLY_GOAL=750
|
||||||
|
|
||||||
|
# Ethereum mainnet stablecoin contracts
|
||||||
|
ETH_USDC="0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
|
||||||
|
ETH_USDT="0xdAC17F958D2ee523a2206206994597C13D831ec7"
|
||||||
|
ETH_DAI="0x6B175474E89094C44Da98b954EedeAC495271d0F"
|
||||||
|
|
||||||
|
# Base stablecoin contracts
|
||||||
|
BASE_USDC="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
|
||||||
|
BASE_USDT="0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2"
|
||||||
|
BASE_DAI="0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb"
|
||||||
|
|
||||||
# Fetch crypto prices
|
# Fetch crypto prices
|
||||||
PRICES=$(curl -sf "https://api.coingecko.com/api/v3/simple/price?ids=ethereum,bitcoin,solana&vs_currencies=usd" || echo '{}')
|
PRICES=$(curl -sf "https://api.coingecko.com/api/v3/simple/price?ids=ethereum,bitcoin,solana&vs_currencies=usd" || echo '{}')
|
||||||
ETH_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethereum',{}).get('usd',0))" 2>/dev/null || echo 0)
|
ETH_PRICE=$(echo "$PRICES" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethereum',{}).get('usd',0))" 2>/dev/null || echo 0)
|
||||||
@@ -44,14 +56,37 @@ jobs:
|
|||||||
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getBalance\",\"params\":[\"${SOL_ADDRESS}\"]}" || echo '{"result":{"value":0}}')
|
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getBalance\",\"params\":[\"${SOL_ADDRESS}\"]}" || echo '{"result":{"value":0}}')
|
||||||
SOL_BAL=$(echo "$SOL_RAW" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('result',{}).get('value',0)/1e9)" 2>/dev/null || echo 0)
|
SOL_BAL=$(echo "$SOL_RAW" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('result',{}).get('value',0)/1e9)" 2>/dev/null || echo 0)
|
||||||
|
|
||||||
|
# Helper: fetch an ERC-20 token balance from Blockscout token-balances endpoint
|
||||||
|
fetch_token_balance() {
|
||||||
|
local base_url="$1"
|
||||||
|
local contract="$2"
|
||||||
|
curl -sf "${base_url}/api/v2/addresses/${EVM_ADDRESS}/tokens?type=ERC-20" | CONTRACT="$contract" python3 -c "import sys, json, os; contract = os.environ['CONTRACT'].lower(); d = json.load(sys.stdin); match = next((i for i in d.get('items', []) if i.get('token', {}).get('address', '').lower() == contract), None); decimals = int((match or {}).get('token', {}).get('decimals') or 18); value = int((match or {}).get('value') or 0); print(value / (10 ** decimals) if match else 0)" 2>/dev/null || echo 0
|
||||||
|
}
|
||||||
|
|
||||||
|
ETH_USDC_BAL=$(fetch_token_balance "https://eth.blockscout.com" "$ETH_USDC")
|
||||||
|
ETH_USDT_BAL=$(fetch_token_balance "https://eth.blockscout.com" "$ETH_USDT")
|
||||||
|
ETH_DAI_BAL=$(fetch_token_balance "https://eth.blockscout.com" "$ETH_DAI")
|
||||||
|
|
||||||
|
BASE_USDC_BAL=$(fetch_token_balance "https://base.blockscout.com" "$BASE_USDC")
|
||||||
|
BASE_USDT_BAL=$(fetch_token_balance "https://base.blockscout.com" "$BASE_USDT")
|
||||||
|
BASE_DAI_BAL=$(fetch_token_balance "https://base.blockscout.com" "$BASE_DAI")
|
||||||
|
|
||||||
# Fetch snapshot baseline from docs repo
|
# Fetch snapshot baseline from docs repo
|
||||||
SNAPSHOT=$(curl -sf "$DOCS_SNAPSHOT_URL" || echo '{"ethBal":0,"baseBal":0,"btcBal":0,"solBal":0}')
|
SNAPSHOT=$(curl -sf "$DOCS_SNAPSHOT_URL" || echo '{"ethBal":0,"baseBal":0,"btcBal":0,"solBal":0}')
|
||||||
SNAP_ETH=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethBal',0))" 2>/dev/null || echo 0)
|
SNAP_ETH=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethBal',0))" 2>/dev/null || echo 0)
|
||||||
SNAP_BASE=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('baseBal',0))" 2>/dev/null || echo 0)
|
SNAP_BASE=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('baseBal',0))" 2>/dev/null || echo 0)
|
||||||
SNAP_BTC=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('btcBal',0))" 2>/dev/null || echo 0)
|
SNAP_BTC=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('btcBal',0))" 2>/dev/null || echo 0)
|
||||||
SNAP_SOL=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('solBal',0))" 2>/dev/null || echo 0)
|
SNAP_SOL=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('solBal',0))" 2>/dev/null || echo 0)
|
||||||
|
SNAP_ETH_USDC=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethUsdcBal',0))" 2>/dev/null || echo 0)
|
||||||
|
SNAP_ETH_USDT=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethUsdtBal',0))" 2>/dev/null || echo 0)
|
||||||
|
SNAP_ETH_DAI=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('ethDaiBal',0))" 2>/dev/null || echo 0)
|
||||||
|
SNAP_BASE_USDC=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('baseUsdcBal',0))" 2>/dev/null || echo 0)
|
||||||
|
SNAP_BASE_USDT=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('baseUsdtBal',0))" 2>/dev/null || echo 0)
|
||||||
|
SNAP_BASE_DAI=$(echo "$SNAPSHOT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('baseDaiBal',0))" 2>/dev/null || echo 0)
|
||||||
|
|
||||||
export ETH_BAL BASE_BAL BTC_BAL SOL_BAL SNAP_ETH SNAP_BASE SNAP_BTC SNAP_SOL ETH_PRICE BTC_PRICE SOL_PRICE MONTHLY_GOAL
|
export ETH_BAL BASE_BAL BTC_BAL SOL_BAL SNAP_ETH SNAP_BASE SNAP_BTC SNAP_SOL ETH_PRICE BTC_PRICE SOL_PRICE MONTHLY_GOAL
|
||||||
|
export ETH_USDC_BAL ETH_USDT_BAL ETH_DAI_BAL BASE_USDC_BAL BASE_USDT_BAL BASE_DAI_BAL
|
||||||
|
export SNAP_ETH_USDC SNAP_ETH_USDT SNAP_ETH_DAI SNAP_BASE_USDC SNAP_BASE_USDT SNAP_BASE_DAI
|
||||||
|
|
||||||
python3 - <<'PYEOF'
|
python3 - <<'PYEOF'
|
||||||
import os, math
|
import os, math
|
||||||
@@ -69,22 +104,46 @@ jobs:
|
|||||||
sol_price = float(os.environ.get('SOL_PRICE', 0))
|
sol_price = float(os.environ.get('SOL_PRICE', 0))
|
||||||
goal = float(os.environ.get('MONTHLY_GOAL', 750))
|
goal = float(os.environ.get('MONTHLY_GOAL', 750))
|
||||||
|
|
||||||
|
eth_usdc_bal = float(os.environ.get('ETH_USDC_BAL', 0))
|
||||||
|
eth_usdt_bal = float(os.environ.get('ETH_USDT_BAL', 0))
|
||||||
|
eth_dai_bal = float(os.environ.get('ETH_DAI_BAL', 0))
|
||||||
|
base_usdc_bal = float(os.environ.get('BASE_USDC_BAL', 0))
|
||||||
|
base_usdt_bal = float(os.environ.get('BASE_USDT_BAL', 0))
|
||||||
|
base_dai_bal = float(os.environ.get('BASE_DAI_BAL', 0))
|
||||||
|
snap_eth_usdc = float(os.environ.get('SNAP_ETH_USDC', 0))
|
||||||
|
snap_eth_usdt = float(os.environ.get('SNAP_ETH_USDT', 0))
|
||||||
|
snap_eth_dai = float(os.environ.get('SNAP_ETH_DAI', 0))
|
||||||
|
snap_base_usdc = float(os.environ.get('SNAP_BASE_USDC', 0))
|
||||||
|
snap_base_usdt = float(os.environ.get('SNAP_BASE_USDT', 0))
|
||||||
|
snap_base_dai = float(os.environ.get('SNAP_BASE_DAI', 0))
|
||||||
|
|
||||||
delta_eth = max(0, eth_bal - snap_eth)
|
delta_eth = max(0, eth_bal - snap_eth)
|
||||||
delta_base = max(0, base_bal - snap_base)
|
delta_base = max(0, base_bal - snap_base)
|
||||||
delta_btc = max(0, btc_bal - snap_btc)
|
delta_btc = max(0, btc_bal - snap_btc)
|
||||||
delta_sol = max(0, sol_bal - snap_sol)
|
delta_sol = max(0, sol_bal - snap_sol)
|
||||||
|
|
||||||
total = delta_eth * eth_price + delta_base * eth_price + delta_btc * btc_price + delta_sol * sol_price
|
delta_eth_usdc = max(0, eth_usdc_bal - snap_eth_usdc)
|
||||||
|
delta_eth_usdt = max(0, eth_usdt_bal - snap_eth_usdt)
|
||||||
|
delta_eth_dai = max(0, eth_dai_bal - snap_eth_dai)
|
||||||
|
delta_base_usdc = max(0, base_usdc_bal - snap_base_usdc)
|
||||||
|
delta_base_usdt = max(0, base_usdt_bal - snap_base_usdt)
|
||||||
|
delta_base_dai = max(0, base_dai_bal - snap_base_dai)
|
||||||
|
|
||||||
|
total = (
|
||||||
|
delta_eth * eth_price + delta_base * eth_price +
|
||||||
|
delta_btc * btc_price + delta_sol * sol_price +
|
||||||
|
delta_eth_usdc + delta_eth_usdt + delta_eth_dai +
|
||||||
|
delta_base_usdc + delta_base_usdt + delta_base_dai
|
||||||
|
)
|
||||||
pct = min(total / goal * 100, 100) if goal > 0 else 0
|
pct = min(total / goal * 100, 100) if goal > 0 else 0
|
||||||
|
|
||||||
if total < 1:
|
if total < 1:
|
||||||
display = '< $1'
|
display = '< $1'
|
||||||
else:
|
else:
|
||||||
display = f'${math.floor(total):,}'
|
display = f'${math.floor(total):,}'
|
||||||
|
|
||||||
goal_display = f'${int(goal):,}'
|
goal_display = f'${int(goal):,}'
|
||||||
|
|
||||||
# SVG dimensions
|
|
||||||
W = 400
|
W = 400
|
||||||
BAR_W = 360
|
BAR_W = 360
|
||||||
BAR_X = 20
|
BAR_X = 20
|
||||||
@@ -103,24 +162,20 @@ jobs:
|
|||||||
<text x="{W//2}" y="44" font-family="sans-serif" font-size="10" fill="#F3904499" text-anchor="middle">{pct_label}</text>
|
<text x="{W//2}" y="44" font-family="sans-serif" font-size="10" fill="#F3904499" text-anchor="middle">{pct_label}</text>
|
||||||
</svg>'''
|
</svg>'''
|
||||||
|
|
||||||
with open('repo-images/donation-goal.svg', 'w') as f:
|
with open('donation-goal.svg', 'w') as f:
|
||||||
f.write(svg)
|
f.write(svg)
|
||||||
print(f'SVG written: {display} / {goal_display} ({round(pct)}%)')
|
print(f'SVG written: {display} / {goal_display} ({round(pct)}%)')
|
||||||
PYEOF
|
PYEOF
|
||||||
|
|
||||||
- name: Commit SVG
|
- name: Commit SVG
|
||||||
run: |
|
run: |
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "LukeGus"
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
git config user.email "bugattiguy527@gmail.com"
|
||||||
git add repo-images/donation-goal.svg
|
git add -f donation-goal.svg
|
||||||
|
git diff --cached --stat
|
||||||
if git diff --cached --quiet; then
|
if git diff --cached --quiet; then
|
||||||
|
echo "No changes to commit"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
# Amend the previous bot commit if it exists, otherwise create a new one
|
|
||||||
LAST_AUTHOR=$(git log -1 --format='%ae')
|
|
||||||
if [ "$LAST_AUTHOR" = "github-actions[bot]@users.noreply.github.com" ]; then
|
|
||||||
git commit --amend --no-edit
|
|
||||||
git push --force-with-lease
|
|
||||||
else
|
|
||||||
git commit -m "chore: update donation goal badge"
|
git commit -m "chore: update donation goal badge"
|
||||||
git push
|
git push origin HEAD:badges
|
||||||
fi
|
|
||||||
|
|||||||
@@ -483,11 +483,16 @@ jobs:
|
|||||||
|
|
||||||
PR_NUMBER=$(gh pr list --repo Termix-SSH/Docs --head "$BRANCH" --base main --state open --json number -q '.[0].number' || true)
|
PR_NUMBER=$(gh pr list --repo Termix-SSH/Docs --head "$BRANCH" --base main --state open --json number -q '.[0].number' || true)
|
||||||
if [ -z "$PR_NUMBER" ]; then
|
if [ -z "$PR_NUMBER" ]; then
|
||||||
PR_NUMBER=$(gh pr create --repo Termix-SSH/Docs \
|
PR_URL=$(gh pr create --repo Termix-SSH/Docs \
|
||||||
--base main --head "$BRANCH" \
|
--base main --head "$BRANCH" \
|
||||||
--title "release-${{ needs.prep.outputs.version }}" \
|
--title "release-${{ needs.prep.outputs.version }}" \
|
||||||
--body "API docs for ${{ needs.prep.outputs.version }}" \
|
--body "API docs for ${{ needs.prep.outputs.version }}")
|
||||||
| grep -oE '[0-9]+$')
|
PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$PR_NUMBER" ]; then
|
||||||
|
echo "Failed to find or create a PR for $BRANCH."
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
gh pr merge "$PR_NUMBER" --repo Termix-SSH/Docs --squash --admin
|
gh pr merge "$PR_NUMBER" --repo Termix-SSH/Docs --squash --admin
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
cask "termix" do
|
cask "termix" do
|
||||||
version "2.4.1"
|
version "2.5.0"
|
||||||
sha256 "c71209bf0bde9eefa5aeefbfc2b1db3af4ca3546e5f2ef09d233a6d3d1719150"
|
sha256 "0662380b3cc986e5ddab263122e87b03a581bc18dbff1ad13e11dc973c84984b"
|
||||||
|
|
||||||
url "https://github.com/Termix-SSH/Termix/releases/download/release-#{version}-tag/termix_macos_universal_dmg.dmg"
|
url "https://github.com/Termix-SSH/Termix/releases/download/release-#{version}-tag/termix_macos_universal_dmg.dmg"
|
||||||
name "Termix"
|
name "Termix"
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
Termix is free and open source. If you find it useful, consider [donating](https://donate.termix.site/) to help cover server costs and development time.
|
Termix is free and open source. If you find it useful, consider [donating](https://donate.termix.site/) to help cover server costs and development time.
|
||||||
|
|
||||||
<a href="https://donate.termix.site/"><img src="./repo-images/donation-goal.svg" alt="Monthly donation goal" /></a>
|
<a href="https://donate.termix.site/"><img src="https://raw.githubusercontent.com/Termix-SSH/Termix/badges/donation-goal.svg" alt="Monthly donation goal" /></a>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
@@ -392,6 +392,10 @@ See [Projects](https://github.com/orgs/Termix-SSH/projects/5) for all planned fe
|
|||||||
<a href="https://aws.amazon.com/">
|
<a href="https://aws.amazon.com/">
|
||||||
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Amazon_Web_Services_Logo.svg/960px-Amazon_Web_Services_Logo.svg.png" height="40" alt="AWS" />
|
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Amazon_Web_Services_Logo.svg/960px-Amazon_Web_Services_Logo.svg.png" height="40" alt="AWS" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a href="https://rackgenius.com/">
|
||||||
|
<img src="https://rackgenius.com/rackgenius-logo.png" height="40" alt="AWS" />
|
||||||
|
</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
# Stage 1: Install dependencies
|
# Stage 1: Install dependencies
|
||||||
FROM node:24-slim AS deps
|
FROM node:26-slim AS deps
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
|
RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
|
||||||
@@ -36,7 +36,7 @@ RUN npm rebuild better-sqlite3
|
|||||||
RUN npm run build:backend
|
RUN npm run build:backend
|
||||||
|
|
||||||
# Stage 4: Production dependencies only
|
# Stage 4: Production dependencies only
|
||||||
FROM node:24-slim AS production-deps
|
FROM node:26-slim AS production-deps
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
|
RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
|
||||||
@@ -53,7 +53,7 @@ RUN npm ci --omit=dev --ignore-scripts && \
|
|||||||
npm cache clean --force
|
npm cache clean --force
|
||||||
|
|
||||||
# Stage 5: Final optimized image
|
# Stage 5: Final optimized image
|
||||||
FROM node:24-slim
|
FROM node:26-slim
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
ENV DATA_DIR=/app/data \
|
ENV DATA_DIR=/app/data \
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="52" role="img" aria-label="Monthly donation goal">
|
|
||||||
<title>Monthly donation goal</title>
|
|
||||||
<rect width="400" height="52" rx="6" fill="#0c0d0b"/>
|
|
||||||
<text x="200" y="13" font-family="sans-serif" font-size="11" fill="#F39044" text-anchor="middle">Monthly Donation Goal ... / $750</text>
|
|
||||||
<rect x="20" y="20" width="360" height="8" rx="4" fill="#F3904433"/>
|
|
||||||
<rect x="20" y="20" width="0" height="8" rx="4" fill="#F39044"/>
|
|
||||||
<text x="200" y="44" font-family="sans-serif" font-size="10" fill="#F3904499" text-anchor="middle">Loading...</text>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 610 B |
Reference in New Issue
Block a user