使用新版模板 (#313)

* 🔥 删除现有模板

*  自动克隆模板仓库

* 🔥 删除 identicon 相关代码

* 🚚 修改静态文件路径

*  使用新模板进行渲染

*  每次渲染都获取一次模板, 以应对实时更新

*  TETR.IO 绑定图使用新模板

* 🚚 修改网络路径

*  TOP 绑定图使用新模板

*  TOS 绑定图使用新模板

* 🐛 防止截图超时

* 🐛 Pydantic V1 会把 float 转换成 int

* ✏️ 模板字段名写错了

*  兼容 Pydantic V1

*  TETR.IO 查询图使用新模板

* 🐛 在查询的用户没有历史记录时不去查询更多记录
This commit is contained in:
呵呵です
2024-05-10 09:41:05 +08:00
committed by GitHub
parent e47f1bb6f9
commit 716e392a3a
54 changed files with 280 additions and 1826 deletions

View File

@@ -28,7 +28,7 @@ from ...db.models import HistoricalData
from ...utils.avatar import get_avatar
from ...utils.exception import MessageFormatError, RequestError, WhatTheFuckError
from ...utils.host import HostPage, get_self_netloc
from ...utils.render import render
from ...utils.render import Bind, TETRIOInfo, render
from ...utils.request import splice_url
from ...utils.retry import retry
from ...utils.screenshot import screenshot
@@ -96,22 +96,26 @@ class Processor(ProcessorMeta):
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
async with HostPage(
await render(
'bind.j2.html',
user_avatar=f'https://tetr.io/user-content/avatars/{user_info.data.user.id}.jpg?rv={user_info.data.user.avatar_revision}'
if user_info.data.user.avatar_revision is not None
else f'../../identicon?md5={md5(user_info.data.user.id.encode()).hexdigest()}', # noqa: S324
state='unknown',
bot_avatar=bot_avatar,
game_type=self.game_platform,
user_name=user_info.data.user.username.upper(),
bot_name=bot_info.user_name,
command='io查我',
'binding',
Bind(
platform='TETR.IO',
status='unknown',
user=Bind.People(
avatar=f'https://tetr.io/user-content/avatars/{user_info.data.user.id}.jpg?rv={user_info.data.user.avatar_revision}'
if user_info.data.user.avatar_revision is not None
else f'{{"type":"identicon","hash":"{md5(user_info.data.user.id.encode()).hexdigest()}"}}', # noqa: S324
name=user_info.data.user.username.upper(),
),
bot=Bind.People(
avatar=bot_avatar,
name=bot_info.user_name,
),
command='io查我',
),
)
) as page_hash:
message = UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
raw=await screenshot(urlunparse(('http', get_self_netloc(), f'/host/{page_hash}.html', '', '', '')))
)
return message
@@ -138,19 +142,20 @@ class Processor(ProcessorMeta):
.where(HistoricalData.user_unique_identifier == self.user.unique_identifier)
)
).all()
extra = (
await session.scalars(
select(HistoricalData)
.where(HistoricalData.game_platform == GAME_TYPE)
.where(HistoricalData.user_unique_identifier == self.user.unique_identifier)
.order_by(HistoricalData.id.desc())
.where(HistoricalData.id < min([i.id for i in historical_data]))
.limit(1)
)
).one_or_none()
if extra is not None:
historical_data = list(historical_data)
historical_data.append(extra)
if historical_data:
extra = (
await session.scalars(
select(HistoricalData)
.where(HistoricalData.game_platform == GAME_TYPE)
.where(HistoricalData.user_unique_identifier == self.user.unique_identifier)
.order_by(HistoricalData.id.desc())
.where(HistoricalData.id < min([i.id for i in historical_data]))
.limit(1)
)
).one_or_none()
if extra is not None:
historical_data = list(historical_data)
historical_data.append(extra)
class HistoricalTr(NamedTuple):
time: datetime
@@ -213,7 +218,6 @@ class Processor(ProcessorMeta):
histories[1],
today - forward,
)
else:
histories.insert(0, HistoricalTr((today - forward), histories[0].tr))
@@ -257,43 +261,52 @@ class Processor(ProcessorMeta):
blitz_value = f'{blitz.record.endcontext.score:,}'
async with HostPage(
await render(
'data.j2.html',
user_avatar=f'https://tetr.io/user-content/avatars/{user_info.data.user.id}.jpg?rv={user_info.data.user.avatar_revision}'
if user_info.data.user.avatar_revision is not None
else f'../../identicon?md5={md5(user_info.data.user.id.encode()).hexdigest()}', # noqa: S324
user_name=user_name,
user_sign=user_info.data.user.bio,
game_type='TETR.IO',
ranking=round(league.glicko, 2),
rd=round(league.rd, 2),
rank=league.rank,
TR=round(league.rating, 2),
global_rank=league.standing,
lpm=round(lpm := (league.pps * 24), 2),
pps=league.pps,
apm=league.apm,
apl=round(league.apm / lpm, 2),
adpm=round(adpm := (league.vs * 0.6), 2),
adpl=round(adpm / lpm, 2),
vs=league.vs,
sprint=sprint_value,
blitz=blitz_value,
data=[[int(datetime.timestamp(time) * 1000), tr] for time, tr in histories],
split_value=split_value,
offset=offset,
value_max=value_max,
value_min=value_min,
app=(app := (league.apm / (60 * league.pps))),
dsps=(dsps := ((league.vs / 100) - (league.apm / 60))),
dspp=(dspp := (dsps / league.pps)),
ci=150 * dspp - 125 * app + 50 * (league.vs / league.apm) - 25,
ge=2 * ((app * dsps) / league.pps),
'tetrio/info',
TETRIOInfo(
user=TETRIOInfo.User(
avatar=f'https://tetr.io/user-content/avatars/{user_info.data.user.id}.jpg?rv={user_info.data.user.avatar_revision}'
if user_info.data.user.avatar_revision is not None
else f'{{"type":"identicon","hash":"{md5(user_info.data.user.id.encode()).hexdigest()}"}}', # noqa: S324
name=user_name,
bio=user_info.data.user.bio,
),
ranking=TETRIOInfo.Ranking(
rating=round(league.glicko, 2),
rd=round(league.rd, 2),
),
tetra_league=TETRIOInfo.TetraLeague(
rank=league.rank,
tr=round(league.rating, 2),
global_rank=league.standing,
pps=league.pps,
lpm=round(lpm := (league.pps * 24), 2),
apm=league.apm,
apl=round(league.apm / lpm, 2),
vs=league.vs,
adpm=round(adpm := (league.vs * 0.6), 2),
adpl=round(adpm / lpm, 2),
),
tetra_league_history=TETRIOInfo.TetraLeagueHistory(
data=[TETRIOInfo.TetraLeagueHistory.Data(record_at=time, tr=tr) for time, tr in histories],
split_interval=split_value,
min_tr=value_min,
max_tr=value_max,
offset=offset,
),
radar=TETRIOInfo.Radar(
app=(app := (league.apm / (60 * league.pps))),
dsps=(dsps := ((league.vs / 100) - (league.apm / 60))),
dspp=(dspp := (dsps / league.pps)),
ci=150 * dspp - 125 * app + 50 * (league.vs / league.apm) - 25,
ge=2 * ((app * dsps) / league.pps),
),
sprint=sprint_value,
blitz=blitz_value,
),
)
) as page_hash:
return UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
raw=await screenshot(urlunparse(('http', get_self_netloc(), f'/host/{page_hash}.html', '', '', '')))
)
# fallback
ret_message = ''

View File

@@ -16,7 +16,7 @@ from ...db import BindStatus, create_or_update_bind
from ...utils.avatar import get_avatar
from ...utils.exception import MessageFormatError, RequestError
from ...utils.host import HostPage, get_self_netloc
from ...utils.render import render
from ...utils.render import Bind, render
from ...utils.request import Request, splice_url
from ...utils.screenshot import screenshot
from .. import Processor as ProcessorMeta
@@ -83,24 +83,27 @@ class Processor(ProcessorMeta):
game_platform=GAME_TYPE,
game_account=self.user.name,
)
bot_avatar = await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg')
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
async with HostPage(
await render(
'bind.j2.html',
user_avatar='../../static/static/logo/top.ico',
state='unknown',
bot_avatar=bot_avatar,
game_type=self.game_platform,
user_name=(await self.get_user_name()).upper(),
bot_name=bot_info.user_name,
command='top查我',
'binding',
Bind(
platform=self.game_platform,
status='unknown',
user=Bind.People(
avatar=await get_avatar(user_info, 'Data URI', None),
name=(await self.get_user_name()).upper(),
),
bot=Bind.People(
avatar=await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg'),
name=bot_info.user_name,
),
command='top查我',
),
)
) as page_hash:
message = UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
raw=await screenshot(urlunparse(('http', get_self_netloc(), f'/host/{page_hash}.html', '', '', '')))
)
return message

View File

@@ -6,7 +6,7 @@ from nonebot.matcher import Matcher
from nonebot_plugin_alconna import At, on_alconna
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_userinfo import BotUserInfo, UserInfo # type: ignore[import-untyped]
from nonebot_plugin_userinfo import BotUserInfo, EventUserInfo, UserInfo # type: ignore[import-untyped]
from ...db import query_bind_info
from ...utils.exception import HandleNotFinishedError, NeedCatchError, RequestError
@@ -132,7 +132,14 @@ except ImportError:
@alc.assign('bind')
async def _(bot: Bot, event: Event, matcher: Matcher, account: User, bot_info: UserInfo = BotUserInfo()): # noqa: B008
async def _( # noqa: PLR0913
bot: Bot,
event: Event,
matcher: Matcher,
account: User,
bot_info: UserInfo = BotUserInfo(), # noqa: B008
user_info: UserInfo = EventUserInfo(), # noqa: B008
):
proc = Processor(
event_id=id(event),
user=account,
@@ -140,7 +147,9 @@ async def _(bot: Bot, event: Event, matcher: Matcher, account: User, bot_info: U
)
try:
await (
await proc.handle_bind(platform=get_platform(bot), account=event.get_user_id(), bot_info=bot_info)
await proc.handle_bind(
platform=get_platform(bot), account=event.get_user_id(), bot_info=bot_info, nb_user_info=user_info
)
).finish()
except NeedCatchError as e:
await matcher.send(str(e))

View File

@@ -14,7 +14,7 @@ from ...db import BindStatus, create_or_update_bind
from ...utils.avatar import get_avatar
from ...utils.exception import MessageFormatError, RequestError
from ...utils.host import HostPage, get_self_netloc
from ...utils.render import render
from ...utils.render import Bind, render
from ...utils.request import Request, splice_url
from ...utils.screenshot import screenshot
from .. import Processor as ProcessorMeta
@@ -84,7 +84,9 @@ class Processor(ProcessorMeta):
return GAME_TYPE
@override
async def handle_bind(self, platform: str, account: str, bot_info: NBUserInfo) -> UniMessage:
async def handle_bind(
self, platform: str, account: str, bot_info: NBUserInfo, nb_user_info: NBUserInfo
) -> UniMessage:
"""处理绑定消息"""
self.command_type = 'bind'
await self.get_user()
@@ -96,25 +98,27 @@ class Processor(ProcessorMeta):
game_platform=GAME_TYPE,
game_account=self.user.unique_identifier,
)
bot_avatar = await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg')
user_info = await self.get_user_info()
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
async with HostPage(
await render(
'bind.j2.html',
user_avatar='../../static/static/logo/tos.ico',
state='unknown',
bot_avatar=bot_avatar,
game_type=self.game_platform,
user_name=user_info.data.name.upper(),
bot_name=bot_info.user_name,
command='茶服查我',
'binding',
Bind(
platform=self.game_platform,
status='unknown',
user=Bind.People(
avatar=await get_avatar(nb_user_info, 'Data URI', None), name=user_info.data.name
),
bot=Bind.People(
avatar=await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg'),
name=bot_info.user_name,
),
command='茶服查我',
),
)
) as page_hash:
message = UniMessage.image(
raw=await screenshot(
urlunparse(('http', get_self_netloc(), f'/host/page/{page_hash}.html', '', '', ''))
)
raw=await screenshot(urlunparse(('http', get_self_netloc(), f'/host/{page_hash}.html', '', '', '')))
)
return message

View File

@@ -1,3 +0,0 @@
from pathlib import Path
path = Path(__file__).absolute().parent

View File

@@ -1,43 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="../../static/css/bind.css" rel="stylesheet" />
</head>
<body>
<div id="background">
<div id="main-content">
<div id="bind-subject">
<div id="bind-icons">
<img id="user-avatar" src="{{ user_avatar }}" />
<img id="state" src="../../static/static/bind/{{ state }}.svg" />
<img id="bot-avatar" src="{{ bot_avatar }}" />
</div>
<div id="command-result">
已将您在
<p id="game-type">{{ game_type }}</p>
上的账号
<br />
<p id="user-name">{{ user_name }}</p>
<br />
{% if state == 'success' %} 成功验证并绑定至
<p id="bot-name">{{ bot_name }}.</p>
{% elif state == 'unverified'%} 绑定至
<p id="bot-name">{{ bot_name }}</p>
, 但尚未通过验证. {% elif state == 'unknown' %} 绑定至
<p id="bot-name">{{ bot_name }}</p>
,<br />但是
<p id="bot-name">{{ bot_name }}</p>
暂时无法验证您的身份. {% elif state == 'unlink' %} 成功从
<p id="bot-name">{{ bot_name }}</p>
解绑. {% endif %}
</div>
</div>
<div id="extra-info">您可以输入 “{{ command }}” 命令来查找您在该平台上的统计数据.</div>
</div>
</div>
</body>
</html>

