distinguishment + slight redesign of main view

Prepared for the new release
This commit is contained in:
dan63047 2023-08-21 18:39:04 +03:00
parent 1ef2d7af4a
commit 23a17bcbc0
13 changed files with 599 additions and 59 deletions

View File

@ -1,26 +1,22 @@
# Tetra Stats # Tetra Stats
<center>Track your and other players stats in TETR.IO</center> Track your and other players stats in TETR.IO
![Screenshot of the app](https://imgur.com/CKGYyBg.png) You can [download an app](https://github.com/dan63047/TetraStats/releases), or [use web version](https://ts.dan63.by).
You can [try it out right now](https://ts.dan63.by)!!! (web version) ![Screenshot of the app 1](https://imgur.com/CKGYyBg.png)
If you want an app, you can find it [here](https://github.com/dan63047/TetraStats/releases)!
# Available functionality # Available functionality
- Advanced stats for players - Advanced stats for players
- Rank cutoffs and averages - Ranks cutoffs
- Sqlite database, that can store all data - Minimums, averages, and maximums for every stat of every rank, as well, as whole leaderboard
- Chart for analyzing tetra league state
- Local database, that can store players data
- Comparison to players, rank averages, and player stats from the past - Comparison to players, rank averages, and player stats from the past
- Stats Calculator - Stats Calculator
- Player history in charts - Player history in charts
# I forgor💀 to do # Special thanks
- UI Animations - **kerrmunism** — formulas
- im still not rendering distinguishment - **p1nkl0bst3r** — providing players history
- **osk** and his team — TETR.IO
---
Special thanks to kerrmunism for formulas
and to osk for TETR.IO

View File

@ -1,3 +1,5 @@
// ignore_for_file: hash_and_equals
import 'dart:math'; import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -533,9 +535,9 @@ class EstTr {
statrank = 11.2 * atan((srarea - 93) / 130) + 1; statrank = 11.2 * atan((srarea - 93) / 130) + 1;
if (statrank <= 0) statrank = 0.001; if (statrank <= 0) statrank = 0.001;
estglicko = (4.0867 * srarea + 186.68); estglicko = (4.0867 * srarea + 186.68);
double temp = (1500 - estglicko) * pi; // double temp = (1500 - estglicko) * pi;
double temp2 = pow((15.9056943314 * (pow(_rd, 2)) + 3527584.25978), 0.5) as double; // double temp2 = pow((15.9056943314 * (pow(_rd, 2)) + 3527584.25978), 0.5) as double;
double temp3 = 1 + pow(10, (temp / temp2)) as double; // double temp3 = 1 + pow(10, (temp / temp2)) as double;
//esttr = 25000 / temp3; //esttr = 25000 / temp3;
double ntemp = _pps*(150+(((_vs/_apm) - 1.66)*35))+_app*290+_dsp*700; double ntemp = _pps*(150+(((_vs/_apm) - 1.66)*35))+_app*290+_dsp*700;
esttr = 25000 / esttr = 25000 /

View File

@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang` /// To regenerate, run: `dart run slang`
/// ///
/// Locales: 2 /// Locales: 2
/// Strings: 896 (448 per locale) /// Strings: 898 (449 per locale)
/// ///
/// Built on 2023-08-20 at 21:53 UTC /// Built on 2023-08-21 at 09:52 UTC
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: type=lint // ignore_for_file: type=lint
@ -160,6 +160,7 @@ class _StringsEn implements BaseTranslations<AppLocale, _StringsEn> {
String get sprint => '40 Lines'; String get sprint => '40 Lines';
String get blitz => 'Blitz'; String get blitz => 'Blitz';
String get other => 'Other'; String get other => 'Other';
String get distinguishment => 'Distinguishment';
String get zen => 'Zen'; String get zen => 'Zen';
String get bio => 'Bio'; String get bio => 'Bio';
String get openSearch => 'Search player'; String get openSearch => 'Search player';
@ -683,6 +684,7 @@ class _StringsRu implements _StringsEn {
@override String get sprint => '40 линий'; @override String get sprint => '40 линий';
@override String get blitz => 'Блиц'; @override String get blitz => 'Блиц';
@override String get other => 'Другое'; @override String get other => 'Другое';
@override String get distinguishment => 'Заслуга';
@override String get zen => 'Дзен'; @override String get zen => 'Дзен';
@override String get bio => 'Биография'; @override String get bio => 'Биография';
@override String get openSearch => 'Искать игрока'; @override String get openSearch => 'Искать игрока';
@ -1185,6 +1187,7 @@ extension on _StringsEn {
case 'sprint': return '40 Lines'; case 'sprint': return '40 Lines';
case 'blitz': return 'Blitz'; case 'blitz': return 'Blitz';
case 'other': return 'Other'; case 'other': return 'Other';
case 'distinguishment': return 'Distinguishment';
case 'zen': return 'Zen'; case 'zen': return 'Zen';
case 'bio': return 'Bio'; case 'bio': return 'Bio';
case 'openSearch': return 'Search player'; case 'openSearch': return 'Search player';
@ -1643,6 +1646,7 @@ extension on _StringsRu {
case 'sprint': return '40 линий'; case 'sprint': return '40 линий';
case 'blitz': return 'Блиц'; case 'blitz': return 'Блиц';
case 'other': return 'Другое'; case 'other': return 'Другое';
case 'distinguishment': return 'Заслуга';
case 'zen': return 'Дзен'; case 'zen': return 'Дзен';
case 'bio': return 'Биография'; case 'bio': return 'Биография';
case 'openSearch': return 'Искать игрока'; case 'openSearch': return 'Искать игрока';

View File

@ -29,7 +29,7 @@ void main() async {
LocaleSettings.setLocaleRaw(locale); LocaleSettings.setLocaleRaw(locale);
} }
runApp(TranslationProvider( runApp(TranslationProvider(
child: MyApp(), child: const MyApp(),
)); ));
} }
@ -41,7 +41,7 @@ class MyApp extends StatelessWidget {
return MaterialApp( return MaterialApp(
title: "Tetra Stats", title: "Tetra Stats",
home: const MainView(), home: const MainView(),
scrollBehavior: MaterialScrollBehavior().copyWith( scrollBehavior: const MaterialScrollBehavior().copyWith(
dragDevices: {PointerDeviceKind.mouse, PointerDeviceKind.touch, PointerDeviceKind.stylus, PointerDeviceKind.unknown}, dragDevices: {PointerDeviceKind.mouse, PointerDeviceKind.touch, PointerDeviceKind.stylus, PointerDeviceKind.unknown},
), ),
locale: TranslationProvider.of(context).flutterLocale, locale: TranslationProvider.of(context).flutterLocale,

View File

@ -250,7 +250,7 @@ class CompareState extends State<CompareView> {
titleRedSide = "${theRedSide[2].apm} APM, ${theRedSide[2].pps} PPS, ${theRedSide[2].vs} VS"; titleRedSide = "${theRedSide[2].apm} APM, ${theRedSide[2].pps} PPS, ${theRedSide[2].vs} VS";
break; break;
case Mode.averages: case Mode.averages:
titleRedSide = t.averageXrank(rankLetter: theRedSide[2].rank.toUpperCase());; titleRedSide = t.averageXrank(rankLetter: theRedSide[2].rank.toUpperCase());
break; break;
} }
return Scaffold( return Scaffold(
@ -863,7 +863,7 @@ class PlayerSelector extends StatelessWidget {
final Function fetch; final Function fetch;
final Function change; final Function change;
final Function updateState; final Function updateState;
PlayerSelector( const PlayerSelector(
{super.key, {super.key,
required this.data, required this.data,
required this.mode, required this.mode,

View File

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'dart:math'; import 'dart:math';
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
@ -331,7 +332,7 @@ class _MainState extends State<MainView> with SingleTickerProviderStateMixin {
? snapshot.data![1]['blitz'][0] ? snapshot.data![1]['blitz'][0]
: null), : null),
_OtherThingy( _OtherThingy(
zen: snapshot.data![1]['zen'], bio: snapshot.data![0].bio) zen: snapshot.data![1]['zen'], bio: snapshot.data![0].bio, distinguishment: snapshot.data![0].distinguishment,)
], ],
), ),
), ),
@ -581,7 +582,7 @@ class _HistoryChartThigy extends StatelessWidget{
bottomTitles: AxisTitles(sideTitles: SideTitles(interval: xInterval, showTitles: true, reservedSize: 30, getTitlesWidget: (double value, TitleMeta meta){ bottomTitles: AxisTitles(sideTitles: SideTitles(interval: xInterval, showTitles: true, reservedSize: 30, getTitlesWidget: (double value, TitleMeta meta){
return value != meta.min && value != meta.max ? SideTitleWidget( return value != meta.min && value != meta.max ? SideTitleWidget(
axisSide: meta.axisSide, axisSide: meta.axisSide,
child: Text(DateFormat.yMMMd(LocaleSettings.currentLocale.languageCode) .format(DateTime.fromMillisecondsSinceEpoch(value.floor()))), child: Text(DateFormat.yMMMd(LocaleSettings.currentLocale.languageCode).format(DateTime.fromMillisecondsSinceEpoch(value.floor()))),
) : Container(); ) : Container();
})), })),
leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: true, reservedSize: leftSpace, getTitlesWidget: (double value, TitleMeta meta){ leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: true, reservedSize: leftSpace, getTitlesWidget: (double value, TitleMeta meta){
@ -628,7 +629,12 @@ class _RecordThingy extends StatelessWidget {
fontFamily: "Eurostile Round Extended", fontFamily: "Eurostile Round Extended",
fontSize: bigScreen ? 42 : 28)), fontSize: bigScreen ? 42 : 28)),
if (record!.stream.contains("40l")) if (record!.stream.contains("40l"))
Text( if (record!.endContext!.finalTime.inMicroseconds > 60000000) Text(
"${(record!.endContext!.finalTime.inMicroseconds/1000000/60).floor()}:${(f2.format(record!.endContext!.finalTime.inMicroseconds /1000000 % 60))}",
style: TextStyle(
fontFamily: "Eurostile Round Extended",
fontSize: bigScreen ? 42 : 28))
else Text(
timeInSec.format( timeInSec.format(
record!.endContext!.finalTime.inMicroseconds / record!.endContext!.finalTime.inMicroseconds /
1000000), 1000000),
@ -936,9 +942,34 @@ class _RecordThingy extends StatelessWidget {
class _OtherThingy extends StatelessWidget { class _OtherThingy extends StatelessWidget {
final TetrioZen? zen; final TetrioZen? zen;
final String? bio; final String? bio;
const _OtherThingy({Key? key, required this.zen, required this.bio}) final Distinguishment? distinguishment;
const _OtherThingy({Key? key, required this.zen, required this.bio, required this.distinguishment})
: super(key: key); : super(key: key);
List<InlineSpan> getDistinguishmentSetOfWidgets(String text) {
var exploded = text.split(" ");
List<InlineSpan> result = [];
for (String shit in exploded){
switch (shit) {
case "%osk%":
result.add(WidgetSpan(child: Padding(
padding: const EdgeInsets.only(left: 8),
child: SvgPicture.asset("res/icons/osk.svg", height: 28),
)));
break;
case "%tetrio%":
result.add(WidgetSpan(child: Padding(
padding: const EdgeInsets.only(left: 8),
child: SvgPicture.asset("res/icons/tetrio-logo.svg", height: 28),
)));
break;
default:
result.add(TextSpan(text: " $shit", style: const TextStyle(fontSize: 28, fontWeight: FontWeight.bold)));
}
}
return result;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, constraints) { return LayoutBuilder(builder: (context, constraints) {
@ -949,27 +980,19 @@ class _OtherThingy extends StatelessWidget {
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Column( return Column(
children: [ children: [
Text(t.other, if (distinguishment != null)
style: TextStyle(
fontFamily: "Eurostile Round Extended",
fontSize: bigScreen ? 42 : 28)),
if (zen != null)
Padding( Padding(
padding: const EdgeInsets.fromLTRB(0, 48, 0, 48), padding: const EdgeInsets.fromLTRB(0, 0, 0, 48),
child: Column( child: Column(
children: [ children: [
Text(t.zen, Text(t.distinguishment, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)),
style: TextStyle( RichText(
fontFamily: "Eurostile Round Extended", text: TextSpan(
fontSize: bigScreen ? 42 : 28)), style: DefaultTextStyle.of(context).style,
Text( children: getDistinguishmentSetOfWidgets(distinguishment!.header!),
"${t.statCellNum.level} ${NumberFormat.decimalPattern().format(zen!.level)}", ),
style: TextStyle( ),
fontFamily: "Eurostile Round Extended", Text(distinguishment!.footer!, style: const TextStyle(fontSize: 18)),
fontSize: bigScreen ? 42 : 28)),
Text(
"${t.statCellNum.score} ${NumberFormat.decimalPattern().format(zen!.score)}",
style: const TextStyle(fontSize: 18)),
], ],
), ),
), ),
@ -978,14 +1001,23 @@ class _OtherThingy extends StatelessWidget {
padding: const EdgeInsets.fromLTRB(0, 0, 0, 48), padding: const EdgeInsets.fromLTRB(0, 0, 0, 48),
child: Column( child: Column(
children: [ children: [
Text(t.bio, Text(t.bio, style: TextStyle(fontFamily: "Eurostile Round Extended",fontSize: bigScreen ? 42 : 28)),
style: TextStyle(
fontFamily: "Eurostile Round Extended",
fontSize: bigScreen ? 42 : 28)),
Text(bio!, style: const TextStyle(fontSize: 18)), Text(bio!, style: const TextStyle(fontSize: 18)),
], ],
), ),
), ),
if (zen != null)
Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
child: Column(
children: [
Text(t.zen, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)),
Text("${t.statCellNum.level} ${NumberFormat.decimalPattern().format(zen!.level)}", style: const TextStyle(fontSize: 28, fontWeight: FontWeight.bold)),
Text("${t.statCellNum.score} ${NumberFormat.decimalPattern().format(zen!.score)}", style: const TextStyle(fontSize: 18)),
],
),
),
], ],
); );
}, },

View File

@ -1,5 +1,3 @@
import 'dart:math';
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
@ -7,9 +5,6 @@ import 'package:tetra_stats/data_objects/tetrio.dart';
//import 'package:tetra_stats/data_objects/tetrio.dart'; //import 'package:tetra_stats/data_objects/tetrio.dart';
import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/gen/strings.g.dart';
import 'package:tetra_stats/views/main_view.dart' show MainView, f4, f2; import 'package:tetra_stats/views/main_view.dart' show MainView, f4, f2;
import 'package:tetra_stats/widgets/stat_sell_num.dart';
import 'package:tetra_stats/widgets/tl_thingy.dart';
//import 'package:tetra_stats/widgets/tl_thingy.dart';
List chartsShortTitles = [ List chartsShortTitles = [
"TR", "TR",
@ -39,7 +34,7 @@ List chartsShortTitles = [
"Stride - Plonk", "Stride - Plonk",
"Opener - Inf. DS" "Opener - Inf. DS"
]; ];
var chartsShortTitlesDropdowns = <DropdownMenuItem>[for (String e in chartsShortTitles) DropdownMenuItem(child: Text(e), value: e,)]; var chartsShortTitlesDropdowns = <DropdownMenuItem>[for (String e in chartsShortTitles) DropdownMenuItem(value: e,child: Text(e),)];
int chartsIndexX = 0; int chartsIndexX = 0;
int chartsIndexY = 6; int chartsIndexY = 6;
//final DateFormat dateFormat = DateFormat.yMMMd(LocaleSettings.currentLocale.languageCode).add_Hms(); //final DateFormat dateFormat = DateFormat.yMMMd(LocaleSettings.currentLocale.languageCode).add_Hms();
@ -204,7 +199,7 @@ class RankState extends State<RankView> with SingleTickerProviderStateMixin {
scatterTouchData: ScatterTouchData(touchTooltipData: ScatterTouchTooltipData( scatterTouchData: ScatterTouchData(touchTooltipData: ScatterTouchTooltipData(
fitInsideHorizontally: true, fitInsideVertically: true, getTooltipItems: (touchedSpot) { fitInsideHorizontally: true, fitInsideVertically: true, getTooltipItems: (touchedSpot) {
touchedSpot as _MyScatterSpot; touchedSpot as _MyScatterSpot;
return ScatterTooltipItem("${touchedSpot.nickname}\n", textStyle: TextStyle(fontFamily: "Eurostile Round Extended"), children: [TextSpan(text: "${f4.format(touchedSpot.x)} ${chartsShortTitles[chartsIndexX]}\n${f4.format(touchedSpot.y)} ${chartsShortTitles[chartsIndexY]}", style: TextStyle(fontFamily: "Eurostile Round"))]); return ScatterTooltipItem("${touchedSpot.nickname}\n", textStyle: const TextStyle(fontFamily: "Eurostile Round Extended"), children: [TextSpan(text: "${f4.format(touchedSpot.x)} ${chartsShortTitles[chartsIndexX]}\n${f4.format(touchedSpot.y)} ${chartsShortTitles[chartsIndexY]}", style: const TextStyle(fontFamily: "Eurostile Round"))]);
}), }),
touchCallback:(event, response) { touchCallback:(event, response) {
if (event.runtimeType == FlTapDownEvent && response?.touchedSpot?.spot != null){ if (event.runtimeType == FlTapDownEvent && response?.touchedSpot?.spot != null){
@ -219,7 +214,7 @@ class RankState extends State<RankView> with SingleTickerProviderStateMixin {
} }
},), },),
), ),
swapAnimationDuration: Duration(milliseconds: 150), // Optional swapAnimationDuration: const Duration(milliseconds: 150), // Optional
swapAnimationCurve: Curves.linear, // Optional swapAnimationCurve: Curves.linear, // Optional
), ),
), ),

View File

@ -299,6 +299,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.15" version: "2.0.15"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338"
url: "https://pub.dev"
source: hosted
version: "2.0.7"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -485,6 +493,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.3" version: "1.8.3"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
url: "https://pub.dev"
source: hosted
version: "1.0.1"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
@ -922,6 +938,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.7" version: "3.0.7"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_math: vector_math:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -2,7 +2,7 @@ name: tetra_stats
description: Track your and other player stats in TETR.IO description: Track your and other player stats in TETR.IO
publish_to: 'none' publish_to: 'none'
version: 1.0.1+6 version: 1.1.0+7
environment: environment:
sdk: '>=2.19.6 <3.0.0' sdk: '>=2.19.6 <3.0.0'
@ -38,6 +38,7 @@ dependencies:
slang_flutter: ^3.20.0 slang_flutter: ^3.20.0
csv: ^5.0.2 csv: ^5.0.2
url_launcher: ^6.1.12 url_launcher: ^6.1.12
flutter_svg: any
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
@ -79,6 +80,8 @@ flutter:
- res/avatars/tetrio_anon.png - res/avatars/tetrio_anon.png
- res/avatars/tetrio_banned.png - res/avatars/tetrio_banned.png
- res/icons/kagari.png - res/icons/kagari.png
- res/icons/osk.svg
- res/icons/tetrio-logo.svg
- res/tetrio_tl_alpha_ranks/x.png - res/tetrio_tl_alpha_ranks/x.png
- res/tetrio_tl_alpha_ranks/u.png - res/tetrio_tl_alpha_ranks/u.png
- res/tetrio_tl_alpha_ranks/ss.png - res/tetrio_tl_alpha_ranks/ss.png

View File

@ -9,6 +9,7 @@
"sprint": "40 Lines", "sprint": "40 Lines",
"blitz": "Blitz", "blitz": "Blitz",
"other": "Other", "other": "Other",
"distinguishment": "Distinguishment",
"zen": "Zen", "zen": "Zen",
"bio": "Bio", "bio": "Bio",
"openSearch": "Search player", "openSearch": "Search player",

View File

@ -9,6 +9,7 @@
"sprint": "40 линий", "sprint": "40 линий",
"blitz": "Блиц", "blitz": "Блиц",
"other": "Другое", "other": "Другое",
"distinguishment": "Заслуга",
"zen": "Дзен", "zen": "Дзен",
"bio": "Биография", "bio": "Биография",
"openSearch": "Искать игрока", "openSearch": "Искать игрока",

83
res/icons/osk.svg Normal file
View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="166.54634mm"
height="76.409546mm"
viewBox="0 0 166.54634 76.409546"
version="1.1"
id="svg4765"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="osk.svg">
<defs
id="defs4759" />
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="396.72531"
inkscape:cy="87.674744"
inkscape:document-units="mm"
inkscape:current-layer="text9244"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:pagecheckerboard="true"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1676"
inkscape:window-y="-4"
inkscape:window-maximized="1" />
<metadata
id="metadata4762">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-1.6253191,-1.133197)">
<g
aria-label="osk"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:112.90530396px;line-height:1.25;font-family:'Franklin Gothic Medium';-inkscape-font-specification:'Franklin Gothic Medium, ';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.17609692"
id="text9244">
<path
d="m 26.984908,77.542744 q -12.349017,0 -18.8543029,-8.875857 -6.505286,-8.875856 -6.505286,-20.342801 0,-12.349018 7.16684,-20.56332 7.2219699,-8.214302 19.0196919,-8.214302 11.191298,0 18.358138,7.993784 7.22197,7.993784 7.22197,20.783838 0,13.175961 -7.497617,21.224874 -7.442489,7.993784 -18.909434,7.993784 z M 27.425945,67.17839 q 12.679795,0 12.679795,-18.909434 0,-8.545079 -3.032125,-13.451608 -3.032125,-4.961659 -9.316893,-4.961659 -6.505286,0 -9.64767,5.127047 -3.142384,5.071918 -3.142384,13.506738 0,9.096375 3.307773,13.892645 3.362902,4.796271 9.151504,4.796271 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:112.90530396px;font-family:'Franklin Gothic Medium';-inkscape-font-specification:'Franklin Gothic Medium, ';fill:#ffffff;fill-opacity:1;stroke-width:1.17609692"
id="path9246"
inkscape:connector-curvature="0" />
<path
d="m 58.188231,63.594969 11.797722,-2.260311 q 2.701347,6.780934 11.907981,6.780934 11.68746,0 11.68746,-6.891193 0,-2.205182 -1.81927,-3.63855 -1.81928,-1.433368 -4.30011,-1.929534 L 77.318182,53.726781 q -16.86964,-3.252643 -16.86964,-16.483733 0,-7.387359 5.347566,-12.514407 5.347565,-5.182177 15.932437,-5.182177 17.641459,0 21.555645,12.955443 l -11.191286,2.260311 q -1.76415,-6.284768 -10.033581,-6.284768 -10.033577,0 -10.033577,6.284768 0,4.355234 8.104043,6.00912 l 11.963115,2.48083 q 13.947766,2.866736 13.947766,15.987567 0,9.206634 -7.166836,13.782386 -7.16684,4.520623 -17.035029,4.520623 -8.54508,0 -15.105495,-3.418032 -6.560416,-3.473161 -8.545079,-10.529743 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:112.90530396px;font-family:'Franklin Gothic Medium';-inkscape-font-specification:'Franklin Gothic Medium, ';fill:#ffffff;fill-opacity:1;stroke-width:1.17609692"
id="path9248"
inkscape:connector-curvature="0" />
<path
d="M 168.17166,76.385023 H 154.94057 L 140.71715,47.82792 128.36813,61.665435 V 76.385023 H 116.34989 V 12.359895 L 5.1654951,12.359394 5.1657664,1.133197 H 128.36813 V 47.82792 c 1.06584,-1.396615 1.91116,-2.444077 2.53596,-3.142384 l 22.05182,-23.981351 h 13.50674 l -16.75938,18.413267 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:112.90530396px;font-family:'Franklin Gothic Medium';-inkscape-font-specification:'Franklin Gothic Medium, ';fill:#ffffff;fill-opacity:1;stroke-width:1.17609692"
id="path9250"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

383
res/icons/tetrio-logo.svg Normal file
View File

@ -0,0 +1,383 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="270mm"
height="60.000004mm"
viewBox="0 0 270 60.000004"
version="1.1"
id="svg824"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="tetrio-logo.svg">
<defs
id="defs818">
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter835">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix831" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix833" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter841">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix837" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix839" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter847">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix843" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix845" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter853">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix849" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix851" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter859">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix855" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix857" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter865">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix861" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix863" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter871">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix867" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix869" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter877">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix873" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix875" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter883">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix879" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix881" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter889">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix885" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix887" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter895">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix891" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix893" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter901">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix897" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix899" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter907">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix903" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix905" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter913">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix909" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix911" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter919">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix915" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix917" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Invert"
id="filter925">
<feColorMatrix
type="hueRotate"
values="180"
result="color1"
id="feColorMatrix921" />
<feColorMatrix
values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 -0.21 -0.72 -0.07 2 0 "
result="color2"
id="feColorMatrix923" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="167.33069"
inkscape:cy="55.457528"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:pagecheckerboard="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="1676"
inkscape:window-y="-4"
inkscape:window-maximized="1" />
<metadata
id="metadata821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-27)">
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 0,27 V 37 H 10 V 47 H 20 V 37 H 30 V 27 Z"
id="path1369"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.73333335;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 10,47 V 87 H 20 V 47 Z"
id="path1371"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 70,27 H 40 V 47 H 50 V 37 h 20 z"
id="path1373"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 170,57.000005 v 20 h 19.99999 v -20 z"
id="path1375"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 240,57.000013 V 27 h 19.99999 V 37.000003 H 250 v 20.00001 z"
id="path1373-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.73333335;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 70.000001,47 H 40 V 67 H 50 V 57 h 20.000001 z"
id="path1373-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 80,67 H 40 v 10 h 40 z"
id="path1371-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 80,27 v 10 h 10 v 10 h 10 V 37 h 10 V 27 Z"
id="path1369-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.73333335;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 90,47 v 40.000004 h 10 V 47 Z"
id="path1371-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 150,27 h -30 v 20 h 10 V 37 h 20 z"
id="path1373-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.73333335;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 130,57 h 30 V 37 h -10 v 10 h -20 z"
id="path1373-9-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.53333336;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 120,47 v 40.000005 h 10 V 47 Z"
id="path1371-5-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 140,57.000005 v 30 h 20 v -10 h -10 v -20 z"
id="path1373-9-4-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="m 200,27 v 10 h 10 v 10 h 10 V 37 h 10 V 27 Z"
id="path1369-6-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.73333335;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 230,67 V 57 H 220 V 47 h -10 v 10 h -10.00001 v 10 z"
id="path1369-6-7-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:0.73333335;stroke:none;stroke-width:0.89099997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.90825686"
d="M 269.99999,37.000002 V 67.000016 H 250 V 57.000013 h 9.99999 V 37.000002 Z"
id="path1373-4-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB