dev #14562 Добавить меню для iOS WPA

This commit is contained in:
nikolay 2023-06-22 11:09:52 +04:00
parent 50ae2b601e
commit 0ae4e31cfd
13 changed files with 467 additions and 71 deletions

View File

@ -6,13 +6,12 @@ import {
Renderer2,
Inject,
} from '@angular/core';
import { lastValueFrom } from 'rxjs';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MessageService } from 'primeng/api';
import { CookiesService } from 'src/app/services/cookies.service';
import { RpcService, JsonrpcService } from 'src/app/services/jsonrpc.service';
import { DOCUMENT } from '@angular/common';
import { AppleWalletService } from 'src/app/services/apple-wallet.service';
import { getTypeDevice } from 'src/app/utils';
@Directive({
selector: '[appDownloadApp]',
@ -25,15 +24,10 @@ export class DownloadAppDirective implements OnInit {
private messageService: MessageService,
public renderer: Renderer2,
private el: ElementRef,
private _snackBar: MatSnackBar,
private appleWallet: AppleWalletService,
private cookiesService: CookiesService,
@Inject(DOCUMENT) private document: Document,
private jsonrpc: JsonrpcService,
) { }
ngOnInit(): void {
this.getTypeDevice();
getTypeDevice();
if (this.deviceType === 'ios') {
this.el.nativeElement.style.display = 'block';
}
@ -60,72 +54,25 @@ export class DownloadAppDirective implements OnInit {
this.el.nativeElement.style.display = 'none';
}
getTypeDevice() {
const userAgent = window.navigator.userAgent.toLowerCase();
const ios = /iphone|ipod|ipad/.test(userAgent);
this.deviceType = ios ? 'ios' : 'android';
}
@HostListener('click', ['$event'])
async downloadApp(event: MouseEvent) {
if (event) {
event.preventDefault();
}
if (this.deviceType === 'ios') {
await this.addCardToWallet();
return;
}
if (!this.deferredPrompt) {
this.messageService.add({
severity: 'error',
summary: 'Не поддерживается в Вашем браузере!',
});
this._snackBar.open('Не поддерживается в Вашем браузере!', '', {
duration: 3000,
});
return;
}
this.deferredPrompt.prompt();
this.deferredPrompt.userChoice.then((res: any) => {
if (res.outcome === 'accepted') {
this._snackBar.open('Спасибо за установку!', '', {
duration: 3000,
this.messageService.add({
severity: 'success',
summary: 'Спасибо за установку!',
});
}
this.deferredPrompt = null;
});
}
async addCardToWallet() {
const token = this.cookiesService.getItem('token');
try {
const accountData = (
await lastValueFrom(
this.jsonrpc.rpc(
{
method: 'getTokenData',
params: [],
},
RpcService.authService,
true
)
)
).data;
if (token && accountData.user_id) {
this.appleWallet.generateCard(token, accountData.user_id).subscribe({
next: (res: any) => {
this.document.location.href = res.url;
},
error: (err) => {
console.log('Error: ', err);
},
});
}
} catch (e) {
console.log(e);
}
}
}

View File

@ -0,0 +1,3 @@
<li class="menu-item">
<ng-content></ng-content>
</li>

View File

@ -0,0 +1,20 @@
.menu-item {
display: flex;
gap: 10px;
align-items: center;
padding: 10px;
cursor: pointer;
transition: background-color 0.1s;
&:hover {
background-color: var(--main-color_hover);
}
.title {
color: var(--text-color);
}
.icon {
}
}

View File

@ -0,0 +1,18 @@
import { Component, Input, HostListener, } from "@angular/core";
@Component({
selector: 'menu-item',
templateUrl: './menu_item.component.html',
styleUrls: ['./menu_item.component.scss'],
})
export class MenuItemComponent {
@Input()
handler?: (e: any) => void;
@HostListener('click', ['$event'])
onClick(e: any) {
if (this.handler) {
this.handler(e);
}
}
}

View File

@ -2,7 +2,44 @@
<mat-icon style="cursor: pointer;" aria-hidden="false" aria-label="Назад" fontIcon="arrow_back_ios" class="back-arrow" (click)="back()"></mat-icon>
<h1 class="title">{{title}}</h1>
<!-- <div class="plug"></div> -->
<div class="wrapper">
<div *ngIf="showDropdown" class="backdrop" (click)="closeMenu()"></div>
<div *ngIf="showMenu" class="menu">
<button mat-button (click)="toggleMenu()">
<span class="material-icons" style="color: white !important">
more_horiz
</span>
</button>
<div class="menu__dropdown" *ngIf="showDropdown">
<ul>
<menu-item [handler]="handler(aboutApp)">
<span class="material-icons icon" style="color: var(--main-color)">
info
</span>
<span class="item_title">О приложении</span>
</menu-item>
<menu-item [handler]="handler(addToWallet)">
<img src="./assets/apple_wallet.svg" class="icon" width="24" height="24" />
<span class="item_title">Добавить карточку в Wallet</span>
</menu-item>
<div>
<menu-item [handler]="closeMenu" appDownloadApp>
<span class="material-icons" style="color: var(--main-color)">
get_app
</span>
<span class="item_title">Установить как приложение</span>
</menu-item>
</div>
<menu-item [handler]="handler(logout)">
<span class="material-icons" style="color: var(--main-color)">
logout
</span>
<span class="item_title">Выйти</span>
</menu-item>
</ul>
</div>
</div>
<div class="wrapper" *ngIf="!showMenu">
<button
mat-button
*ngIf="!messagingService.checkRequestPermission()"

View File

@ -43,4 +43,30 @@
align-items: center;
gap: 10px;
}
.menu {
position: relative;
.menu__dropdown {
position: fixed;
background-color: white;
width: fit-content;
height: fit-content;
right: 20px;
border-radius: 6px;
box-shadow: 0px 2px 5px -3px black;
.item_title {
color: var(--text-color);
font-size: 14px;
font-style: normal;
}
}
}
.backdrop {
position: absolute;
width: 100vw;
left: 0;
top: 0;
height: 100vh;
}
}

View File

@ -1,5 +1,11 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { MessagingService } from 'src/app/services/messaging.service';
import { getTypeDevice, DeviceType } from 'src/app/utils';
import { AppleWalletService } from 'src/app/services/apple-wallet.service';
import { CookiesService } from 'src/app/services/cookies.service';
import { MatBottomSheet } from '@angular/material/bottom-sheet';
import { ExitComponent } from 'src/app/components/exit/exit.component';
import { Router } from '@angular/router';
@Component({
selector: 'app-navbar[title]',
@ -10,14 +16,66 @@ export class NavbarComponent implements OnInit {
@Input() title: string = 'Название не задано'
@Output() backEvent = new EventEmitter<null>();
constructor(public messagingService: MessagingService) { }
showMenu: boolean = false;
showDropdown: boolean = false;
constructor(
public messagingService: MessagingService,
private appleWalletService: AppleWalletService,
private cookiesService: CookiesService,
private _bottomSheet: MatBottomSheet,
private router: Router,
) { }
handler(cb: () => void): (e: any) => void {
return (e: any) => {
cb();
this.closeMenu();
}
}
aboutApp() { }
ngOnInit(): void {
const deviceType = getTypeDevice();
this.showMenu = deviceType === DeviceType.ios;
}
toggleMenu() {
this.showDropdown = !this.showDropdown;
}
openMenu() {
this.showDropdown = true;
}
closeMenu = () => {
this.showDropdown = false;
}
back() {
this.backEvent.emit(null)
}
addToWallet = () => {
this.appleWalletService.addCardToWallet();
}
deleteToken = (): void => {
this.cookiesService.logout();
}
logout = () => {
const bottomSheet = this._bottomSheet.open(ExitComponent);
bottomSheet.afterDismissed().subscribe({
next: (val) => {
if (val) {
this.deleteToken();
this.router.navigate(['/login']);
}
},
});
}
}

View File

@ -5,6 +5,7 @@ import { IndexComponent } from './components/index/index.component';
import { FooterComponent } from './components/footer/footer.component';
import { SocialMediaButtonsComponent } from './components/social-media-buttons/social-media-buttons.component';
import { NavbarComponent } from './components/navbar/navbar.component';
import { MenuItemComponent } from './components/navbar/menu_item.component';
import { MatIconModule } from '@angular/material/icon';
import { GuestCardComponent } from './pages/guest-card/guest-card.component';
import { QrCodeModule } from 'ng-qrcode';
@ -22,6 +23,7 @@ import { LoyalityProgramComponent } from './pages/loyality-program/loyality-prog
import { MatButtonModule } from '@angular/material/button';
import { ToastModule } from 'primeng/toast';
@NgModule({
declarations: [
IndexComponent,
@ -33,7 +35,8 @@ import { ToastModule } from 'primeng/toast';
LastOrderComponent,
InviteFriendsComponent,
LoginComponent,
LoyalityProgramComponent
LoyalityProgramComponent,
MenuItemComponent,
],
imports: [
ToastModule,

View File

@ -1,6 +1,10 @@
import { lastValueFrom } from 'rxjs';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Injectable, Inject } from '@angular/core';
import { environment } from 'src/environments/environment';
import { CookiesService } from './cookies.service';
import { RpcService, JsonrpcService } from 'src/app/services/jsonrpc.service';
import { DOCUMENT } from '@angular/common';
@Injectable({
providedIn: 'root',
@ -9,7 +13,10 @@ export class AppleWalletService {
private url: string = environment.appleWalletEndpoint;
constructor(
private http: HttpClient,
) {}
private cookiesService: CookiesService,
private jsonrpc: JsonrpcService,
@Inject(DOCUMENT) private document: Document,
) { }
generateCard(token: string, user_id: string) {
let headers = new HttpHeaders();
@ -20,7 +27,7 @@ export class AppleWalletService {
return this.http.get(`${this.url}/client/${environment.clientName}/passUrl/${user_id}/token/${token}`, options)
}
reloadCard(user_id:string) {
reloadCard(user_id: string) {
let headers = new HttpHeaders();
headers = headers.set('Authorization', environment.appleWalletSecret);
const options = {
@ -32,4 +39,37 @@ export class AppleWalletService {
}
return this.http.post(`${this.url}/sendNotification/${user_id}`, body, options)
}
async addCardToWallet() {
const token = this.cookiesService.getItem('token');
try {
const accountData = (
await lastValueFrom(
this.jsonrpc.rpc(
{
method: 'getTokenData',
params: [],
},
RpcService.authService,
true
)
)
).data;
if (token && accountData.user_id) {
this.generateCard(token, accountData.user_id).subscribe({
next: (res: any) => {
this.document.location.href = res.url;
},
error: (err) => {
console.log('Error: ', err);
},
});
}
} catch (e) {
console.log(e);
}
}
}

10
angular/src/app/utils.ts Normal file
View File

@ -0,0 +1,10 @@
export enum DeviceType {
ios,
android,
}
export function getTypeDevice(): DeviceType {
const userAgent = window.navigator.userAgent.toLowerCase();
const ios = /iphone|ipod|ipad/.test(userAgent);
return ios ? DeviceType.ios : DeviceType.android;
}

View File

@ -0,0 +1,232 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="750"
height="563.15234"
viewBox="0 0 198.43748 149.00072"
version="1.1"
id="svg5668"
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
sodipodi:docname="applewallet.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs5662">
<linearGradient
inkscape:collect="always"
id="linearGradient4120">
<stop
style="stop-color:#cbc9be;stop-opacity:1"
offset="0"
id="stop4116" />
<stop
style="stop-color:#c8c5bb;stop-opacity:0"
offset="1"
id="stop4118" />
</linearGradient>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3753">
<path
sodipodi:nodetypes="sscsscsss"
inkscape:connector-curvature="0"
id="path3755"
d="m -31.594972,54.69743 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211535 V 85.50908 c 0,-7.873315 3.149738,-14.211536 13.725777,-14.211536 H 122.86692 c 10.57602,0 13.72577,6.338221 13.72577,14.211536 V 68.908965 c 0,-7.873314 -3.14975,-14.211535 -13.72577,-14.211535 z"
style="opacity:1;fill:#4095ca;fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477" />
</clipPath>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter3829"
x="-0.047008887"
width="1.0940178"
y="-0.27754272"
height="1.5550854">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="3.5631452"
id="feGaussianBlur3831" />
</filter>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3929">
<path
style="opacity:1;fill:#f16d5e;fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477"
d="m 83.818361,394.03231 c -39.972431,0 -51.876954,23.95549 -51.876954,53.71292 v 7.60641 l 176.408203,0.32617 c 47.12943,0.0873 66.42745,19.0478 86.06641,45.57812 5.00155,6.75662 11.08589,15.9143 17.02733,21.86135 17.74131,17.75789 41.00574,26.62878 64.27148,26.62889 23.26576,1.1e-4 46.53019,-8.87097 64.2715,-26.62889 5.94144,-5.94701 12.02578,-15.10473 17.02735,-21.86135 19.63895,-26.53032 38.93696,-45.49096 86.0664,-45.57812 l 176.40819,-0.32617 v -7.60641 c 0,-29.75743 -11.90453,-53.71292 -51.87692,-53.71292 z"
id="path3931"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssscsss" />
</clipPath>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4089"
x="-0.053576618"
width="1.1071532"
y="-0.071352741"
height="1.1427055">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="16.742692"
id="feGaussianBlur4091" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4120"
id="linearGradient4122"
x1="-53.582775"
y1="120.72184"
x2="-53.582775"
y2="114.41766"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4120"
id="linearGradient4131"
gradientUnits="userSpaceOnUse"
x1="-53.582775"
y1="120.72184"
x2="-53.582775"
y2="114.41766"
gradientTransform="translate(190.17547)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-135.71429"
inkscape:cy="572.85714"
inkscape:document-units="mm"
inkscape:current-layer="g4145"
showgrid="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
showguides="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1620"
inkscape:window-height="1010"
inkscape:window-x="-6"
inkscape:window-y="-6"
inkscape:window-maximized="1"
inkscape:guide-bbox="true"
units="px"
inkscape:object-paths="true"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata5665">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(53.582777,-46.342901)">
<g
id="g5740"
transform="matrix(1,0,0,1.0056496,24.568462,4.937821)"
style="fill:#ff0000;fill-opacity:0;stroke-width:0.997187">
<path
inkscape:connector-curvature="0"
id="rect5713"
d="m 10.108037,0.24338852 c -36.91084,0 -63.87995,22.39413848 -63.87995,64.79580448 V 198.5445 c 0,42.40171 26.96911,64.79582 63.87995,64.79582 H 146.93146 c 36.91084,0 63.87996,-22.39411 63.87996,-64.79582 V 65.039193 c 0,-42.401691 -26.96912,-64.79580448 -63.87996,-64.79580448 z"
style="opacity:1;fill:#ff0000;fill-opacity:0;stroke:none;stroke-width:2.09409;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.383178" />
</g>
<g
id="g4145">
<path
inkscape:connector-curvature="0"
id="path4095"
transform="matrix(0.26458333,0,0,0.26458333,-53.771913,0.24338852)"
d="m 77.738281,174.23438 c -50.500035,-2e-5 -77.02343725,30.81653 -77.02343725,77.02343 v 409.10547 c 0,46.20688 26.52340225,77.02344 77.02343725,77.02344 H 673.69141 c 50.50004,0 77.02343,-30.81656 77.02343,-77.02344 V 251.25781 c 0,-46.2069 -26.52339,-77.02344 -77.02343,-77.02343 z"
style="opacity:1;fill:#d9d6cc;fill-opacity:1;stroke:none;stroke-width:155.717;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="sscssssssscsss"
inkscape:connector-curvature="0"
id="rect3638"
d="m -31.594972,54.697449 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211536 v 51.812855 l 46.6746696,0.0863 c 12.4696614,0.0231 17.5755964,5.03973 22.7717374,12.05921 1.323329,1.78769 2.933142,4.21066 4.50515,5.78415 4.694053,4.69844 10.849433,7.04553 17.005162,7.04556 6.15573,3e-5 12.31111,-2.34711 17.005165,-7.04556 1.572006,-1.57348 3.181821,-3.99646 4.505151,-5.78415 5.196141,-7.01948 10.302073,-12.03615 22.771737,-12.05921 l 46.674667,-0.0863 V 68.908985 c 0,-7.873315 -3.14974,-14.211536 -13.72577,-14.211536 z"
style="opacity:1;fill:#f16d5e;fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477" />
<path
transform="matrix(0.26458333,0,0,0.26458333,-53.771913,0.24338852)"
sodipodi:nodetypes="sscsscsss"
inkscape:connector-curvature="0"
id="path3676"
d="m 83.818359,205.81055 c -39.97243,0 -51.876953,23.95548 -51.876953,53.71289 v 62.74059 c 0,-29.75741 11.904523,-53.71289 51.876953,-53.71289 H 667.61133 c 39.97239,0 51.87695,23.95548 51.87695,53.71289 v -62.74059 c 0,-29.75741 -11.90456,-53.71289 -51.87695,-53.71289 z"
style="opacity:1;fill:#3295c9;fill-opacity:1;stroke:none;stroke-width:68.0315;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477" />
<path
clip-path="url(#clipPath3753)"
sodipodi:nodetypes="sscsscsss"
inkscape:connector-curvature="0"
id="path3685"
d="m -31.594972,71.297543 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211536 v 16.600111 c 0,-7.873312 3.149738,-14.211532 13.725777,-14.211532 H 122.86692 c 10.57602,0 13.72577,6.33822 13.72577,14.211532 V 85.509079 c 0,-7.873315 -3.14975,-14.211536 -13.72577,-14.211536 z"
style="opacity:1;fill:#000000;fill-opacity:0.317757;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477;filter:url(#filter3829)" />
<path
style="opacity:1;fill:#fcad00;fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477"
d="m -31.594972,71.297544 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211535 v 16.600111 c 0,-7.873311 3.149738,-14.211532 13.725777,-14.211532 H 122.86692 c 10.57602,0 13.72577,6.338221 13.72577,14.211532 V 85.509079 c 0,-7.873314 -3.14975,-14.211535 -13.72577,-14.211535 z"
id="path3833"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscsscsss" />
<path
transform="translate(4.6064453e-7,16.600115)"
style="opacity:1;fill:#000000;fill-opacity:0.313725;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477;filter:url(#filter3829)"
d="m -31.594972,71.297543 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211536 v 16.600111 c 0,-7.873312 3.149738,-14.211532 13.725777,-14.211532 H 122.86692 c 10.57602,0 13.72577,6.33822 13.72577,14.211532 V 85.509079 c 0,-7.873315 -3.14975,-14.211536 -13.72577,-14.211536 z"
id="path3835"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscsscsss"
clip-path="url(#clipPath3753)" />
<path
sodipodi:nodetypes="sscsscsss"
inkscape:connector-curvature="0"
id="path3837"
d="m -31.594972,87.897659 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211531 v 16.60012 c 0,-7.87332 3.149738,-14.21154 13.725777,-14.21154 H 122.86692 c 10.57602,0 13.72577,6.33822 13.72577,14.21154 v -16.60012 c 0,-7.87331 -3.14975,-14.211531 -13.72577,-14.211531 z"
style="opacity:1;fill:#50be3d;fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477" />
<path
clip-path="url(#clipPath3753)"
sodipodi:nodetypes="sscsscsss"
inkscape:connector-curvature="0"
id="path3839"
d="m -31.594972,71.297543 c -10.576039,0 -13.725777,6.338221 -13.725777,14.211536 v 16.600111 c 0,-7.873312 3.149738,-14.211532 13.725777,-14.211532 H 122.86692 c 10.57602,0 13.72577,6.33822 13.72577,14.211532 V 85.509079 c 0,-7.873315 -3.14975,-14.211536 -13.72577,-14.211536 z"
style="opacity:1;fill:#000000;fill-opacity:0.313725;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477;filter:url(#filter3829)"
transform="translate(9.2128905e-7,33.20023)" />
<path
clip-path="url(#clipPath3929)"
style="opacity:1;fill:#f26d5f;fill-opacity:0.29803923;stroke:none;stroke-width:155.717;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4089)"
d="m 77.738281,174.23438 c -50.500036,-2e-5 -77.02343725,30.81653 -77.02343725,77.02343 v 409.10547 c 0,46.20688 26.52340125,77.02344 77.02343725,77.02344 H 673.69141 c 50.50004,0 77.02343,-30.81656 77.02343,-77.02344 V 251.25781 c 0,-46.2069 -26.52339,-77.02344 -77.02343,-77.02343 z m 6.080078,31.57617 H 667.61133 c 39.97239,0 51.87695,23.95548 51.87695,53.71289 v 195.82812 l -176.4082,0.32617 c -47.12944,0.0872 -66.42745,19.04781 -86.06641,45.57813 -5.00156,6.75662 -11.0859,15.91432 -17.02734,21.86133 -17.74131,17.75792 -41.00574,26.62902 -64.27149,26.6289 -23.26574,-1.1e-4 -46.53018,-8.87102 -64.27148,-26.6289 -5.94145,-5.94705 -12.02579,-15.10471 -17.02734,-21.86133 -19.63896,-26.53032 -38.93698,-45.49082 -86.06641,-45.57813 L 31.941406,455.35156 V 259.52344 c 0,-29.75741 11.904523,-53.71289 51.876953,-53.71289 z"
id="path3848"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,-53.771913,0.24338852)" />
<path
inkscape:connector-curvature="0"
id="rect4114"
d="m -53.582775,108.55904 h 8.262028 v 12.1628 h -8.262028 z"
style="opacity:1;fill:url(#linearGradient4122);fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477" />
<path
style="opacity:1;fill:url(#linearGradient4131);fill-opacity:1;stroke:none;stroke-width:18;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.607477"
d="m 136.59269,108.55904 h 8.26203 v 12.1628 h -8.26203 z"
id="path4129"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -123,6 +123,8 @@ body {
--button-text-color: #ffffff;
--button-text-color_disabled: #cccccc;
--main-color_hover: rgba(127, 32, 97, 0.3);
}
.mdc-button__label {