View File

@@ -1,118 +0,0 @@
@font-face {
font-family: 'SourceHanSansSC-VF';
src: url('../static/fonts/SourceHanSans/SourceHanSansSC-VF.otf.woff2') format('woff2');
font-display: swap;
font-style: normal;
}
@font-face {
font-family: 'CabinetGrotesk-Variable';
src: url('../static/fonts/CabinetGrotesk/CabinetGrotesk-Variable.woff2') format('woff2');
font-display: swap;
font-style: normal;
}
* {
margin: 0;
padding: 0;
}
#background {
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 30px;
gap: 10px;
width: 444px;
background: #f1f1f1;
font-family: 'CabinetGrotesk-Variable', 'SourceHanSansSC-VF';
}
#main-content {
display: flex;
flex-direction: column;
margin: 0 auto;
padding: 0px;
gap: 15px;
}
#bind-subject {
display: flex;
flex-direction: column;
align-items: center;
padding: 0px;
gap: 30px;
}
#bind-icons {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
padding: 0px;
gap: 32px;
}
#user-avatar {
width: 96px;
height: 96px;
filter: drop-shadow(0px 11px 23px rgba(0, 0, 0, 0.22));
border-radius: 20px;
}
#state {
width: 128px;
height: 56px;
}
#bot-avatar {
width: 96px;
height: 96px;
filter: drop-shadow(0px 11px 23px rgba(0, 0, 0, 0.22));
border-radius: 20px;
}
#command-result {
font-weight: 350;
font-size: 25px;
line-height: 36.2px;
text-align: center;
color: #000000;
}
#game-type {
display: inline;
font-weight: 800;
line-height: 31px;
}
#user-name {
display: inline;
font-weight: 800;
line-height: 31px;
white-space: nowrap;
text-overflow: ellipsis;
}
#bot-name {
display: inline;
font-weight: 400;
line-height: 31px;
}
#extra-info {
width: 324px;
margin: 0 auto;
font-weight: 400;
font-size: 16px;
line-height: 23px;
text-align: center;
color: #52525c;
}

View File

@@ -1,368 +0,0 @@
@font-face {
font-family: 'CabinetGrotesk-Variable';
src: url('../static/fonts/CabinetGrotesk/CabinetGrotesk-Variable.woff2') format('woff2');
}
@font-face {
font-family: 'SourceHanSansSC-VF';
src: url('../static/fonts/SourceHanSans/SourceHanSansSC-VF.otf.woff2') format('woff2');
}
* {
margin: 0;
padding: 0;
}
.flex-gap {
flex: 1;
}
.big-title {
margin-left: 25px;
margin-top: 22px;
font-weight: 900;
font-size: 35px;
line-height: 43px;
color: #000000;
}
.box-shadow {
box-shadow: 0px 9px 25px rgba(0, 0, 0, 0.15);
}
.chart-shadow {
box-shadow: 0px 15px 30px rgba(0, 0, 0, 0.3);
}
.box-rounded-corners {
border-radius: 30px;
}
.small-data-box {
position: relative;
width: 275px;
height: 125px;
}
.big-data-value {
position: absolute;
left: 24px;
top: 52px;
font-weight: 500;
font-size: 45px;
line-height: 56px;
}
.small-data-value {
position: absolute;
top: 79px;
right: 25px;
font-weight: 500;
font-size: 15px;
line-height: 19px;
text-align: right;
}
.main-content {
display: flex;
flex-direction: column;
width: 625px;
background: #f1f1f1;
font-family: 'CabinetGrotesk-Variable', 'SourceHanSansSC-VF';
}
.account-box {
display: flex;
flex-direction: column;
}
.info-box {
display: flex;
justify-content: space-between;
margin-top: 10px;
}
.user-info-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 25px;
gap: 10px;
width: 275px;
height: 275px;
background: #fafafa;
box-sizing: border-box;
}
.user-avatar {
width: 125px;
height: 125px;
filter: drop-shadow(0px 11px 23px rgba(0, 0, 0, 0.22));
border-radius: 65px;
}
.user-name {
font-weight: 800;
font-size: 25px;
line-height: 31px;
color: #000000;
}
.user-sign {
width: 225px;
height: 66px;
font-weight: 400;
font-size: 18px;
line-height: 22px;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
color: #000000;
}
.game-info-box {
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 25px;
gap: 10px;
width: 275px;
height: 275px;
background: #fafafa;
box-sizing: border-box;
}
.game-type-box {
display: flex;
flex-direction: column;
}
.game-logo {
width: 60px;
height: 60px;
border-radius: 10px;
}
.game-name {
font-weight: 800;
font-size: 30px;
line-height: 37px;
color: #000000;
}
.game-info-dividing-line {
width: 225px;
border: 1px solid #bababa;
transform: rotate(0.25deg);
}
.ranking-info-box {
display: flex;
flex-direction: column;
}
.ranking-title {
font-weight: 800;
font-size: 25px;
line-height: 31px;
color: #000000;
}
.ranking {
font-weight: 400;
font-size: 50px;
line-height: 120%;
color: #000000;
}
.rd {
margin-top: -16px;
font-weight: 300;
font-size: 30px;
line-height: 120%;
color: #000000;
}
#TR-curve-chart {
align-self: center;
margin-top: 25px;
width: 575px;
height: 275px;
background: linear-gradient(222.34deg, #525252 11.97%, #1d1916 89.73%);
}
.TR-title {
position: absolute;
margin-left: 24px;
margin-top: 19px;
font-weight: 800;
font-size: 25px;
line-height: 31px;
white-space: nowrap;
color: #fafafa;
}
.rank-icon {
position: absolute;
margin-left: 27px;
margin-top: 90px;
width: 50px;
height: 50px;
}
.TR {
position: absolute;
margin-left: 24px;
margin-top: 143px;
font-weight: 800;
font-size: 45px;
line-height: 120%;
color: #fafafa;
}
.multiplayer-box {
display: flex;
flex-direction: row;
justify-content: space-between;
margin-top: 14px;
}
.multiplayer-data-box {
display: flex;
flex-direction: column;
}
.multiplayer-data {
margin-top: 25px;
}
.multiplayer-data:first-child {
margin-top: 0px;
}
.lpm-box {
background-image: url('../static/data/LPM.svg');
}
.lpm-value {
color: #4d7d0f;
}
.pps-value {
color: #4d7d0f;
}
.apm-box {
background-image: url('../static/data/APM.svg');
}
.apm-value {
color: #b5530a;
}
.apl-value {
color: #b5530a;
}
.adpm-box {
background-image: url('../static/data/ADPM.svg');
}
.adpm-value {
color: #235db4;
}
.vs-value {
top: 62px;
color: #4779c6;
}
.adpl-value {
color: #4779c6;
}
.radar-chart-box {
display: flex;
flex-direction: column;
}
.radar-background {
background: linear-gradient(222.34deg, #525252 11.97%, #1d1916 89.73%),
linear-gradient(222.34deg, #4f9dff 11.97%, #2563ea 89.73%);
}
#radar-chart {
width: 275px;
height: 275px;
}
.radar-description {
text-align: left;
padding-left: 20px;
padding-top: 15px;
font-size: 12px;
color: #fafafa;
box-sizing: border-box;
}
.singleplayer-box {
display: flex;
flex-direction: row;
align-content: space-between;
margin-top: 14px;
}
.sprint-box {
background-image: url('../static/data/40L.svg');
}
.blitz-box {
background-image: url('../static/data/Blitz.svg');
}
.sprint-value {
color: #b42323;
}
.blitz-value {
color: #8e23b4;
}
.footer {
margin-top: 20px;
margin-bottom: 20px;
font-size: 30px;
font-weight: 750;
line-height: 120%;
text-align: center;
}

View File

@@ -1,367 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="../../static/css/data.css" rel="stylesheet" />
</head>
<body>
<div class="main-content">
<span class="big-title">Account&Rankings</span>
<div class="account-box">
<div class="info-box">
<div class="flex-gap"></div>
<div class="box-shadow box-rounded-corners user-info-box">
<div class="flex-gap"></div>
<img class="user-avatar" src="{{user_avatar}}" />
<div class="flex-gap"></div>
<div class="user-name">{{user_name}}</div>
<div class="flex-gap"></div>
{% if user_sign is not none %}
<div class="user-sign">“{{user_sign}}”</div>
{% endif %}
</div>
<div class="flex-gap"></div>
<div class="box-shadow box-rounded-corners game-info-box">
<div class="game-type-box">
<img class="game-logo" src="../../static/static/logo/{{game_type}}.svg" />
<span class="game-name">{{game_type}}</span>
</div>
<div class="game-info-dividing-line"></div>
<div class="ranking-info-box">
<span class="ranking-title">Ranking</span>
<span class="ranking">{{ranking}}</span>
<span class="rd">±{{rd}}</span>
</div>
</div>
<div class="flex-gap"></div>
</div>
<div class="chart-shadow box-rounded-corners" id="TR-curve-chart">
<span class="TR-title">Tetra Rating (TR)</span>
<img class="rank-icon" src="../../static/static/rank/{{rank}}.svg" />
<span class="TR" style="display: flex; align-items: flex-end"
>{{TR}}&nbsp;
<p style="font-size: 30px; font-weight: 400; line-height: 47px">(#{{global_rank}})</p>
</span>
</div>
</div>
<span class="big-title">Multiplayer Stats</span>
<div class="multiplayer-box">
<div class="flex-gap"></div>
<div class="multiplayer-data-box">
<div class="multiplayer-data small-data-box box-shadow box-rounded-corners lpm-box">
<span class="big-data-value lpm-value">{{lpm}}</span>
<span class="small-data-value pps-value">{{pps}} pps</span>
</div>
<div class="multiplayer-data small-data-box box-shadow box-rounded-corners apm-box">
<span class="big-data-value apm-value">{{apm}}</span>
<span class="small-data-value apl-value">x{{apl}}</span>
</div>
<div class="multiplayer-data small-data-box box-shadow box-rounded-corners adpm-box">
<span class="big-data-value adpm-value">{{adpm}}</span>
<span class="small-data-value adpl-value">x{{adpl}}</span>
<span class="small-data-value vs-value">{{vs}} vs</span>
</div>
</div>
<div class="flex-gap"></div>
<div class="radar-chart-box">
<div class="chart-shadow box-rounded-corners radar-background" id="radar-chart"></div>
<div class="flex-gap"></div>
<div class="chart-shadow box-rounded-corners small-data-box radar-background radar-description"><p style="font-size: 18px;display: inline;">tips: </p><br />DSPS 每秒挖掘<br />DSPP 每块挖掘<br />CI 奶酪指数<br />GE 垃圾利用率</div>
</div>
<div class="flex-gap"></div>
</div>
<span class="big-title">Singleplayer Stats</span>
<div class="singleplayer-box">
<div class="flex-gap"></div>
<div class="small-data-box box-shadow box-rounded-corners sprint-box">
<span class="big-data-value sprint-value">{{sprint}}</span>
</div>
<div class="flex-gap"></div>
<div class="small-data-box box-shadow box-rounded-corners blitz-box">
<span class="big-data-value blitz-value">{{blitz}}</span>
</div>
<div class="flex-gap"></div>
</div>
<div class="footer">Powered by<br />Nonebot2 x nonebot-plugin-tetris-stats</div>
</div>
</body>
<script src="../../static/js/echarts.js"></script>
<script>
var data = {{data}}
// 曲线图
var lineChartDom = document.getElementById('TR-curve-chart');
var lineChart = echarts.init(lineChartDom, null, { renderer: 'svg' });
var option;
/** @type EChartsOption */
option = {
animation: false,
grid: {
left: '-5%',
bottom: '17%',
width: '90%',
height: '70%',
},
xAxis: {
type: 'time',
minInterval: 3600 * 24 * 1000,
maxInterval: 3600 * 24 * 1000,
axisTick: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
formatter: function (value, index) {
var date = new Date(value);
var lst;
var ret;
function format_date() {
return new Intl.DateTimeFormat('en-US', {
month: '2-digit',
day: '2-digit',
})
.format(date)
.split('/');
}
switch (index) {
case 0:
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
ret = '';
break;
default:
lst = format_date();
if (index === 10) {
ret = '{last_month|' + lst[0] + '}\n{last_day|' + lst[1] + '}';
break;
}
ret = '{month|' + lst[0] + '}\n{day|' + lst[1] + '}';
}
return ret;
},
rich: {
month: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 13,
fontWeight: '400',
color: 'rgba(255, 255, 255, 0.6)',
},
day: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 20,
fontWeight: '800',
color: 'rgba(255, 255, 255, 0.6)',
},
last_month: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 13,
fontWeight: '400',
color: '#373533',
backgroundColor: '#FAFAFA',
borderRadius: 6,
padding: [-10, 0, 10, 0],
width: 36,
height: 37,
lineHeight: 32,
},
last_day: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 20,
fontWeight: '800',
color: '#373533',
padding: [-18, 0, 0, 0],
lineHeight: 0,
},
},
},
zlevel: 1,
},
yAxis: {
type: 'value',
interval: {{split_value}},
position: 'right',
splitLine: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
align: 'right',
formatter: function (value, index) {
return '{value|' + value.toLocaleString() + '}';
},
rich: {
value: {
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 15,
fontWeight: '500',
color: 'rgba(255, 255, 255, 0.6)',
},
},
},
offset: 70,
max: {{value_max+offset}},
min: {{value_min-offset}},
},
series: [
{
// 10天的数据最后一天只要第一条 (时间戳最少要多1ms)
data: data,
type: 'line',
smooth: true,
symbol: function (value, params) {
if (params.dataIndex === data.length - 1) {
return 'image://../../static/static/data/point.svg';
}
return 'none';
},
symbolSize: 75,
symbolOffset: [0.79, 0],
lineStyle: {
color: '#FAFAFA99',
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(250, 250, 250, 0.3)',
},
{
offset: 1,
color: 'rgba(250, 250, 250, 0)',
},
],
global: false,
},
},
markLine: {
data: [
{
xAxis: 'max',
y: 300,
},
],
label: {
show: false,
},
lineStyle: {
color: '#FAFAFA',
width: 3,
type: 'dashed',
cap: 'round',
},
symbol: 'none',
animation: false,
},
z: 5,
},
],
};
option && lineChart.setOption(option);
</script>
<script>
// 雷达图
var radarChartDom = document.getElementById('radar-chart');
var radarChart = echarts.init(radarChartDom, null, { renderer: 'svg' });
var option;
option = {
animation: false,
radar: [
{
indicator: [
{ name: 'PPS' },
{ name: 'APP', nameRotate: 60 },
{ name: 'DSPS', nameRotate: -60 },
{ name: 'DSPP' },
{ name: 'CI', nameRotate: 60 },
{ name: 'GE', nameRotate: -60 },
],
center: ['50%', '50%'],
radius: '65%',
startAngle: 90,
splitNumber: 4,
shape: 'circle',
silent: true,
axisName: {
color: '#FAFAFA',
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 15,
fontWeight: '800',
},
splitArea: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(250, 250, 250, 0.3)',
},
},
axisLabel: {
show: true,
rotate: 0,
margin: -1,
fontFamily: 'CabinetGrotesk-Variable',
fontSize: 7,
fontWeight: '800',
color: '#FFFFFF',
},
splitLine: {
lineStyle: {
color: 'rgba(250, 250, 250, 0.3)',
},
},
},
],
series: [
{
type: 'radar',
symbol: 'none',
label: {
show: true,
},
emphasis: {
disabled: true,
},
lineStyle: {
color: '#FAFAFA',
width: 2.5,
shadowBlur: 20,
shadowColor: 'rgba(250, 250, 250, 1)',
},
areaStyle: {
color: 'rgba(250, 250, 250, 0.45)',
},
data: [
{
value: [{{pps}}, {{app}}, {{dsps}}, {{dspp}}, {{ci}}, {{ge}}],
},
],
},
],
};
option && radarChart.setOption(option);
</script>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1,205 +0,0 @@
/**
* Identicon.js 2.3.3
* http://github.com/stewartlord/identicon.js
*
* PNGLib required for PNG output
* http://www.xarg.org/download/pnglib.js
*
* Copyright 2018, Stewart Lord
* Released under the BSD license
* http://www.opensource.org/licenses/bsd-license.php
*/
(function() {
var PNGlib;
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
PNGlib = require('./pnglib');
} else {
PNGlib = window.PNGlib;
}
var Identicon = function(hash, options){
if (typeof(hash) !== 'string' || hash.length < 15) {
throw 'A hash of at least 15 characters is required.';
}
this.defaults = {
background: [240, 240, 240, 255],
margin: 0.08,
size: 64,
saturation: 0.7,
brightness: 0.5,
format: 'png'
};
this.options = typeof(options) === 'object' ? options : this.defaults;
// backward compatibility with old constructor (hash, size, margin)
if (typeof(arguments[1]) === 'number') { this.options.size = arguments[1]; }
if (arguments[2]) { this.options.margin = arguments[2]; }
this.hash = hash
this.background = this.options.background || this.defaults.background;
this.size = this.options.size || this.defaults.size;
this.format = this.options.format || this.defaults.format;
this.margin = this.options.margin !== undefined ? this.options.margin : this.defaults.margin;
// foreground defaults to last 7 chars as hue at 70% saturation, 50% brightness
var hue = parseInt(this.hash.substr(-7), 16) / 0xfffffff;
var saturation = this.options.saturation || this.defaults.saturation;
var brightness = this.options.brightness || this.defaults.brightness;
this.foreground = this.options.foreground || this.hsl2rgb(hue, saturation, brightness);
};
Identicon.prototype = {
background: null,
foreground: null,
hash: null,
margin: null,
size: null,
format: null,
image: function(){
return this.isSvg()
? new Svg(this.size, this.foreground, this.background)
: new PNGlib(this.size, this.size, 256);
},
render: function(){
var image = this.image(),
size = this.size,
baseMargin = Math.floor(size * this.margin),
cell = Math.floor((size - (baseMargin * 2)) / 5),
margin = Math.floor((size - cell * 5) / 2),
bg = image.color.apply(image, this.background),
fg = image.color.apply(image, this.foreground);
// the first 15 characters of the hash control the pixels (even/odd)
// they are drawn down the middle first, then mirrored outwards
var i, color;
for (i = 0; i < 15; i++) {
color = parseInt(this.hash.charAt(i), 16) % 2 ? bg : fg;
if (i < 5) {
this.rectangle(2 * cell + margin, i * cell + margin, cell, cell, color, image);
} else if (i < 10) {
this.rectangle(1 * cell + margin, (i - 5) * cell + margin, cell, cell, color, image);
this.rectangle(3 * cell + margin, (i - 5) * cell + margin, cell, cell, color, image);
} else if (i < 15) {
this.rectangle(0 * cell + margin, (i - 10) * cell + margin, cell, cell, color, image);
this.rectangle(4 * cell + margin, (i - 10) * cell + margin, cell, cell, color, image);
}
}
return image;
},
rectangle: function(x, y, w, h, color, image){
if (this.isSvg()) {
image.rectangles.push({x: x, y: y, w: w, h: h, color: color});
} else {
var i, j;
for (i = x; i < x + w; i++) {
for (j = y; j < y + h; j++) {
image.buffer[image.index(i, j)] = color;
}
}
}
},
// adapted from: https://gist.github.com/aemkei/1325937
hsl2rgb: function(h, s, b){
h *= 6;
s = [
b += s *= b < .5 ? b : 1 - b,
b - h % 1 * s * 2,
b -= s *= 2,
b,
b + h % 1 * s,
b + s
];
return[
s[ ~~h % 6 ] * 255, // red
s[ (h|16) % 6 ] * 255, // green
s[ (h|8) % 6 ] * 255 // blue
];
},
toString: function(raw){
// backward compatibility with old toString, default to base64
if (raw) {
return this.render().getDump();
} else {
return this.render().getBase64();
}
},
isSvg: function(){
return this.format.match(/svg/i)
}
};
var Svg = function(size, foreground, background){
this.size = size;
this.foreground = this.color.apply(this, foreground);
this.background = this.color.apply(this, background);
this.rectangles = [];
};
Svg.prototype = {
size: null,
foreground: null,
background: null,
rectangles: null,
color: function(r, g, b, a){
var values = [r, g, b].map(Math.round);
values.push((a >= 0) && (a <= 255) ? a/255 : 1);
return 'rgba(' + values.join(',') + ')';
},
getDump: function(){
var i,
xml,
rect,
fg = this.foreground,
bg = this.background,
stroke = this.size * 0.005;
xml = "<svg xmlns='http://www.w3.org/2000/svg'"
+ " width='" + this.size + "' height='" + this.size + "'"
+ " style='background-color:" + bg + ";'>"
+ "<g style='fill:" + fg + "; stroke:" + fg + "; stroke-width:" + stroke + ";'>";
for (i = 0; i < this.rectangles.length; i++) {
rect = this.rectangles[i];
if (rect.color == bg) continue;
xml += "<rect "
+ " x='" + rect.x + "'"
+ " y='" + rect.y + "'"
+ " width='" + rect.w + "'"
+ " height='" + rect.h + "'"
+ "/>";
}
xml += "</g></svg>"
return xml;
},
getBase64: function(){
if ('function' === typeof btoa) {
return btoa(this.getDump());
} else if (Buffer) {
return new Buffer(this.getDump(), 'binary').toString('base64');
} else {
throw 'Cannot generate base64 output';
}
}
};
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = Identicon;
} else {
window.Identicon = Identicon;
}
})();

View File

@@ -1,20 +0,0 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM4.95385 13.5C5.78227 13.5 6.45385 12.8284 6.45385 12C6.45385 11.1716 5.78227 10.5 4.95385 10.5V13.5ZM11.8462 10.5C11.0177 10.5 10.3462 11.1716 10.3462 12C10.3462 12.8284 11.0177 13.5 11.8462 13.5V10.5ZM17.7538 13.5C18.5823 13.5 19.2538 12.8284 19.2538 12C19.2538 11.1716 18.5823 10.5 17.7538 10.5V13.5ZM24.6462 10.5C23.8177 10.5 23.1462 11.1716 23.1462 12C23.1462 12.8284 23.8177 13.5 24.6462 13.5V10.5ZM30.5538 13.5C31.3823 13.5 32.0538 12.8284 32.0538 12C32.0538 11.1716 31.3823 10.5 30.5538 10.5V13.5ZM37.4462 10.5C36.6177 10.5 35.9462 11.1716 35.9462 12C35.9462 12.8284 36.6177 13.5 37.4462 13.5V10.5ZM43.3538 13.5C44.1823 13.5 44.8538 12.8284 44.8538 12C44.8538 11.1716 44.1823 10.5 43.3538 10.5V13.5ZM50.2462 10.5C49.4177 10.5 48.7462 11.1716 48.7462 12C48.7462 12.8284 49.4177 13.5 50.2462 13.5V10.5ZM56.1538 13.5C56.9823 13.5 57.6538 12.8284 57.6538 12C57.6538 11.1716 56.9823 10.5 56.1538 10.5V13.5ZM63.0462 10.5C62.2177 10.5 61.5462 11.1716 61.5462 12C61.5462 12.8284 62.2177 13.5 63.0462 13.5V10.5ZM68.9538 13.5C69.7823 13.5 70.4538 12.8284 70.4538 12C70.4538 11.1716 69.7823 10.5 68.9538 10.5V13.5ZM75.8462 10.5C75.0177 10.5 74.3462 11.1716 74.3462 12C74.3462 12.8284 75.0177 13.5 75.8462 13.5V10.5ZM81.7539 13.5C82.5823 13.5 83.2539 12.8284 83.2539 12C83.2539 11.1716 82.5823 10.5 81.7539 10.5V13.5ZM88.6462 10.5C87.8177 10.5 87.1462 11.1716 87.1462 12C87.1462 12.8284 87.8177 13.5 88.6462 13.5V10.5ZM94.5539 13.5C95.3823 13.5 96.0539 12.8284 96.0539 12C96.0539 11.1716 95.3823 10.5 94.5539 10.5V13.5ZM101.446 10.5C100.618 10.5 99.9462 11.1716 99.9462 12C99.9462 12.8284 100.618 13.5 101.446 13.5V10.5ZM107.354 13.5C108.182 13.5 108.854 12.8284 108.854 12C108.854 11.1716 108.182 10.5 107.354 10.5V13.5ZM114.246 10.5C113.418 10.5 112.746 11.1716 112.746 12C112.746 12.8284 113.418 13.5 114.246 13.5V10.5ZM120.154 13.5C120.982 13.5 121.654 12.8284 121.654 12C121.654 11.1716 120.982 10.5 120.154 10.5V13.5ZM127.046 10.5C126.218 10.5 125.546 11.1716 125.546 12C125.546 12.8284 126.218 13.5 127.046 13.5V10.5ZM2 13.5H4.95385V10.5H2V13.5ZM11.8462 13.5H17.7538V10.5H11.8462V13.5ZM24.6462 13.5H30.5538V10.5H24.6462V13.5ZM37.4462 13.5H43.3538V10.5H37.4462V13.5ZM50.2462 13.5H56.1538V10.5H50.2462V13.5ZM63.0462 13.5H68.9538V10.5H63.0462V13.5ZM75.8462 13.5H81.7539V10.5H75.8462V13.5ZM88.6462 13.5H94.5539V10.5H88.6462V13.5ZM101.446 13.5H107.354V10.5H101.446V13.5ZM114.246 13.5H120.154V10.5H114.246V13.5ZM127.046 13.5H130V10.5H127.046V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM127.046 42.5C126.218 42.5 125.546 43.1716 125.546 44C125.546 44.8284 126.218 45.5 127.046 45.5V42.5ZM120.154 45.5C120.982 45.5 121.654 44.8284 121.654 44C121.654 43.1716 120.982 42.5 120.154 42.5V45.5ZM114.246 42.5C113.418 42.5 112.746 43.1716 112.746 44C112.746 44.8284 113.418 45.5 114.246 45.5V42.5ZM107.354 45.5C108.182 45.5 108.854 44.8284 108.854 44C108.854 43.1716 108.182 42.5 107.354 42.5V45.5ZM101.446 42.5C100.618 42.5 99.9462 43.1716 99.9462 44C99.9462 44.8284 100.618 45.5 101.446 45.5V42.5ZM94.5538 45.5C95.3823 45.5 96.0538 44.8284 96.0538 44C96.0538 43.1716 95.3823 42.5 94.5538 42.5V45.5ZM88.6462 42.5C87.8177 42.5 87.1462 43.1716 87.1462 44C87.1462 44.8284 87.8177 45.5 88.6462 45.5V42.5ZM81.7538 45.5C82.5823 45.5 83.2538 44.8284 83.2538 44C83.2538 43.1716 82.5823 42.5 81.7538 42.5V45.5ZM75.8462 42.5C75.0177 42.5 74.3462 43.1716 74.3462 44C74.3462 44.8284 75.0177 45.5 75.8462 45.5V42.5ZM68.9538 45.5C69.7823 45.5 70.4538 44.8284 70.4538 44C70.4538 43.1716 69.7823 42.5 68.9538 42.5V45.5ZM63.0462 42.5C62.2177 42.5 61.5462 43.1716 61.5462 44C61.5462 44.8284 62.2177 45.5 63.0462 45.5V42.5ZM56.1538 45.5C56.9823 45.5 57.6538 44.8284 57.6538 44C57.6538 43.1716 56.9823 42.5 56.1538 42.5V45.5ZM50.2461 42.5C49.4177 42.5 48.7461 43.1716 48.7461 44C48.7461 44.8284 49.4177 45.5 50.2461 45.5V42.5ZM43.3538 45.5C44.1823 45.5 44.8538 44.8284 44.8538 44C44.8538 43.1716 44.1823 42.5 43.3538 42.5V45.5ZM37.4461 42.5C36.6177 42.5 35.9461 43.1716 35.9461 44C35.9461 44.8284 36.6177 45.5 37.4461 45.5V42.5ZM30.5538 45.5C31.3823 45.5 32.0538 44.8284 32.0538 44C32.0538 43.1716 31.3823 42.5 30.5538 42.5V45.5ZM24.6461 42.5C23.8177 42.5 23.1461 43.1716 23.1461 44C23.1461 44.8284 23.8177 45.5 24.6461 45.5V42.5ZM17.7538 45.5C18.5823 45.5 19.2538 44.8284 19.2538 44C19.2538 43.1716 18.5823 42.5 17.7538 42.5V45.5ZM11.8461 42.5C11.0177 42.5 10.3461 43.1716 10.3461 44C10.3461 44.8284 11.0177 45.5 11.8461 45.5V42.5ZM4.95383 45.5C5.78225 45.5 6.45383 44.8284 6.45383 44C6.45383 43.1716 5.78225 42.5 4.95383 42.5V45.5ZM130 42.5H127.046V45.5H130V42.5ZM120.154 42.5H114.246V45.5H120.154V42.5ZM107.354 42.5H101.446V45.5H107.354V42.5ZM94.5538 42.5H88.6462V45.5H94.5538V42.5ZM81.7538 42.5H75.8462V45.5H81.7538V42.5ZM68.9538 42.5H63.0462V45.5H68.9538V42.5ZM56.1538 42.5H50.2461V45.5H56.1538V42.5ZM43.3538 42.5H37.4461V45.5H43.3538V42.5ZM30.5538 42.5H24.6461V45.5H30.5538V42.5ZM17.7538 42.5H11.8461V45.5H17.7538V42.5ZM4.95383 42.5H2V45.5H4.95383V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_503_299)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM59.6667 37.0667L66.2667 30.4667L72.8667 37.0667C73.1778 37.3778 73.5444 37.5333 73.9667 37.5333C74.3889 37.5333 74.7556 37.3778 75.0667 37.0667C75.3778 36.7556 75.5333 36.3889 75.5333 35.9667C75.5333 35.5444 75.3778 35.1778 75.0667 34.8667L68.4667 28.2667L75.0667 21.6667C75.3778 21.3556 75.5333 20.9889 75.5333 20.5667C75.5333 20.1444 75.3778 19.7778 75.0667 19.4667C74.7556 19.1556 74.3889 19 73.9667 19C73.5444 19 73.1778 19.1556 72.8667 19.4667L66.2667 26.0667L59.6667 19.4667C59.3556 19.1556 58.9889 19 58.5667 19C58.1444 19 57.7778 19.1556 57.4667 19.4667C57.1556 19.7778 57 20.1444 57 20.5667C57 20.9889 57.1556 21.3556 57.4667 21.6667L64.0667 28.2667L57.4667 34.8667C57.1556 35.1778 57 35.5444 57 35.9667C57 36.3889 57.1556 36.7556 57.4667 37.0667C57.7778 37.3778 58.1444 37.5333 58.5667 37.5333C58.9889 37.5333 59.3556 37.3778 59.6667 37.0667Z" fill="#F04444"/>
</g>
<defs>
<filter id="filter0_d_503_299" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_503_299"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_503_299" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -1,20 +0,0 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM2 13.5H130V10.5H2V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM130 42.5L2 42.5V45.5L130 45.5V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_503_333)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM62.0168 35.7834C62.2057 35.8611 62.4001 35.9 62.6001 35.9C62.8001 35.9 62.9945 35.8611 63.1834 35.7834C63.3723 35.7056 63.5334 35.5889 63.6668 35.4334L76.4334 22.6667C76.7445 22.3778 76.9001 22.0167 76.9001 21.5834C76.9001 21.15 76.7445 20.7778 76.4334 20.4667C76.1445 20.1556 75.789 20.0056 75.3668 20.0167C74.9445 20.0278 74.5779 20.1778 74.2668 20.4667L62.6001 32.1334L57.7334 27.2334C57.4223 26.9445 57.0501 26.8 56.6168 26.8C56.1834 26.8 55.8223 26.9445 55.5334 27.2334C55.2445 27.5222 55.1001 27.8889 55.1001 28.3334C55.1001 28.7778 55.2445 29.1445 55.5334 29.4334L61.5668 35.4334C61.6779 35.5889 61.8279 35.7056 62.0168 35.7834Z" fill="#23C55E"/>
</g>
<defs>
<filter id="filter0_d_503_333" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_503_333"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_503_333" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,20 +0,0 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM2 13.5H130V10.5H2V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM130 42.5L2 42.5V45.5L130 45.5V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_1756_38)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 47.9998C77.0457 47.9998 86 39.0455 86 27.9998C86 16.9541 77.0457 7.99976 66 7.99976C54.9543 7.99976 46 16.9541 46 27.9998C46 39.0455 54.9543 47.9998 66 47.9998ZM63.555 32.7332H67.3209V32.0227C67.3209 31.2885 67.4749 30.6608 67.7828 30.1398C68.1144 29.595 68.5288 29.1095 69.0262 28.6832C69.5473 28.2331 70.092 27.8068 70.6605 27.4042C71.2289 26.9779 71.7618 26.516 72.2592 26.0186C72.7802 25.5212 73.1947 24.9528 73.5026 24.3133C73.8342 23.6502 74 22.8686 74 21.9685C74 19.9317 73.325 18.4277 71.975 17.4566C70.6486 16.4855 68.8486 16 66.5748 16C64.7985 16 63.2353 16.3316 61.8853 16.9948C60.5589 17.6579 59.5405 18.5698 58.83 19.7303C58.1431 20.8909 57.8826 22.2291 58.0484 23.7449L61.4234 26.1607C61.2339 24.716 61.3287 23.5199 61.7076 22.5725C62.1103 21.6251 62.7142 20.9264 63.5195 20.4764C64.3248 20.0027 65.2485 19.7659 66.2906 19.7659C67.4749 19.7659 68.3275 20.0146 68.8486 20.5119C69.3933 20.9856 69.6657 21.6014 69.6657 22.3593C69.6657 22.9751 69.5117 23.508 69.2038 23.9581C68.9196 24.4081 68.5407 24.8225 68.067 25.2015C67.617 25.5805 67.1314 25.9713 66.6104 26.3739C66.0893 26.7765 65.5919 27.2147 65.1182 27.6884C64.6682 28.1621 64.2893 28.7305 63.9814 29.3937C63.6972 30.0332 63.555 30.8029 63.555 31.703V32.7332ZM63.1287 40.1229H67.6762V35.078H63.1287V40.1229Z" fill="#E9B308"/>
</g>
<defs>
<filter id="filter0_d_1756_38" x="42" y="6.99976" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1756_38"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1756_38" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -1,20 +0,0 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM4.95385 13.5C5.78227 13.5 6.45385 12.8284 6.45385 12C6.45385 11.1716 5.78227 10.5 4.95385 10.5V13.5ZM11.8462 10.5C11.0177 10.5 10.3462 11.1716 10.3462 12C10.3462 12.8284 11.0177 13.5 11.8462 13.5V10.5ZM17.7538 13.5C18.5823 13.5 19.2538 12.8284 19.2538 12C19.2538 11.1716 18.5823 10.5 17.7538 10.5V13.5ZM24.6462 10.5C23.8177 10.5 23.1462 11.1716 23.1462 12C23.1462 12.8284 23.8177 13.5 24.6462 13.5V10.5ZM30.5538 13.5C31.3823 13.5 32.0538 12.8284 32.0538 12C32.0538 11.1716 31.3823 10.5 30.5538 10.5V13.5ZM37.4462 10.5C36.6177 10.5 35.9462 11.1716 35.9462 12C35.9462 12.8284 36.6177 13.5 37.4462 13.5V10.5ZM43.3538 13.5C44.1823 13.5 44.8538 12.8284 44.8538 12C44.8538 11.1716 44.1823 10.5 43.3538 10.5V13.5ZM50.2462 10.5C49.4177 10.5 48.7462 11.1716 48.7462 12C48.7462 12.8284 49.4177 13.5 50.2462 13.5V10.5ZM56.1538 13.5C56.9823 13.5 57.6538 12.8284 57.6538 12C57.6538 11.1716 56.9823 10.5 56.1538 10.5V13.5ZM63.0462 10.5C62.2177 10.5 61.5462 11.1716 61.5462 12C61.5462 12.8284 62.2177 13.5 63.0462 13.5V10.5ZM68.9538 13.5C69.7823 13.5 70.4538 12.8284 70.4538 12C70.4538 11.1716 69.7823 10.5 68.9538 10.5V13.5ZM75.8462 10.5C75.0177 10.5 74.3462 11.1716 74.3462 12C74.3462 12.8284 75.0177 13.5 75.8462 13.5V10.5ZM81.7539 13.5C82.5823 13.5 83.2539 12.8284 83.2539 12C83.2539 11.1716 82.5823 10.5 81.7539 10.5V13.5ZM88.6462 10.5C87.8177 10.5 87.1462 11.1716 87.1462 12C87.1462 12.8284 87.8177 13.5 88.6462 13.5V10.5ZM94.5539 13.5C95.3823 13.5 96.0539 12.8284 96.0539 12C96.0539 11.1716 95.3823 10.5 94.5539 10.5V13.5ZM101.446 10.5C100.618 10.5 99.9462 11.1716 99.9462 12C99.9462 12.8284 100.618 13.5 101.446 13.5V10.5ZM107.354 13.5C108.182 13.5 108.854 12.8284 108.854 12C108.854 11.1716 108.182 10.5 107.354 10.5V13.5ZM114.246 10.5C113.418 10.5 112.746 11.1716 112.746 12C112.746 12.8284 113.418 13.5 114.246 13.5V10.5ZM120.154 13.5C120.982 13.5 121.654 12.8284 121.654 12C121.654 11.1716 120.982 10.5 120.154 10.5V13.5ZM127.046 10.5C126.218 10.5 125.546 11.1716 125.546 12C125.546 12.8284 126.218 13.5 127.046 13.5V10.5ZM2 13.5H4.95385V10.5H2V13.5ZM11.8462 13.5H17.7538V10.5H11.8462V13.5ZM24.6462 13.5H30.5538V10.5H24.6462V13.5ZM37.4462 13.5H43.3538V10.5H37.4462V13.5ZM50.2462 13.5H56.1538V10.5H50.2462V13.5ZM63.0462 13.5H68.9538V10.5H63.0462V13.5ZM75.8462 13.5H81.7539V10.5H75.8462V13.5ZM88.6462 13.5H94.5539V10.5H88.6462V13.5ZM101.446 13.5H107.354V10.5H101.446V13.5ZM114.246 13.5H120.154V10.5H114.246V13.5ZM127.046 13.5H130V10.5H127.046V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM127.046 42.5C126.218 42.5 125.546 43.1716 125.546 44C125.546 44.8284 126.218 45.5 127.046 45.5V42.5ZM120.154 45.5C120.982 45.5 121.654 44.8284 121.654 44C121.654 43.1716 120.982 42.5 120.154 42.5V45.5ZM114.246 42.5C113.418 42.5 112.746 43.1716 112.746 44C112.746 44.8284 113.418 45.5 114.246 45.5V42.5ZM107.354 45.5C108.182 45.5 108.854 44.8284 108.854 44C108.854 43.1716 108.182 42.5 107.354 42.5V45.5ZM101.446 42.5C100.618 42.5 99.9462 43.1716 99.9462 44C99.9462 44.8284 100.618 45.5 101.446 45.5V42.5ZM94.5538 45.5C95.3823 45.5 96.0538 44.8284 96.0538 44C96.0538 43.1716 95.3823 42.5 94.5538 42.5V45.5ZM88.6462 42.5C87.8177 42.5 87.1462 43.1716 87.1462 44C87.1462 44.8284 87.8177 45.5 88.6462 45.5V42.5ZM81.7538 45.5C82.5823 45.5 83.2538 44.8284 83.2538 44C83.2538 43.1716 82.5823 42.5 81.7538 42.5V45.5ZM75.8462 42.5C75.0177 42.5 74.3462 43.1716 74.3462 44C74.3462 44.8284 75.0177 45.5 75.8462 45.5V42.5ZM68.9538 45.5C69.7823 45.5 70.4538 44.8284 70.4538 44C70.4538 43.1716 69.7823 42.5 68.9538 42.5V45.5ZM63.0462 42.5C62.2177 42.5 61.5462 43.1716 61.5462 44C61.5462 44.8284 62.2177 45.5 63.0462 45.5V42.5ZM56.1538 45.5C56.9823 45.5 57.6538 44.8284 57.6538 44C57.6538 43.1716 56.9823 42.5 56.1538 42.5V45.5ZM50.2461 42.5C49.4177 42.5 48.7461 43.1716 48.7461 44C48.7461 44.8284 49.4177 45.5 50.2461 45.5V42.5ZM43.3538 45.5C44.1823 45.5 44.8538 44.8284 44.8538 44C44.8538 43.1716 44.1823 42.5 43.3538 42.5V45.5ZM37.4461 42.5C36.6177 42.5 35.9461 43.1716 35.9461 44C35.9461 44.8284 36.6177 45.5 37.4461 45.5V42.5ZM30.5538 45.5C31.3823 45.5 32.0538 44.8284 32.0538 44C32.0538 43.1716 31.3823 42.5 30.5538 42.5V45.5ZM24.6461 42.5C23.8177 42.5 23.1461 43.1716 23.1461 44C23.1461 44.8284 23.8177 45.5 24.6461 45.5V42.5ZM17.7538 45.5C18.5823 45.5 19.2538 44.8284 19.2538 44C19.2538 43.1716 18.5823 42.5 17.7538 42.5V45.5ZM11.8461 42.5C11.0177 42.5 10.3461 43.1716 10.3461 44C10.3461 44.8284 11.0177 45.5 11.8461 45.5V42.5ZM4.95383 45.5C5.78225 45.5 6.45383 44.8284 6.45383 44C6.45383 43.1716 5.78225 42.5 4.95383 42.5V45.5ZM130 42.5H127.046V45.5H130V42.5ZM120.154 42.5H114.246V45.5H120.154V42.5ZM107.354 42.5H101.446V45.5H107.354V42.5ZM94.5538 42.5H88.6462V45.5H94.5538V42.5ZM81.7538 42.5H75.8462V45.5H81.7538V42.5ZM68.9538 42.5H63.0462V45.5H68.9538V42.5ZM56.1538 42.5H50.2461V45.5H56.1538V42.5ZM43.3538 42.5H37.4461V45.5H43.3538V42.5ZM30.5538 42.5H24.6461V45.5H30.5538V42.5ZM17.7538 42.5H11.8461V45.5H17.7538V42.5ZM4.95383 42.5H2V45.5H4.95383V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_503_316)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM67.4585 27.0375L69.4418 29.05C69.714 29.05 69.9522 28.9479 70.1564 28.7438C70.3605 28.5396 70.4626 28.3014 70.4626 28.0292C70.4626 27.757 70.3605 27.5236 70.1564 27.3292C69.9522 27.1348 69.714 27.0375 69.4418 27.0375H67.4585ZM72.1835 31.8209L74.3418 33.9209C75.4112 33.4542 76.3251 32.6959 77.0835 31.6459C77.8418 30.5959 78.221 29.4098 78.221 28.0875C78.221 26.2403 77.589 24.6799 76.3251 23.4063C75.0612 22.1327 73.496 21.4959 71.6293 21.4959H68.8293C68.4404 21.4959 68.1147 21.632 67.8522 21.9042C67.5897 22.1764 67.4585 22.507 67.4585 22.8959C67.4585 23.2848 67.5897 23.6104 67.8522 23.8729C68.1147 24.1354 68.4404 24.2667 68.8293 24.2667H71.6585C72.7474 24.2667 73.6515 24.6264 74.371 25.3459C75.0904 26.0653 75.4501 26.9792 75.4501 28.0875C75.4501 29.0014 75.1487 29.8084 74.546 30.5084C73.9432 31.2084 73.1557 31.6459 72.1835 31.8209ZM63.9863 29.05L74.546 39.5792C74.7599 39.8125 75.0078 39.9292 75.2897 39.9292C75.5717 39.9292 75.8196 39.8125 76.0335 39.5792C76.2474 39.3653 76.3543 39.1271 76.3543 38.8646C76.3543 38.6021 76.2474 38.3639 76.0335 38.15L55.821 17.9375C55.5876 17.7236 55.3349 17.6167 55.0626 17.6167C54.7904 17.6167 54.5474 17.7236 54.3335 17.9375C54.1001 18.1709 53.9883 18.4236 53.998 18.6959C54.0078 18.9681 54.1196 19.2111 54.3335 19.425L57.1687 22.2521C56.3256 22.7064 55.609 23.3294 55.0189 24.1209C54.1925 25.2292 53.7793 26.5223 53.7793 28C53.7793 29.8473 54.4112 31.4028 55.6751 32.6667C56.939 33.9306 58.5043 34.5625 60.371 34.5625H63.6085C63.9974 34.5625 64.3279 34.4313 64.6001 34.1688C64.8724 33.9063 65.0085 33.5806 65.0085 33.1917C65.0085 32.8028 64.8724 32.4771 64.6001 32.2146C64.3279 31.9521 63.9974 31.8209 63.6085 31.8209H60.371C59.2626 31.8209 58.3487 31.4611 57.6293 30.7417C56.9099 30.0223 56.5501 29.1084 56.5501 28C56.5501 26.8917 56.9099 25.9778 57.6293 25.2584C58.0882 24.7995 58.6262 24.4869 59.2433 24.3207L62.0223 27.0916C61.9526 27.1327 61.8883 27.1827 61.8293 27.2417C61.6349 27.4361 61.5376 27.6889 61.5376 28C61.5376 28.3111 61.6397 28.5639 61.8439 28.7584C62.048 28.9528 62.296 29.05 62.5876 29.05H63.9863Z" fill="#71717B"/>
</g>
<defs>
<filter id="filter0_d_503_316" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_503_316"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_503_316" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -1,20 +0,0 @@
<svg width="132" height="56" viewBox="0 0 132 56" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 10.5C1.17157 10.5 0.5 11.1716 0.5 12C0.5 12.8284 1.17157 13.5 2 13.5V10.5ZM131.061 13.0607C131.646 12.4749 131.646 11.5251 131.061 10.9393L121.515 1.3934C120.929 0.807611 119.979 0.807611 119.393 1.3934C118.808 1.97919 118.808 2.92893 119.393 3.51472L127.879 12L119.393 20.4853C118.808 21.0711 118.808 22.0208 119.393 22.6066C119.979 23.1924 120.929 23.1924 121.515 22.6066L131.061 13.0607ZM2 13.5H130V10.5H2V13.5Z" fill="#A1A1AB"/>
<path d="M130 45.5C130.828 45.5 131.5 44.8284 131.5 44C131.5 43.1716 130.828 42.5 130 42.5V45.5ZM0.939331 42.9393C0.353546 43.5251 0.353546 44.4749 0.939331 45.0607L10.4853 54.6066C11.0711 55.1924 12.0208 55.1924 12.6066 54.6066C13.1924 54.0208 13.1924 53.0711 12.6066 52.4853L4.12132 44L12.6066 35.5147C13.1924 34.9289 13.1924 33.9792 12.6066 33.3934C12.0208 32.8076 11.0711 32.8076 10.4853 33.3934L0.939331 42.9393ZM130 42.5L2 42.5V45.5L130 45.5V42.5Z" fill="#A1A1AB"/>
<circle cx="66" cy="28" r="28" fill="#F1F1F1"/>
<g filter="url(#filter0_d_505_398)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 48C77.0457 48 86 39.0457 86 28C86 16.9543 77.0457 8 66 8C54.9543 8 46 16.9543 46 28C46 39.0457 54.9543 48 66 48ZM67.5 17.75C67.5 18.7165 66.7165 19.5 65.75 19.5C64.7835 19.5 64 18.7165 64 17.75C64 16.7835 64.7835 16 65.75 16C66.7165 16 67.5 16.7835 67.5 17.75ZM65.75 23C66.5784 23 67.25 23.6716 67.25 24.5V38.5C67.25 39.3284 66.5784 40 65.75 40C64.9216 40 64.25 39.3284 64.25 38.5V24.5C64.25 23.6716 64.9216 23 65.75 23Z" fill="#E9B308"/>
</g>
<defs>
<filter id="filter0_d_505_398" x="42" y="7" width="48" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="3"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_505_398"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_505_398" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,27 +0,0 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_937_158)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_937_158)"/>
<g style="mix-blend-mode:overlay">
<mask id="mask0_937_158" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="128" y="-28" width="195" height="195">
<rect x="128" y="13.1033" width="158.811" height="158.811" transform="rotate(-15 128 13.1033)" fill="url(#paint1_radial_937_158)"/>
</mask>
<g mask="url(#mask0_937_158)">
<path d="M190.662 16.8646L187.237 4.08129L225.587 -6.19454L229.012 6.58877L190.662 16.8646ZM222.285 83.7475L235.068 80.3222L224.792 41.9723L212.009 45.3976L222.285 83.7475ZM242.377 133.168C234.494 135.28 226.657 135.755 218.864 134.591C211.074 133.422 203.87 130.927 197.252 127.105C190.633 123.284 184.871 118.293 179.963 112.132C175.059 105.965 171.551 98.94 169.439 91.0569C167.327 83.1739 166.852 75.3361 168.016 67.5435C169.185 59.754 171.68 52.55 175.501 45.9315C179.323 39.313 184.315 33.5522 190.477 28.6493C196.643 23.7409 203.667 20.2306 211.55 18.1183C218.155 16.3486 224.779 15.7155 231.421 16.2191C238.064 16.7226 244.591 18.2848 251.002 20.9056L257.553 9.55965L268.899 16.1103L262.348 27.4563C267.824 31.698 272.44 36.5694 276.198 42.0706C279.955 47.5718 282.719 53.6248 284.489 60.2295C286.601 68.1125 287.075 75.9503 285.911 83.7429C284.742 91.5324 282.247 98.7364 278.426 105.355C274.605 111.973 269.614 117.736 263.452 122.644C257.285 127.548 250.261 131.056 242.377 133.168ZM238.952 120.385C251.309 117.074 260.685 109.88 267.08 98.8043C273.475 87.7285 275.016 76.0119 271.705 63.6547C268.394 51.2975 261.201 41.9216 250.125 35.527C239.049 29.1323 227.332 27.5905 214.975 30.9016C202.618 34.2127 193.242 41.4062 186.847 52.4821C180.453 63.5579 178.911 75.2745 182.222 87.6317C185.533 99.9889 192.727 109.365 203.803 115.759C214.878 122.154 226.595 123.696 238.952 120.385Z" fill="#1C1B1F"/>
</g>
</g>
<path d="M39.175 38.55H24.65V35.775L32.6 25.25H33.65V29.175H33.25L28.45 35.45H39.175V38.55ZM36.6 42H33.025V25.25H36.6V42ZM47.8797 42.225C46.2797 42.225 44.9297 41.8583 43.8297 41.125C42.7297 40.375 41.888 39.35 41.3047 38.05C40.738 36.75 40.4547 35.2667 40.4547 33.6C40.4547 31.9333 40.738 30.4583 41.3047 29.175C41.888 27.875 42.7297 26.8583 43.8297 26.125C44.9297 25.375 46.2797 25 47.8797 25C49.463 25 50.8047 25.375 51.9047 26.125C53.0214 26.8583 53.863 27.875 54.4297 29.175C54.9964 30.4583 55.2797 31.9333 55.2797 33.6C55.2797 35.2667 54.9964 36.75 54.4297 38.05C53.863 39.35 53.0214 40.375 51.9047 41.125C50.8047 41.8583 49.463 42.225 47.8797 42.225ZM47.8797 38.75C48.7464 38.75 49.4464 38.5417 49.9797 38.125C50.513 37.7083 50.9047 37.1083 51.1547 36.325C51.4047 35.5417 51.5297 34.6333 51.5297 33.6C51.5297 32.55 51.4047 31.6417 51.1547 30.875C50.9047 30.1083 50.513 29.5167 49.9797 29.1C49.4464 28.6667 48.7464 28.45 47.8797 28.45C47.013 28.45 46.313 28.6667 45.7797 29.1C45.2464 29.5167 44.8547 30.1083 44.6047 30.875C44.3547 31.6417 44.2297 32.55 44.2297 33.6C44.2297 34.6333 44.3547 35.5417 44.6047 36.325C44.8547 37.1083 45.2464 37.7083 45.7797 38.125C46.313 38.5417 47.013 38.75 47.8797 38.75ZM61.2248 42H57.6498V25.25H61.2248V42ZM69.5998 42H58.8998V38.825H69.5998V42Z" fill="#B42323"/>
</g>
<defs>
<linearGradient id="paint0_linear_937_158" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC7C7"/>
<stop offset="1" stop-color="#FA9C9C"/>
</linearGradient>
<radialGradient id="paint1_radial_937_158" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(207.405 92.5088) rotate(90) scale(84.3683)">
<stop offset="0.208333" stop-color="white" stop-opacity="0.78"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<clipPath id="clip0_937_158">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,33 +0,0 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_13)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_13)"/>
<g style="mix-blend-mode:overlay" opacity="0.5">
<mask id="mask0_601_13" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="92" y="-32" width="209" height="208">
<rect x="92.9521" y="12.3839" width="169.169" height="169.169" transform="rotate(-15 92.9521 12.3839)" fill="url(#paint1_radial_601_13)"/>
</mask>
<g mask="url(#mask0_601_13)">
<rect x="201.286" y="49.032" width="42.2923" height="42.2923" transform="rotate(-15 201.286 49.032)" fill="black"/>
<rect x="115.499" y="72.0188" width="88.8138" height="42.2923" transform="rotate(-15 115.499 72.0188)" fill="url(#paint2_linear_601_13)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M204.462 106.925C216.305 116.473 229.328 121.132 243.531 120.903C255.945 114 264.896 103.454 270.383 89.2622C275.866 75.0756 276.667 60.738 272.785 46.2494L263.437 11.3625L212.882 6.51932L171.522 35.9911L175.681 51.5145L187.171 48.436L185.118 40.7764L216.138 18.6725L254.055 22.3049L261.295 49.328C264.386 60.8617 263.94 72.2191 259.958 83.4002C255.976 94.5814 249.427 103.079 240.313 108.892C229.512 108.415 219.593 104.33 210.553 96.6381C209.983 96.1531 209.425 95.6605 208.879 95.1602L195.757 98.6763C198.37 101.605 201.271 104.355 204.462 106.925Z" fill="black"/>
</g>
</g>
<path d="M27.925 42H24.125L30.4 25.25H35L41.275 42H37.35L33.65 31.65L32.65 28.1L31.65 31.65L27.925 42ZM37.125 38.275H27.625V35.25H37.125V38.275ZM48.8486 42H43.3236V38.825H48.5486C49.582 38.825 50.432 38.6333 51.0986 38.25C51.782 37.85 52.2903 37.2667 52.6236 36.5C52.957 35.7167 53.1236 34.7583 53.1236 33.625C53.1236 32.475 52.9486 31.5167 52.5986 30.75C52.2653 29.9833 51.757 29.4083 51.0736 29.025C50.3903 28.625 49.532 28.425 48.4986 28.425H43.3236V25.25H48.7986C50.4986 25.25 51.9486 25.6 53.1486 26.3C54.3653 27 55.2903 27.975 55.9236 29.225C56.557 30.475 56.8736 31.9417 56.8736 33.625C56.8736 35.2917 56.557 36.7583 55.9236 38.025C55.2903 39.275 54.3736 40.25 53.1736 40.95C51.9903 41.65 50.5486 42 48.8486 42ZM45.6486 42H42.0736V25.25H45.6486V42ZM65.9914 37.15H60.4414V33.975H65.8664C66.4831 33.975 67.0247 33.8833 67.4914 33.7C67.9747 33.5167 68.3497 33.225 68.6164 32.825C68.8997 32.425 69.0414 31.9 69.0414 31.25C69.0414 30.55 68.8997 30 68.6164 29.6C68.3497 29.1833 67.9747 28.8833 67.4914 28.7C67.0247 28.5167 66.4831 28.425 65.8664 28.425H60.4414V25.25H65.9914C67.2747 25.25 68.4247 25.4583 69.4414 25.875C70.4747 26.2917 71.2914 26.9417 71.8914 27.825C72.4914 28.6917 72.7914 29.8333 72.7914 31.25C72.7914 32.6333 72.4914 33.7583 71.8914 34.625C71.3081 35.4917 70.4997 36.1333 69.4664 36.55C68.4497 36.95 67.2914 37.15 65.9914 37.15ZM62.6164 42H59.0414V25.25H62.6164V42ZM78.1682 42H74.5932V25.25H79.3182L82.0432 31.475L83.6182 36.45L85.1932 31.475L87.9182 25.25H92.6432V42H89.0682V35.725L89.5682 28.975L87.5682 34.55L85.4932 39.1H81.7432L79.6682 34.55L77.6432 28.975L78.1682 35.725V42Z" fill="#235DB4"/>
</g>
<defs>
<linearGradient id="paint0_linear_601_13" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#C7DAFF"/>
<stop offset="1" stop-color="#9CBCFA"/>
</linearGradient>
<radialGradient id="paint1_radial_601_13" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(177.537 96.9684) rotate(90) scale(89.8711)">
<stop offset="0.208333" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint2_linear_601_13" x1="115.499" y1="72.0188" x2="204.313" y2="72.0188" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<clipPath id="clip0_601_13">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,44 +0,0 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_29)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_29)"/>
<path d="M27.925 42H24.125L30.4 25.25H35L41.275 42H37.35L33.65 31.65L32.65 28.1L31.65 31.65L27.925 42ZM37.125 38.275H27.625V35.25H37.125V38.275ZM49.0236 37.15H43.4736V33.975H48.8986C49.5153 33.975 50.057 33.8833 50.5236 33.7C51.007 33.5167 51.382 33.225 51.6486 32.825C51.932 32.425 52.0736 31.9 52.0736 31.25C52.0736 30.55 51.932 30 51.6486 29.6C51.382 29.1833 51.007 28.8833 50.5236 28.7C50.057 28.5167 49.5153 28.425 48.8986 28.425H43.4736V25.25H49.0236C50.307 25.25 51.457 25.4583 52.4736 25.875C53.507 26.2917 54.3236 26.9417 54.9236 27.825C55.5236 28.6917 55.8236 29.8333 55.8236 31.25C55.8236 32.6333 55.5236 33.7583 54.9236 34.625C54.3403 35.4917 53.532 36.1333 52.4986 36.55C51.482 36.95 50.3236 37.15 49.0236 37.15ZM45.6486 42H42.0736V25.25H45.6486V42ZM61.2004 42H57.6254V25.25H62.3504L65.0754 31.475L66.6504 36.45L68.2254 31.475L70.9504 25.25H75.6754V42H72.1004V35.725L72.6004 28.975L70.6004 34.55L68.5254 39.1H64.7754L62.7004 34.55L60.6754 28.975L61.2004 35.725V42Z" fill="#B5530A"/>
<g style="mix-blend-mode:overlay" opacity="0.8">
<mask id="mask0_601_29" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="122" y="-15" width="154" height="154">
<rect x="122" y="18" width="125" height="125" transform="rotate(-15 122 18)" fill="url(#paint1_radial_601_29)"/>
</mask>
<g mask="url(#mask0_601_29)">
<rect x="178.355" y="10.9877" width="31.25" height="31.25" transform="rotate(-15 178.355 10.9877)" fill="black"/>
<rect x="217.141" y="41.0355" width="31.25" height="31.25" transform="rotate(-15 217.141 41.0355)" fill="black"/>
<rect x="181.974" y="90.8991" width="31.25" height="31.25" transform="rotate(-15 181.974 90.8991)" fill="black"/>
<rect x="124.022" y="25.5463" width="56.25" height="31.25" transform="rotate(-15 124.022 25.5463)" fill="url(#paint2_linear_601_29)"/>
<rect x="144.242" y="101.009" width="39.0625" height="31.25" transform="rotate(-15 144.242 101.009)" fill="url(#paint3_linear_601_29)"/>
<rect x="134.132" y="63.2778" width="85.9375" height="31.25" transform="rotate(-15 134.132 63.2778)" fill="url(#paint4_linear_601_29)"/>
</g>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_601_29" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFEAC7"/>
<stop offset="1" stop-color="#FACF9C"/>
</linearGradient>
<radialGradient id="paint1_radial_601_29" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(184.5 80.5) rotate(90) scale(66.4062)">
<stop offset="0.208333" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint2_linear_601_29" x1="124.022" y1="25.5463" x2="180.272" y2="25.5463" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint3_linear_601_29" x1="144.242" y1="101.009" x2="183.305" y2="101.009" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<linearGradient id="paint4_linear_601_29" x1="134.132" y1="63.2778" x2="220.07" y2="63.2778" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<clipPath id="clip0_601_29">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -1,27 +0,0 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_937_164)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_937_164)"/>
<g style="mix-blend-mode:overlay" opacity="0.5">
<mask id="mask0_937_164" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="120" y="-47" width="225" height="225">
<rect x="120" y="0.515015" width="183.584" height="183.584" transform="rotate(-15 120 0.515015)" fill="url(#paint1_radial_937_164)"/>
</mask>
<g mask="url(#mask0_937_164)">
<path d="M235.464 135.879L228.994 82.1788L203.133 89.1081C201.286 89.6031 200.014 89.416 199.316 88.547C198.624 87.6767 198.539 86.2475 199.062 84.2595L221.993 -3.0564L229.382 -5.03619L235.852 48.6645L261.712 41.7352C263.56 41.2402 264.829 41.4279 265.522 42.2983C266.219 43.1673 266.306 44.5958 265.783 46.5838L242.852 133.9L235.464 135.879Z" fill="#1C1B1F"/>
</g>
</g>
<path d="M33.475 42H26.95V38.825H32.95C33.9 38.825 34.5917 38.6667 35.025 38.35C35.4583 38.0333 35.675 37.5333 35.675 36.85C35.675 36.4 35.5667 36.0333 35.35 35.75C35.15 35.4667 34.85 35.2583 34.45 35.125C34.05 34.975 33.5667 34.9 33 34.9H26.95V32.025H32.675C33.1417 32.025 33.5417 31.9667 33.875 31.85C34.225 31.7333 34.4917 31.55 34.675 31.3C34.875 31.0333 34.975 30.6833 34.975 30.25C34.975 29.7833 34.875 29.425 34.675 29.175C34.4917 28.9083 34.225 28.7167 33.875 28.6C33.525 28.4833 33.1083 28.425 32.625 28.425H26.95V25.25H33.575C34.8083 25.25 35.8 25.4417 36.55 25.825C37.3167 26.1917 37.875 26.7 38.225 27.35C38.575 28 38.75 28.7167 38.75 29.5C38.75 30.2167 38.6 30.825 38.3 31.325C38.0167 31.8083 37.6333 32.2 37.15 32.5C36.6667 32.7833 36.1167 33 35.5 33.15C34.8833 33.2833 34.25 33.3667 33.6 33.4C35.0167 33.45 36.1417 33.6583 36.975 34.025C37.825 34.3917 38.4333 34.8917 38.8 35.525C39.1667 36.1417 39.35 36.8417 39.35 37.625C39.35 38.675 39.1083 39.5167 38.625 40.15C38.1417 40.7833 37.4583 41.25 36.575 41.55C35.6917 41.85 34.6583 42 33.475 42ZM28.925 42H25.35V25.25H28.925V42ZM44.9871 42H41.4121V25.25H44.9871V42ZM51.0906 28.3H47.5156V25.25H51.0906V28.3ZM51.0906 42H47.5156V29.75H51.0906V42ZM58.4691 42.25C57.5691 42.25 56.8191 42.0833 56.2191 41.75C55.6358 41.4167 55.2025 40.9583 54.9191 40.375C54.6358 39.7917 54.4941 39.125 54.4941 38.375V28.3L58.0691 26.425V37.725C58.0691 38.225 58.1775 38.575 58.3941 38.775C58.6275 38.975 58.9191 39.075 59.2691 39.075C59.6525 39.075 60.0025 38.95 60.3191 38.7C60.6525 38.4333 60.9108 38.125 61.0941 37.775L62.1191 40.7C61.8525 41.0333 61.4108 41.375 60.7941 41.725C60.1775 42.075 59.4025 42.25 58.4691 42.25ZM61.4691 32.475H52.6691V29.75H61.4691V32.475ZM73.9848 42H62.7848V39.375L67.0348 34.725L69.6598 32.475L66.0348 32.65H63.1348V29.75H73.7348V32.375L69.4098 36.8L66.6348 39.25L70.4098 39.1H73.9848V42Z" fill="#8E23B4"/>
</g>
<defs>
<linearGradient id="paint0_linear_937_164" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#EAC7FF"/>
<stop offset="1" stop-color="#D19CFA"/>
</linearGradient>
<radialGradient id="paint1_radial_937_164" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(211.792 92.3071) rotate(90) scale(97.5291)">
<stop offset="0.208333" stop-color="white" stop-opacity="0.78"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<clipPath id="clip0_937_164">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -1,36 +0,0 @@
<svg width="275" height="125" viewBox="0 0 275 125" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_601_57)">
<rect width="275" height="125" rx="30" fill="url(#paint0_linear_601_57)"/>
<g style="mix-blend-mode:overlay">
<mask id="mask0_601_57" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="122" y="-15" width="154" height="154">
<rect x="122" y="18" width="125" height="125" transform="rotate(-15 122 18)" fill="url(#paint1_radial_601_57)"/>
</mask>
<g mask="url(#mask0_601_57)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M190.033 96.8278L146.264 108.556L154.352 138.741L213.213 122.969L209.169 107.876L194.077 111.92L190.033 96.8278ZM275.093 106.388L231.324 118.116L223.236 87.9309L267.005 76.2032L275.093 106.388Z" fill="black"/>
<rect x="138.176" y="78.3704" width="45.3125" height="31.25" transform="rotate(-15 138.176 78.3704)" fill="black"/>
<rect x="215.148" y="57.7457" width="45.3125" height="31.25" transform="rotate(-15 215.148 57.7457)" fill="black"/>
<rect x="167.278" y="5.86786" width="31.25" height="62.5" transform="rotate(-15 167.278 5.86786)" fill="url(#paint2_linear_601_57)"/>
<rect x="198.547" y="62.1942" width="15.625" height="31.25" transform="rotate(-15 198.547 62.1942)" fill="black"/>
<rect x="179.41" y="51.1456" width="15.625" height="31.25" transform="rotate(-15 179.41 51.1456)" fill="black"/>
</g>
</g>
<path d="M28.925 42H25.35V25.25H28.925V42ZM37.3 42H26.6V38.825H37.3V42ZM37.685 32.425L36.985 30.625C37.4516 30.6083 37.8433 30.525 38.16 30.375C38.4933 30.225 38.66 29.9167 38.66 29.45V29.125H36.935V25.25H40.735V29.225C40.735 30.1917 40.4766 30.9417 39.96 31.475C39.46 32.0083 38.7016 32.325 37.685 32.425ZM49.8781 37.15H44.3281V33.975H49.7531C50.3698 33.975 50.9115 33.8833 51.3781 33.7C51.8615 33.5167 52.2365 33.225 52.5031 32.825C52.7865 32.425 52.9281 31.9 52.9281 31.25C52.9281 30.55 52.7865 30 52.5031 29.6C52.2365 29.1833 51.8615 28.8833 51.3781 28.7C50.9115 28.5167 50.3698 28.425 49.7531 28.425H44.3281V25.25H49.8781C51.1615 25.25 52.3115 25.4583 53.3281 25.875C54.3615 26.2917 55.1781 26.9417 55.7781 27.825C56.3781 28.6917 56.6781 29.8333 56.6781 31.25C56.6781 32.6333 56.3781 33.7583 55.7781 34.625C55.1948 35.4917 54.3865 36.1333 53.3531 36.55C52.3365 36.95 51.1781 37.15 49.8781 37.15ZM46.5031 42H42.9281V25.25H46.5031V42ZM62.0549 42H58.4799V25.25H63.2049L65.9299 31.475L67.5049 36.45L69.0799 31.475L71.8049 25.25H76.5299V42H72.9549V35.725L73.4549 28.975L71.4549 34.55L69.3799 39.1H65.6299L63.5549 34.55L61.5299 28.975L62.0549 35.725V42Z" fill="#4D7D0F"/>
</g>
<defs>
<linearGradient id="paint0_linear_601_57" x1="50.5" y1="-12" x2="244" y2="144.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#EBFFC7"/>
<stop offset="1" stop-color="#D8FA9C"/>
</linearGradient>
<radialGradient id="paint1_radial_601_57" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(184.5 80.5) rotate(90) scale(66.4062)">
<stop offset="0.208333" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint2_linear_601_57" x1="182.903" y1="5.86786" x2="182.903" y2="68.3679" gradientUnits="userSpaceOnUse">
<stop stop-opacity="0"/>
<stop offset="1" stop-opacity="0.4"/>
</linearGradient>
<clipPath id="clip0_601_57">
<rect width="275" height="125" rx="30" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -1,30 +0,0 @@
<svg width="88" height="88" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_ddd_936_155)">
<circle cx="44" cy="44" r="10" fill="#4F9DFF"/>
<circle cx="44" cy="44" r="8.5" stroke="#FAFAFA" stroke-width="3"/>
</g>
<defs>
<filter id="filter0_ddd_936_155" x="0" y="0" width="88" height="88" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="12"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.309804 0 0 0 0 0.615686 0 0 0 0 1 0 0 0 1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_936_155"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="7"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.309804 0 0 0 0 0.615686 0 0 0 0 1 0 0 0 1 0"/>
<feBlend mode="normal" in2="effect1_dropShadow_936_155" result="effect2_dropShadow_936_155"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="17"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.309804 0 0 0 0 0.615686 0 0 0 0 1 0 0 0 1 0"/>
<feBlend mode="normal" in2="effect2_dropShadow_936_155" result="effect3_dropShadow_936_155"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect3_dropShadow_936_155" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,58 +0,0 @@
Fontshare EULA
---—---------------------------------—------------------------------
Free Font - End User License Agreement (FF EULA)
---—---------------------------------—------------------------------
Notice to User
Indian Type Foundry designs, produces and distributes font software as digital fonts to end users worldwide. In addition to commercial fonts that are available for a fee, ITF also offers several fonts which can be used free of charge. The free fonts are distributed through a dedicated platform called www.fontshare.com (“Fontshare”) to end users worldwide. These free fonts are subject to this legally binding EULA between the Indian Type Foundry (“Indian Type Foundry” or “Licensor”) and you (“Licensee”). 
You acknowledge that the Font Software and designs embodied therein are protected by the copyright, other intellectual property rights and industrial property rights and by international treaties. They are and remain at all times the intellectual property of the Indian Type Foundry.
In addition to direct download, Fontshare also offers these free fonts via Fonthsare API using a code. In this case, the Font Software is delivered directly from the servers used by Indian Type Foundry to the Licensee's website, without the Licensee having to download the Font Software.
By downloading, accessing the API, installing, storing, copying or using one of any Font Software, you agree to the following terms. 
Definitions
“Font Software” refers to the set of computer files or programs released under this license that instructs your computer to display and/or print each letters, characters, typographic designs, ornament and so forth. Font Software includes all bitmap and vector representations of fonts and typographic representations and embellishments created by or derived from the Font Software. 
“Original Version” refers to the Font Software as distributed by the Indian Type Foundry as the copyright holder. 
“Derivative Work” refers to the pictorial representation of the font created by the Font Software, including typographic characters such as letters, numerals, ornaments, symbols, or punctuation and special characters.
01. Grant of License
You are hereby granted a non-exclusive, non-assignable, non-transferrable, terminable license to access, download and use the Font Software for your personal or commercial use for an unlimited period of time for free of charge. 
You may use the font Software in any media (including Print, Web, Mobile, Digital, Apps, ePub, Broadcasting and OEM) at any scale, at any location worldwide. 
You may use the Font Software to create logos and other graphic elements, images on any surface, vector files or other scalable drawings and static images. 
You may use the Font Software on any number of devices (computer, tablet, phone). The number of output devices (Printers) is not restricted. 
You may make only such reasonable number of back-up copies suitable to your permitted use. 
You may but are not required to identify Indian Type Foundry Fonts in your work credits. 
02. Limitations of usage
You may not modify, edit, adapt, translate, reverse engineer, decompile or disassemble, alter or otherwise copy the Font Software or the designs embodied therein in whole or in part, without the prior written consent of the Licensor. 
The Fonts may not - beyond the permitted copies and the uses defined herein - be distributed, duplicated, loaned, resold or licensed in any way, whether by lending, donating or give otherwise to a person or entity. This includes the distribution of the Fonts by e-mail, on USB sticks, CD-ROMs, or other media, uploading them in a public server or making the fonts available on peer-to-peer networks. A passing on to external designers or service providers (design agencies, repro studios, printers, etc.) is also not permitted. 
You are not allowed to transmit the Font Software over the Internet in font serving or for font replacement by means of technologies such as but not limited to EOT, Cufon, sIFR or similar technologies that may be developed in the future without the prior written consent of the Licensor. 
03. Embedding
You may embed the Font Software in PDF and other digital documents provided that is done in a secured, read-only mode. It must be ensured beyond doubt that the recipient cannot use the Font Software to edit or to create new documents. The design data (PDFs) created in this way and under these created design data (PDFs) may be distributed in any number. 
The extraction of the Font Software in whole or in part is prohibited. 
04. Third party use, Commercial print service provider
You may include the Font Software in a non-editable electronic document solely for printing and display purposes and provide that electronic document to the commercial print service provider for the purpose of printing. If the print service needs to install the fonts, they too need to download the Font Software from the Licensor's website.
05. Derivative Work
You are allowed to make derivative works as far as you use them for your personal or commercial use. However, you cannot modify, make changes or reverse engineer the original font software provided to you. Any derivative works are the exclusive property of the Licensor and shall be subject to the terms and conditions of this EULA. Derivative works may not be sub-licensed, sold, leased, rented, loaned, or given away without the express written permission of the Licensor. 
06. Warranty and Liability
BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, INDIAN TYPE FOUNDRY MAKES NO WARRANTIES, EXPRESS OR IMPLIED AS TO THE MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR OTHERWISE. THE FONT SOFTWARE WAS NOT MANUFACTURED FOR USE IN MANUFACTURING CONTROL DEVICES OR NAVIGATION DEVICES OR IN CIRCUMSTANCES THAT COULD RESULT IN ENVIRONMENTAL DAMAGE OR PERSONAL INJURY. WITHOUT LIMITING THE FOREGOING, INDIAN TYPE FOUNDRY SHALL IN NO EVENT BE LIABLE TO THE LICENSED USER OR ANY OTHER THIRD PARTY FOR ANY DIRECT, CONSEQUENTIAL OR INCIDENTAL DAMAGES, INCLUDING DAMAGES FROM LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION NOR FOR LOST PROFITS OR SAVINGS ARISING OUT OF THE USE OR INABILITY TO USE THE PRODUCT EVEN IF NOTIFIED IN ADVANCE, UNDER NO CIRCUMSTANCES SHALL INDIAN TYPE FOUNDRYS LIABILITY EXCEED THE REPLACEMENT COST OF THE SOFTWARE. 
IF LICENSEE CHOOSES TO ACCESS THE FONT SOFTWARE THROUGH A CODE (API), IT MAY HAVE A DIRECT IMPACT ON LICENSEE'S WEBSITE OR APPLICATIONS. INDIAN TYPE FOUNDRY IS NOT RESPONSIBLE OR LIABLE FOR ANY INTERRUPTION, MALFUNCTION, DOWNTIME OR OTHER FAILURE OF THE WEBSITE OR ITS API.
07. Updates, Maintenance and Support Services
Licensor will not provide you with any support services for the Software under this Agreement.
08. Termination 
Any breach of the terms of this agreement shall be a cause for termination, provided that such breach is notified in writing to the Licensee by the Licensor and the Licensee failed to rectify the breach within 30 days of the receipt of such notification. 
In the event of termination and without limitation of any remedies under law or equity, you must delete the Font Software and all copies thereof. Proof of this must be provided upon request of the Licensor.  
We reserve the right to claim damages for the violation of the conditions. 
09. Final Provisions
If individual provisions of this agreement are or become invalid, the validity of the remaining provisions shall remain unaffected. Invalid provisions shall be replaced by mutual agreement by such provisions that are suitable to achieve the desired economic purpose, taking into account the interests of both parties. The same shall apply mutatis mutandis to the filling of any gaps which may arise in this agreement.
This contract is subject to laws of the Republic of India. Place of performance and exclusive place of jurisdiction for all disputes between the parties arising out of or in connection with this contract is, as far as legally permissible, Ahmedabad, India.
- 
Last Updated on 22 March 2021
Copyright 2021 Indian Type Foundry. All rights reserved. 

View File

@@ -1,96 +0,0 @@
Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font
Name 'Source'. Source is a trademark of Adobe in the United States
and/or other countries.
This Font Software is licensed under the SIL Open Font License,
Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to
provide a free and open framework in which fonts may be shared and
improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software
components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to,
deleting, or substituting -- in part or in whole -- any of the
components of the Original Version, by changing formats or by porting
the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed,
modify, redistribute, and sell modified and unmodified copies of the
Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created using
the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -1,7 +0,0 @@
<svg width="71" height="71" viewBox="0 0 71 71" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M53.1133 39.2642L42.3935 49.9446C41.8086 50.5274 41.5161 50.8188 41.1788 50.928C40.8822 51.024 40.5626 51.024 40.2659 50.928C39.9287 50.8188 39.6362 50.5274 39.0512 49.9446L30.2776 41.2032L21.5041 49.9446C20.9191 50.5274 20.6266 50.8188 20.2893 50.928C19.9927 51.024 19.6731 51.024 19.3764 50.928C19.0392 50.8188 18.7467 50.5274 18.1617 49.9446L16.1772 47.9673L30.2776 33.9187L39.2299 42.8381C40.0952 43.7002 41.498 43.7002 42.3633 42.8381L53.1133 32.1276V39.2642Z" fill="#EA5252"/>
<path d="M57.5446 34.8491L59.9407 32.4618C60.5256 31.879 60.8181 31.5876 60.9277 31.2516C61.0241 30.956 61.0241 30.6376 60.9277 30.342C60.8181 30.006 60.5256 29.7146 59.9407 29.1318L57.5439 26.7438C57.5444 26.7619 57.5446 26.78 57.5446 26.7982L57.5446 34.8491Z" fill="#EA5252"/>
<path d="M55.3835 24.5913C55.3653 24.5908 55.3472 24.5906 55.3289 24.5906L46.9514 24.5906L49.4959 22.0554C50.0809 21.4726 50.3734 21.1812 50.7107 21.072C51.0073 20.976 51.3269 20.976 51.6236 21.072C51.9608 21.1812 52.2533 21.4726 52.8383 22.0554L55.3835 24.5913Z" fill="#EA5252"/>
<path d="M42.5201 29.0057L40.7224 30.7968L31.9488 22.0554C31.3638 21.4726 31.0714 21.1812 30.7341 21.072C30.4374 20.976 30.1179 20.976 29.8212 21.072C29.4839 21.1812 29.1914 21.4726 28.6065 22.0554L11.0593 39.5382C10.4744 40.121 10.1819 40.4124 10.0723 40.7484C9.9759 41.044 9.9759 41.3624 10.0723 41.658C10.1819 41.994 10.4744 42.2854 11.0593 42.8682L13.0438 44.8454L28.7109 29.2358C29.5762 28.3737 30.9791 28.3737 31.8443 29.2358L40.7966 38.1552L49.9799 29.0057H42.5201Z" fill="#EA5252"/>
<circle cx="35.5" cy="35.5" r="29.5" stroke="#EA5252" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50 160V200H0V0H120V20H85V50H50V108L120 95V115H180V80H200V200H150V142L50 160ZM135 100V65H100V35H135V0H165V35H200V65H165V100H135Z" fill="#D8FA9C"/>
</svg>

Before

Width:  |  Height:  |  Size: 303 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50 160V200H0V0H160L178 18H95V50H50V108L150 90V78H200V200H150V142L50 160ZM200 33V63H110V33H200Z" fill="#D8FA9C"/>
</svg>

Before

Width:  |  Height:  |  Size: 270 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50 160V200H0V0H160L200 40V200H150V142L50 160ZM150 50H50V108L150 90V50Z" fill="#D8FA9C"/>
</svg>

Before

Width:  |  Height:  |  Size: 246 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160V115L185 100L200 85V80H180V115H120V80H85V75H50V50H85V20H120V0H0V200H160L200 160ZM49.9998 125H150V150H49.9998V125ZM135 100V65H99.9998V35H135V1.03335e-05H165V35H200V65H165V100H135Z" fill="#B9E6FD"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160V115L185 100L200 85V80H95V75H50V50H95V20H180L160 0H0V200H160L200 160ZM50 125H150V150H50V125ZM110 35H200V65H110V35Z" fill="#B9E6FD"/>
</svg>

Before

Width:  |  Height:  |  Size: 297 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160L160 200H0V0H160L200 40V85L185 100L200 115V160ZM50 50H150V75H50V50ZM50 125H150V150H50V125Z" fill="#B9E6FD"/>
</svg>

Before

Width:  |  Height:  |  Size: 273 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 200V150H50V50H85V20H120V0H40L0 40V160L40 200H200ZM135 65V100H165V65H200V35H165V0H135V35H100V65H135ZM200 0V20H180V0H200Z" fill="#DDD6FF"/>
</svg>

Before

Width:  |  Height:  |  Size: 299 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 200H40L0 160V40L40 0H200V20H95V50H50V150H200V200ZM200 35V65H110V35H200Z" fill="#DDD6FF"/>
</svg>

Before

Width:  |  Height:  |  Size: 251 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M40 200H200V150H50V50H200V0H40L0 40V160L40 200Z" fill="#DDD6FF"/>
</svg>

Before

Width:  |  Height:  |  Size: 182 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 80V160L160 200H0V0H120V20H85V50H50V150H150V115H180V80H200ZM135 100V65H100V35H135V0H165V35H200V65H165V100H135Z" fill="#F5CFFE"/>
</svg>

Before

Width:  |  Height:  |  Size: 289 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M160 200H0V0H160L200 40V160L160 200ZM150 50H50V150H150V50Z" fill="#F5CFFE"/>
</svg>

Before

Width:  |  Height:  |  Size: 233 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160V115L180 95V115H120V80H85V75H50V50H85V20H120V0H40L0 40V85L40 125H150V150H0V200H160L200 160ZM135 65V100H165V65H200V35H165V0H135V35H100V65H135ZM200 0V20H180V0H200Z" fill="#FEF18B"/>
</svg>

Before

Width:  |  Height:  |  Size: 344 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M200 160L160 200H0V150H150V125H40L0 85V40L40 0H200V18H95V50H50V75H95V78H163L200 115V160ZM200 33V63H110V33H200Z" fill="#FEF18B"/>
</svg>

Before

Width:  |  Height:  |  Size: 285 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M160 200L200 160V115L160 75H50V50H200V0H40L0 40V85L40 125H150V150H0V200H160Z" fill="#FEF18B"/>
</svg>

Before

Width:  |  Height:  |  Size: 211 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M100 200L140 160V115L100 75H50V50H140V0H40L0 40V85L40 125H90V150H0V200H100ZM160 200L200 160V115L160 75H121L155 109V166L121 200H160ZM200 0V50H155V0H200Z" fill="#FEF18B"/>
</svg>

Before

Width:  |  Height:  |  Size: 326 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M40 200H160L200 160V0H150V150H50V0H0V160L40 200Z" fill="#FECBCA"/>
</svg>

Before

Width:  |  Height:  |  Size: 183 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M139 200H200L62 0H0L139 200ZM61 200L91 157L44 90H34L55 120L0 200H61ZM166 109H156L109 42L138 0H200L145 79L166 109Z" fill="#F5CFFE"/>
</svg>

Before

Width:  |  Height:  |  Size: 288 B

View File

@@ -1,3 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M61 200H0L138 0H200L61 200Z" fill="#D7D3D0"/>
</svg>

Before

Width:  |  Height:  |  Size: 162 B

View File

@@ -1,13 +1,10 @@
from base64 import b64decode, b64encode
from base64 import b64encode
from io import BytesIO
from typing import Literal, overload
from nonebot_plugin_userinfo import UserInfo # type: ignore[import-untyped]
from PIL import Image
from ..templates import path
from .browser import BrowserManager
@overload
async def get_avatar(user: UserInfo, scheme: Literal['Data URI'], default: str | None) -> str:
@@ -53,29 +50,3 @@ async def get_avatar(user: UserInfo, scheme: Literal['Data URI', 'bytes'], defau
raise TypeError("Can't get avatar format")
return f'data:{Image.MIME[avatar_format]};base64,{b64encode(bot_avatar).decode()}'
return bot_avatar
async def generate_identicon(hash: str) -> bytes: # noqa: A002
"""使用 identicon 生成头像
Args:
hash (str): 提交给 identicon 的 hash 值
Returns:
bytes: identicon 生成的 svg 的二进制数据
"""
browser = await BrowserManager.get_browser()
async with await browser.new_page() as page:
await page.add_script_tag(path=path / 'js/identicon.js')
return b64decode(
await page.evaluate(rf"""
new Identicon('{hash}', {{
background: [0x08, 0x0a, 0x06, 255],
margin: 0.15,
size: 300,
brightness: 0.48,
saturation: 0.65,
format: 'svg',
}}).toString();
""")
)

View File

@@ -2,17 +2,14 @@ from hashlib import sha256
from ipaddress import IPv4Address, IPv6Address
from typing import ClassVar
from aiofiles import open
from fastapi import FastAPI, Query, Response, status
from fastapi.responses import FileResponse, HTMLResponse
from fastapi import FastAPI, status
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from nonebot import get_app, get_driver
from nonebot.log import logger
from nonebot_plugin_localstore import get_cache_dir # type: ignore[import-untyped]
from pydantic import IPvAnyAddress
from ..templates import path
from .avatar import generate_identicon
from .templates import templates_dir
app = get_app()
@@ -43,32 +40,19 @@ class HostPage:
app.mount(
'/static',
StaticFiles(directory=path),
name='static',
'/host/assets',
StaticFiles(directory=templates_dir / 'assets'),
name='assets',
)
@app.get('/host/page/{page_hash}.html', status_code=status.HTTP_200_OK)
@app.get('/host/{page_hash}.html', status_code=status.HTTP_200_OK)
async def _(page_hash: str) -> HTMLResponse:
if page_hash in HostPage.pages:
return HTMLResponse(HostPage.pages[page_hash])
return NOT_FOUND
@app.get('/identicon')
async def _(md5: str = Query(regex=r'^[a-fA-F0-9]{32}$')):
identicon_path = cache_dir / 'identicon' / f'{md5}.svg'
if identicon_path.exists() is False:
identicon_path.parent.mkdir(parents=True, exist_ok=True)
result = await generate_identicon(md5)
async with open(identicon_path, mode='xb') as file:
await file.write(result)
return Response(result, media_type='image/svg+xml')
logger.debug('Identicon Cache hit!')
return FileResponse(identicon_path, media_type='image/svg+xml')
def get_self_netloc() -> str:
host: IPv4Address | IPv6Address | IPvAnyAddress = global_config.host
if isinstance(host, IPv4Address):

View File

@@ -1,69 +1,104 @@
from typing import Any, Literal, overload
from datetime import datetime
from typing import Annotated, ClassVar, Literal, overload
from jinja2 import Environment, FileSystemLoader
from nonebot.compat import PYDANTIC_V2
from pydantic import BaseModel
from ..game_data_processor.io_data_processor.typing import Rank
from ..templates import path
from .typing import GameType
from .templates import templates_dir
from .typing import Number
Bind = Literal['bind.j2.html']
Data = Literal['data.j2.html']
if PYDANTIC_V2:
from pydantic import PlainSerializer
env = Environment(
loader=FileSystemLoader(path), autoescape=True, trim_blocks=True, lstrip_blocks=True, enable_async=True
loader=FileSystemLoader(templates_dir), autoescape=True, trim_blocks=True, lstrip_blocks=True, enable_async=True
)
@overload
async def render(
template: Bind,
*,
user_avatar: str,
state: Literal['error', 'success', 'unknown', 'unlink', 'unverified'],
bot_avatar: str,
game_type: GameType,
user_name: str,
bot_name: str,
command: str,
) -> str: ...
def format_datetime_to_timestamp(dt: datetime) -> int:
return int(dt.timestamp() * 1000)
class Bind(BaseModel):
class People(BaseModel):
avatar: str
name: str
platform: Literal['TETR.IO', 'TOP', 'TOS']
status: Literal['error', 'success', 'unknown', 'unlink', 'unverified']
user: People
bot: People
command: str
class TETRIOInfo(BaseModel):
class User(BaseModel):
avatar: str
name: str
bio: str | None
class Ranking(BaseModel):
rating: Number
rd: Number
class TetraLeague(BaseModel):
rank: Rank
tr: Number
global_rank: Number
pps: Number
lpm: Number
apm: Number
apl: Number
vs: Number
adpm: Number
adpl: Number
class TetraLeagueHistory(BaseModel):
class Data(BaseModel):
if PYDANTIC_V2:
record_at: Annotated[datetime, PlainSerializer(format_datetime_to_timestamp, return_type=int)]
else:
record_at: datetime # type: ignore[no-redef]
tr: Number
data: list[Data]
split_interval: Number
min_tr: Number
max_tr: Number
offset: Number
class Radar(BaseModel):
app: Number
dsps: Number
dspp: Number
ci: Number
ge: Number
user: User
ranking: Ranking
tetra_league: TetraLeague
tetra_league_history: TetraLeagueHistory
radar: Radar
sprint: str
blitz: str
if not PYDANTIC_V2:
class Config:
json_encoders: ClassVar[dict] = {datetime: format_datetime_to_timestamp}
@overload
async def render(
template: Data,
*,
user_avatar: str,
user_name: str,
user_sign: str | None,
game_type: Literal['TETR.IO'],
ranking: str | float,
rd: str | float,
rank: Rank,
TR: str | float, # noqa: N803
global_rank: str | int,
lpm: str | float,
pps: str | float,
apm: str | float,
apl: str | float,
adpm: str | float,
adpl: str | float,
vs: str | float,
sprint: str,
blitz: str,
data: list[list[int | float]],
split_value: int,
offset: int,
value_max: int,
value_min: int,
app: str | float,
dsps: str | float,
dspp: str | float,
ci: str | float,
ge: str | float,
) -> str: ...
async def render(render_type: Literal['binding'], data: Bind) -> str: ...
async def render(template: Bind | Data, **kwargs: Any) -> str:
if kwargs['game_type'] == 'IO':
kwargs['game_type'] = 'TETR.IO'
return await env.get_template(template).render_async(**kwargs)
@overload
async def render(render_type: Literal['tetrio/info'], data: TETRIOInfo) -> str: ...
async def render(render_type: Literal['binding', 'tetrio/info'], data: Bind | TETRIOInfo) -> str:
if PYDANTIC_V2:
return await env.get_template('index.html').render_async(path=render_type, data=data.model_dump_json())
return await env.get_template('index.html').render_async(path=render_type, data=data.json())

View File

@@ -7,4 +7,5 @@ async def screenshot(url: str) -> bytes:
await browser.new_page(no_viewport=True, viewport={'width': 0, 'height': 0}) as page,
):
await page.goto(url)
await page.wait_for_load_state('networkidle')
return await page.screenshot(full_page=True, type='png')

View File

@@ -0,0 +1,60 @@
from asyncio.subprocess import PIPE, create_subprocess_exec
from shutil import rmtree
from nonebot import get_driver
from nonebot.log import logger
from nonebot_plugin_localstore import get_data_dir # type: ignore[import-untyped]
driver = get_driver()
templates_dir = get_data_dir('nonebot_plugin_tetris_stats') / 'templates'
@driver.on_startup
async def init_templates() -> None:
try:
await create_subprocess_exec('git', '--version', stdout=PIPE)
except FileNotFoundError as e:
raise RuntimeError(
'未找到 git, 请确保 git 已安装并在环境变量中\n安装步骤请参阅: https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git'
) from e
if not templates_dir.exists():
logger.info('模板仓库不存在, 正在尝试初始化...')
proc = await create_subprocess_exec(
'git',
'clone',
'-b',
'gh-pages',
'https://github.com/A-Minos/tetris-stats-templates',
templates_dir,
'--depth=1',
stdout=PIPE,
stderr=PIPE,
)
stdout, stderr = await proc.communicate()
if proc.returncode != 0:
for i in stderr.decode().splitlines():
logger.error(i)
raise RuntimeError('初始化模板仓库失败')
logger.success('模板仓库初始化成功')
return
proc = await create_subprocess_exec(
'git', 'rev-parse', '--is-inside-work-tree', stdout=PIPE, stderr=PIPE, cwd=templates_dir
)
stdout, stderr = await proc.communicate()
if proc.returncode != 0:
for i in stderr.decode().splitlines():
logger.error(i)
logger.warning('模板仓库状态异常, 尝试重新初始化')
rmtree(templates_dir)
await init_templates()
return
logger.info('正在更新模板仓库...')
proc = await create_subprocess_exec('git', 'pull', stdout=PIPE, stderr=PIPE, cwd=templates_dir)
stdout, stderr = await proc.communicate()
logger.info(stdout.decode().strip())
if proc.returncode != 0:
for i in stderr.decode().splitlines():
logger.error(i)
raise RuntimeError('更新模板仓库失败')
logger.success('模板仓库更新成功')

View File

@@ -1,7 +1,7 @@
from collections.abc import Awaitable, Callable
from typing import Any, Literal
Number = int | float
Number = float | int
GameType = Literal['IO', 'TOP', 'TOS']
CommandType = Literal['bind', 'query']
AsyncCallable = Callable[..., Awaitable[Any]]