Skip to content
Snippets Groups Projects
Commit 060a001d authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '1-first-game-release' into 'master'

Resolve "First game release"

Closes #1

See merge request !1
parents dca4ec14 816b2e33
No related branches found
Tags Release_0.0.1_1
1 merge request!1Resolve "First game release"
Pipeline #7770 passed
Showing
with 1444 additions and 0 deletions
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/cell.dart';
import 'package:suguru/models/activity/cell_location.dart';
import 'package:suguru/models/activity/activity.dart';
import 'package:suguru/ui/widgets/game/cell_update.dart';
class SelectCellValueBar extends StatelessWidget {
const SelectCellValueBar({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity activity = activityState.currentActivity;
final bool isUpdatableCellSelected =
(activity.selectedCell != null) ? !activity.selectedCell!.isFixed : false;
final int maxValue =
activity.board.getMaxValueForBlock(activity.selectedCell?.blockId);
const int fixedItemsCountPerLine = 6;
return Container(
margin: const EdgeInsets.all(2),
padding: const EdgeInsets.all(2),
child: Table(
defaultColumnWidth: const IntrinsicColumnWidth(),
children: [
TableRow(
children: [
for (int value = 0; value < fixedItemsCountPerLine; value++)
Column(
children: [
CellWidgetUpdate(
cell: Cell(
location: CellLocation.go(1, value),
blockId: '',
value:
isUpdatableCellSelected ? (value <= maxValue ? value : 0) : -1,
isFixed: false,
),
),
],
),
],
),
],
),
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/activity.dart';
class ButtonShowConflicts extends StatelessWidget {
const ButtonShowConflicts({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
return StyledButton(
color: currentActivity.showConflicts == true ? Colors.amber : Colors.grey,
child: const Image(
image: AssetImage('assets/ui/button_show_conflicts.png'),
fit: BoxFit.fill,
),
onPressed: () {
BlocProvider.of<ActivityCubit>(context).toggleShowConflicts();
},
);
},
);
}
}
import 'package:badges/badges.dart' as badges;
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:suguru/config/application_config.dart';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/activity.dart';
class ButtonShowTip extends StatelessWidget {
const ButtonShowTip({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
return StyledButton(
color: Colors.purple,
child: badges.Badge(
showBadge: currentActivity.givenTipsCount == 0 ? false : true,
badgeStyle: badges.BadgeStyle(
badgeColor: currentActivity.givenTipsCount < 10
? Colors.green
: currentActivity.givenTipsCount < 20
? Colors.orange
: Colors.red,
),
badgeContent: Text(
currentActivity.givenTipsCount == 0
? ''
: currentActivity.givenTipsCount.toString(),
style: const TextStyle(color: Colors.white),
),
child: Container(
padding: EdgeInsets.all(10 *
currentActivity.buttonTipsCountdown /
ApplicationConfig.defaultTipCountDownValueInSeconds),
child: const Image(
image: AssetImage('assets/ui/button_help.png'),
fit: BoxFit.fill,
),
),
),
onPressed: () {
currentActivity.canGiveTip
? currentActivity.showTip(BlocProvider.of<ActivityCubit>(context))
: null;
},
);
},
);
}
}
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:suguru/config/application_config.dart';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/cell.dart';
import 'package:suguru/models/activity/activity.dart';
class CellWidget extends StatelessWidget {
const CellWidget({
super.key,
required this.cell,
required this.hasBlockBorderTop,
required this.hasBlockBorderLeft,
required this.hasBlockBorderBottom,
required this.hasBlockBorderRight,
});
final Cell cell;
final bool hasBlockBorderTop;
final bool hasBlockBorderLeft;
final bool hasBlockBorderBottom;
final bool hasBlockBorderRight;
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity activity = activityState.currentActivity;
final String imageAsset = getImageAssetName(activity);
return Container(
decoration: BoxDecoration(
color: getBackgroundColor(activity),
border: getCellBorders(activity),
),
child: GestureDetector(
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 100),
transitionBuilder: (Widget child, Animation<double> animation) {
return ScaleTransition(scale: animation, child: child);
},
child: Image(
image: AssetImage(imageAsset),
fit: BoxFit.fill,
key: ValueKey<int>(imageAsset.hashCode),
),
),
onTap: () {
final ActivityCubit activityCubit = BlocProvider.of<ActivityCubit>(context);
if (cell.location.col != activity.selectedCell?.location.col ||
cell.location.row != activity.selectedCell?.location.row) {
activityCubit.selectCell(cell.location);
} else {
activityCubit.unselectCell();
}
},
),
);
},
);
}
/*
* Compute image asset name, from skin and cell value/state
*/
String getImageAssetName(Activity activity) {
if (cell.value > 0 && cell.value < 10) {
return 'assets/skins/${activity.activitySettings.get(ApplicationConfig.parameterCodeSkin)}_${cell.value}.png';
}
return 'assets/ui/cell_empty.png';
}
// Compute cell background color, from cell state
Color getBackgroundColor(Activity activity) {
final Color editableCellColor = Colors.grey.shade100;
final Color editableCellColorConflict = Colors.pink.shade100;
final Color fixedCellColor = Colors.grey.shade300;
final Color fixedCellColorConflict = Colors.pink.shade200;
final Color editableAnimated = Colors.green.shade200;
final Color fixedAnimated = Colors.green.shade300;
Color backgroundColor = editableCellColor;
if (cell.isFixed == true) {
backgroundColor = fixedCellColor;
}
final int conflictsCount = activity.boardConflicts[cell.location.row][cell.location.col];
if (activity.showConflicts == true) {
if (conflictsCount != 0) {
if (cell.isFixed == true) {
backgroundColor = fixedCellColorConflict;
} else {
backgroundColor = editableCellColorConflict;
}
}
}
final bool isAnimated = activity.boardAnimated[cell.location.row][cell.location.col];
if (isAnimated) {
if (cell.isFixed == true) {
backgroundColor = fixedAnimated;
} else {
backgroundColor = editableAnimated;
}
}
return backgroundColor;
}
// Compute cell borders, from board size and cell state
Border getCellBorders(Activity activity) {
final Color cellBorderDarkColor = Colors.grey.shade800;
final Color cellBorderLightColor = Colors.grey.shade400;
const Color cellBorderSelectedColor = Colors.red;
Color cellBorderColor = cellBorderSelectedColor;
double cellBorderWidth = 4;
final int boardSizeReference =
max(activity.boardSizeHorizontal, activity.boardSizeVertical);
// Reduce cell border width on big boards
if (boardSizeReference > 8) {
cellBorderWidth = 2;
if (boardSizeReference > 10) {
cellBorderWidth = 1;
}
}
if (!activity.isRunning) {
cellBorderColor = Colors.green.shade700;
}
Border borders = Border.all(
color: cellBorderColor,
width: cellBorderWidth,
);
// Update cell borders if not currently selected cell
if (cell.location.col != activity.selectedCell?.location.col ||
cell.location.row != activity.selectedCell?.location.row) {
borders = Border(
top: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderTop ||
(((cell.location.row) % activity.boardSizeVertical) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
left: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderLeft ||
(((cell.location.col) % activity.boardSizeHorizontal) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
right: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderRight ||
((((cell.location.col) + 1) % activity.boardSizeHorizontal) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
bottom: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderBottom ||
((((cell.location.row) + 1) % activity.boardSizeVertical) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
);
}
return borders;
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:suguru/config/application_config.dart';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/cell.dart';
import 'package:suguru/models/activity/activity.dart';
class CellWidgetUpdate extends StatelessWidget {
const CellWidgetUpdate({super.key, this.cell});
final Cell? cell;
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity activity = activityState.currentActivity;
if ((cell?.value ?? 0) < 0) {
return SizedBox.shrink();
}
final String imageAsset = getImageAssetName(activity);
Color backgroundColor = Colors.grey.shade200;
if (activity.showConflicts == true &&
activity.selectedCell?.location.col != null &&
activity.selectedCell?.location.row != null) {
if (!activity.board
.isValueAllowed(activity.selectedCell?.location, cell?.value ?? 0)) {
backgroundColor = Colors.pink.shade100;
}
}
return Container(
decoration: BoxDecoration(
color: backgroundColor,
border: Border.all(
color: Colors.grey.shade700,
width: 2,
),
),
child: GestureDetector(
child: Image(image: AssetImage(imageAsset), fit: BoxFit.fill),
onTap: () {
final ActivityCubit activityCubit = BlocProvider.of<ActivityCubit>(context);
if (activity.selectedCell != null) {
activityCubit.updateCellValue(
activity.selectedCell!.location, cell?.value ?? 0);
}
activityCubit.unselectCell();
},
),
);
},
);
}
/*
* Compute image asset name, from skin and cell value/state
*/
String getImageAssetName(Activity activity) {
if ((cell?.value ?? 0) > 0) {
final int cellValue = cell?.value ?? 0;
return 'assets/skins/${activity.activitySettings.get(ApplicationConfig.parameterCodeSkin)}_$cellValue.png';
}
return 'assets/ui/cell_empty.png';
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/cell_location.dart';
import 'package:suguru/models/activity/activity.dart';
import 'package:suguru/ui/widgets/game/cell.dart';
class GameBoardWidget extends StatelessWidget {
const GameBoardWidget({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
final Color borderColor = Theme.of(context).colorScheme.onSurface;
return Container(
margin: const EdgeInsets.all(2),
padding: const EdgeInsets.all(2),
decoration: BoxDecoration(
color: borderColor,
borderRadius: BorderRadius.circular(2),
border: Border.all(
color: borderColor,
width: 2,
),
),
child: Column(
children: [
Table(
defaultColumnWidth: const IntrinsicColumnWidth(),
children: [
for (int row = 0; row < currentActivity.boardSizeVertical; row++)
TableRow(
children: [
for (int col = 0; col < currentActivity.boardSizeHorizontal; col++)
Column(
children: [
CellWidget(
cell: currentActivity.board.get(CellLocation.go(row, col)),
hasBlockBorderBottom:
row == currentActivity.boardSizeVertical ||
currentActivity.board
.get(CellLocation.go(row, col))
.blockId !=
currentActivity.board
.get(CellLocation.go(row + 1, col))
.blockId,
hasBlockBorderLeft: col == 0 ||
currentActivity.board
.get(CellLocation.go(row, col))
.blockId !=
currentActivity.board
.get(CellLocation.go(row, col - 1))
.blockId,
hasBlockBorderRight:
col == currentActivity.boardSizeVertical ||
currentActivity.board
.get(CellLocation.go(row, col))
.blockId !=
currentActivity.board
.get(CellLocation.go(row, col + 1))
.blockId,
hasBlockBorderTop: row == 0 ||
currentActivity.board
.get(CellLocation.go(row, col))
.blockId !=
currentActivity.board
.get(CellLocation.go(row - 1, col))
.blockId,
)
],
),
],
),
],
),
],
),
);
},
);
}
}
import 'dart:async';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/activity.dart';
import 'package:suguru/models/activity/types.dart';
class BoardAnimate {
// Start game animation: blinking tiles
static AnimatedBoardSequence createStartGameAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int patternsCount = 3;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 2 == 0));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Win game animation: fill board with colored rows, from bottom to top
static AnimatedBoardSequence createWinGameAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int patternsCount = activity.boardSizeHorizontal + activity.boardSizeVertical;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
patternRow.add(row > (patternIndex - 4));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Default multi-purpose animation: sliding stripes, from top left to right bottom
static AnimatedBoardSequence createDefaultAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int boardSideLength = activity.boardSizeHorizontal;
int patternsCount = boardSideLength;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 4 == 0));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
static void startAnimation(ActivityCubit activityCubit, String animationType) {
final Activity activity = activityCubit.state.currentActivity;
AnimatedBoardSequence patterns = [];
switch (animationType) {
case 'start':
patterns = createStartGameAnimationPatterns(activity);
break;
case 'win':
patterns = createWinGameAnimationPatterns(activity);
break;
default:
patterns = createDefaultAnimationPatterns(activity);
}
int patternIndex = patterns.length;
activityCubit.updateAnimationInProgress(true);
const interval = Duration(milliseconds: 200);
Timer.periodic(
interval,
(Timer timer) {
if (patternIndex == 0) {
timer.cancel();
activityCubit.resetAnimatedBackground();
activityCubit.updateAnimationInProgress(false);
} else {
patternIndex--;
activityCubit.setAnimatedBackground(patterns[patternIndex]);
}
},
);
}
}
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
args:
dependency: transitive
description:
name: args
sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
url: "https://pub.dev"
source: hosted
version: "2.6.0"
async:
dependency: transitive
description:
name: async
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.12.0"
badges:
dependency: "direct main"
description:
name: badges
sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84
url: "https://pub.dev"
source: hosted
version: "3.1.2"
bloc:
dependency: transitive
description:
name: bloc
sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
url: "https://pub.dev"
source: hosted
version: "8.1.4"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev"
source: hosted
version: "1.19.0"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
easy_localization:
dependency: transitive
description:
name: easy_localization
sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
url: "https://pub.dev"
source: hosted
version: "3.0.7"
easy_logger:
dependency: transitive
description:
name: easy_logger
sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7
url: "https://pub.dev"
source: hosted
version: "0.0.2"
equatable:
dependency: transitive
description:
name: equatable
sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7"
url: "https://pub.dev"
source: hosted
version: "2.0.7"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_bloc:
dependency: transitive
description:
name: flutter_bloc
sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
url: "https://pub.dev"
source: hosted
version: "8.1.6"
flutter_custom_toolbox:
dependency: "direct main"
description:
name: flutter_custom_toolbox
sha256: "55eec6215c16e1a4325a2c515bd8464d598c8b67ae4403c47fd5f1df538e2336"
url: "https://pub.harrault.fr"
source: hosted
version: "1.0.2"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
url: "https://pub.dev"
source: hosted
version: "5.0.0"
flutter_localizations:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
hive:
dependency: transitive
description:
name: hive
sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
url: "https://pub.dev"
source: hosted
version: "2.2.3"
http:
dependency: transitive
description:
name: http
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
url: "https://pub.dev"
source: hosted
version: "1.2.2"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
hydrated_bloc:
dependency: transitive
description:
name: hydrated_bloc
sha256: af35b357739fe41728df10bec03aad422cdc725a1e702e03af9d2a41ea05160c
url: "https://pub.dev"
source: hosted
version: "9.1.5"
intl:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev"
source: hosted
version: "0.19.0"
lints:
dependency: transitive
description:
name: lints
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
source: hosted
version: "5.1.1"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.15.0"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
package_info_plus:
dependency: transitive
description:
name: package_info_plus
sha256: "70c421fe9d9cc1a9a7f3b05ae56befd469fe4f8daa3b484823141a55442d858d"
url: "https://pub.dev"
source: hosted
version: "8.1.2"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b
url: "https://pub.dev"
source: hosted
version: "3.0.2"
path:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
url: "https://pub.dev"
source: hosted
version: "2.2.15"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
provider:
dependency: transitive
description:
name: provider
sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
url: "https://pub.dev"
source: hosted
version: "6.1.2"
shared_preferences:
dependency: transitive
description:
name: shared_preferences
sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a
url: "https://pub.dev"
source: hosted
version: "2.3.5"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "02a7d8a9ef346c9af715811b01fbd8e27845ad2c41148eefd31321471b41863d"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
url: "https://pub.dev"
source: hosted
version: "2.5.4"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
url: "https://pub.dev"
source: hosted
version: "2.4.2"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
url: "https://pub.dev"
source: hosted
version: "3.3.0+3"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
unicons:
dependency: transitive
description:
name: unicons
sha256: f3eab9d87c226415ef857cfd2167e1d12ad81ea1f5783b46cf644224fea4eab7
url: "https://pub.dev"
source: hosted
version: "3.0.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
web:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "1.1.0"
win32:
dependency: transitive
description:
name: win32
sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29"
url: "https://pub.dev"
source: hosted
version: "5.10.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.6.0 <4.0.0"
flutter: ">=3.24.0"
name: suguru
description: A suguru game application.
publish_to: "none"
version: 0.0.1+1
environment:
sdk: "^3.0.0"
dependencies:
flutter:
sdk: flutter
# base
flutter_custom_toolbox:
hosted: https://pub.harrault.fr
version: ^1.0.0
# specific
badges: ^3.1.2
dev_dependencies:
flutter_lints: ^5.0.0
flutter:
uses-material-design: true
assets:
- assets/skins/
- assets/translations/
- assets/ui/
fonts:
- family: Nunito
fonts:
- asset: packages/flutter_custom_toolbox/fonts/Nunito-Bold.ttf
weight: 700
- asset: packages/flutter_custom_toolbox/fonts/Nunito-Medium.ttf
weight: 500
- asset: packages/flutter_custom_toolbox/fonts/Nunito-Regular.ttf
weight: 400
- asset: packages/flutter_custom_toolbox/fonts/Nunito-Light.ttf
weight: 300
#! /bin/bash
# Check dependencies
command -v inkscape >/dev/null 2>&1 || {
echo >&2 "I require inkscape but it's not installed. Aborting."
exit 1
}
command -v scour >/dev/null 2>&1 || {
echo >&2 "I require scour but it's not installed. Aborting."
exit 1
}
command -v optipng >/dev/null 2>&1 || {
echo >&2 "I require optipng but it's not installed. Aborting."
exit 1
}
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
BASE_DIR="$(dirname "$(dirname "${CURRENT_DIR}")")"
SOURCE_ICON="${CURRENT_DIR}/icon.svg"
SOURCE_FASTLANE="${CURRENT_DIR}/featureGraphic.svg"
SOURCE_LAUNCH_IMAGE="${CURRENT_DIR}/icon.svg"
OPTIPNG_OPTIONS="-preserve -quiet -o7"
if [ ! -f "${SOURCE_ICON}" ]; then
echo "Missing file: ${SOURCE_ICON}"
fi
if [ ! -f "${SOURCE_FASTLANE}" ]; then
echo "Missing file: ${SOURCE_FASTLANE}"
fi
if [ ! -f "${SOURCE_LAUNCH_IMAGE}" ]; then
echo "Missing file: ${SOURCE_LAUNCH_IMAGE}"
fi
function optimize_svg() {
SVG="$1"
cp ${SVG} ${SVG}.tmp
scour \
--remove-descriptive-elements \
--enable-id-stripping \
--enable-viewboxing \
--enable-comment-stripping \
--nindent=4 \
--quiet \
-i ${SVG}.tmp \
-o ${SVG}
rm ${SVG}.tmp
}
# optimize source svg files
optimize_svg ${SOURCE_ICON}
optimize_svg ${SOURCE_FASTLANE}
optimize_svg ${SOURCE_LAUNCH_IMAGE}
# build icons
function build_application_icon() {
ICON_SIZE="$1"
TARGET="$2"
echo "Building ${TARGET}"
TARGET_PNG="${TARGET}.png"
inkscape \
--export-width=${ICON_SIZE} \
--export-height=${ICON_SIZE} \
--export-filename=${TARGET_PNG} \
${SOURCE_ICON}
optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
}
# build fastlane image
function build_fastlane_image() {
WIDTH="$1"
HEIGHT="$2"
TARGET="$3"
echo "Building ${TARGET}"
TARGET_PNG="${TARGET}.png"
inkscape \
--export-width=${WIDTH} \
--export-height=${HEIGHT} \
--export-filename=${TARGET_PNG} \
${SOURCE_FASTLANE}
optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
}
# build launch images (splash screen)
function build_launch_image() {
ICON_SIZE="$1"
TARGET="$2"
echo "Building ${TARGET}"
TARGET_PNG="${TARGET}.png"
inkscape \
--export-width=${ICON_SIZE} \
--export-height=${ICON_SIZE} \
--export-filename=${TARGET_PNG} \
${SOURCE_LAUNCH_IMAGE}
optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
}
build_application_icon 72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher
build_application_icon 48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
build_application_icon 96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
build_application_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
build_application_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
build_application_icon 512 ${BASE_DIR}/fastlane/metadata/android/en-US/images/icon
build_launch_image 72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/launch_image
build_launch_image 48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/launch_image
build_launch_image 96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/launch_image
build_launch_image 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/launch_image
build_launch_image 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/launch_image
build_fastlane_image 1024 500 ${BASE_DIR}/fastlane/metadata/android/en-US/images/featureGraphic
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 1024 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="1024" height="500" rx="0" ry="0" fill="#fcddff"/></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 28.747 28.747" xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="filter6206-7" x="-.072" y="-.072" width="1.144" height="1.144" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.658125"/>
</filter>
</defs>
<g transform="translate(0 -1093.8)">
<path transform="matrix(1.0781 0 0 1.0641 -.093733 2.7509)" d="m4.4177 1028.2v1.6051h-1.6052v18.192h1.6052v2.1402h18.192v-2.1402h2.1402v-18.192h-2.1402v-1.6051z" fill="#3e2723" filter="url(#filter6206-7)" opacity=".2"/>
<rect x="2.9987" y="1096.8" width="22.749" height="22.749" rx="1.1973" ry="1.1974" fill="#ff5722"/>
<g transform="translate(-22.32 1056.5)">
<path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
<g transform="matrix(.33601 0 0 .33601 1.5296 73.043)">
<path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
</g>
<g transform="matrix(.37187 0 0 .37187 38.802 63.239)">
<path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
<g transform="matrix(2.6891 0 0 2.6891 -82.906 -48.45)">
<path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
</g>
</g>
</g>
<path d="m4.1958 1096.8c-0.66332 0-1.1979 0.5346-1.1979 1.1979v0.3334c0-0.6634 0.53459-1.1979 1.1979-1.1979h20.354c0.66332 0 1.1979 0.5345 1.1979 1.1979v-0.3334c0-0.6633-0.5346-1.1979-1.1979-1.1979z" fill="#fff" opacity=".2"/>
<rect x="128" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="128" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="128" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="128" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="128" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="213.33" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="213.33" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="213.33" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="213.33" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="213.33" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="298.67" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="298.67" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="298.67" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="298.67" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="298.67" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="170.67" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="170.67" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="170.67" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="170.67" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="170.67" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="256" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="256" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="256" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="256" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="256" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="128" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="213.33" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="298.67" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="170.67" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="256" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="341.33" y="589.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="341.33" y="631.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="341.33" y="717.19" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="341.33" y="546.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="341.33" y="674.52" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="341.33" y="759.85" width="42.667" height="42.667" fill="none" stroke-width="1.0667"/>
<rect x="160" y="578.52" width="192" height="192" fill="none" stroke-width="1.0667"/>
<g transform="matrix(.37344 0 0 .37344 4.7333 1097.4)">
<path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
</g>
<g transform="matrix(.36471 0 0 .36471 5.1356 1097.4)">
<path d="m0 0h51.2v51.2h-51.2z" fill="none" stroke-width="1.0667"/>
</g>
<g transform="matrix(.41585 0 0 .41585 84.325 1055.9)">
<g transform="matrix(.062269 0 0 .062269 -28.238 185.29)">
<g transform="matrix(38.618 0 0 38.618 14724 -13542)">
<g transform="matrix(.71436 0 0 .71436 -400.52 188.34)">
<path d="m1293.2-120.67c-181.75 0.2763-511.18 0.13525-699.05 0.13998-2.3216 10.413-3.593 21.251-3.593 32.384v114c207.65 0.73695 494.72 0.38136 706.23 0.3733v-114.37c0-11.18-1.2522-22.07-3.593-32.523zm-458.69 295.56c-78.385-4e-3 -158.85 0.17892-243.95 0.55995v138.63c286.34-0.39317 421.73-0.13827 706.23-0.32664v-137.75c-163.2-0.53005-311.22-1.1113-462.28-1.1199z" opacity="0" stroke-width="1.4932"/>
</g>
</g>
</g>
</g>
<path d="m24.549 1119.5c0.66325 0 1.1979-0.5346 1.1979-1.1979v-0.3333c0 0.6632-0.53461 1.1978-1.1979 1.1978h-20.354c-0.66325 0-1.1979-0.5346-1.1979-1.1978v0.3333c0 0.6633 0.53461 1.1979 1.1979 1.1979z" fill="#3e2723" opacity=".2"/>
</g>
<g transform="matrix(1.28 0 0 1.28 -3.9012 -4.6043)" fill="#fff">
<rect x="9.7236" y="14.528" width="8.7839" height=".51811" stroke="#fff" stroke-width=".238"/>
<rect x="13.989" y="19.272" width="5.077" height=".56673" stroke="#fff" stroke-width=".18718"/>
<rect transform="rotate(90)" x="10.425" y="-14.524" width="9.3043" height=".51324" stroke="#fff" stroke-width=".238"/>
<rect transform="rotate(90)" x="9.8494" y="-19.039" width="9.9255" height=".50701" stroke="#fff" stroke-width=".2438"/>
<g transform="matrix(.5886 0 0 .5886 2.2289 -587.71)">
<path d="m23.863 1021.3h2.5664v1.1055h-4.2383v-1.1055l2.1289-1.8789c0.1901-0.1719 0.33073-0.3398 0.42188-0.5039 0.09114-0.1641 0.13672-0.3346 0.13672-0.5117-3e-6 -0.2735-0.09245-0.4935-0.27734-0.6602-0.1823-0.1666-0.42578-0.25-0.73047-0.25-0.23438 0-0.49089 0.051-0.76953 0.1524-0.27865 0.099-0.57682 0.2474-0.89453 0.4453v-1.2813c0.33854-0.1119 0.67318-0.1966 1.0039-0.2539 0.33073-0.06 0.65494-0.09 0.97266-0.09 0.69791 0 1.2396 0.1536 1.625 0.4609 0.38802 0.3073 0.58203 0.7357 0.58203 1.2852-5e-6 0.3177-0.08204 0.6146-0.24609 0.8906-0.16407 0.2734-0.50912 0.6406-1.0352 1.1016l-1.2461 1.0937"/>
</g>
<g transform="matrix(.58243 0 0 .58243 2.4665 -581.8)">
<path d="m25.169 1028.2c0.39322 0.1015 0.6914 0.2786 0.89453 0.5312 0.20572 0.25 0.30859 0.569 0.30859 0.957-5e-6 0.5782-0.22136 1.0183-0.66406 1.3203-0.44271 0.2995-1.0885 0.4493-1.9375 0.4493-0.29948 0-0.60026-0.025-0.90234-0.074-0.29948-0.047-0.59636-0.1184-0.89062-0.2148v-1.1602c0.28125 0.1407 0.5599 0.2474 0.83594 0.3204 0.27864 0.07 0.55208 0.1054 0.82031 0.1054 0.39844 0 0.70312-0.069 0.91406-0.207 0.21354-0.138 0.32031-0.3359 0.32031-0.5938-3e-6 -0.2656-0.10938-0.4661-0.32812-0.6015-0.21615-0.138-0.53646-0.207-0.96094-0.207h-0.60156v-0.9688h0.63281c0.3776 0 0.65885-0.059 0.84375-0.1758 0.18489-0.1198 0.27734-0.3008 0.27734-0.5429-4e-6 -0.224-0.08985-0.3972-0.26953-0.5196-0.17969-0.1224-0.4336-0.1836-0.76172-0.1836-0.24219 0-0.48698 0.027-0.73438 0.082s-0.49349 0.1354-0.73828 0.2421v-1.1015c0.29687-0.083 0.59114-0.1458 0.88281-0.1875 0.29166-0.042 0.57812-0.063 0.85938-0.063 0.75781 0 1.3242 0.125 1.6992 0.375 0.3776 0.2474 0.5664 0.6211 0.56641 1.1211-5e-6 0.3411-0.08985 0.6211-0.26953 0.8398-0.17969 0.2162-0.44532 0.3685-0.79688 0.4571"/>
</g>
<rect transform="rotate(90)" x="10.399" y="-10.035" width="4.7057" height=".56519" stroke="#fff" stroke-width=".15281"/>
<rect x="9.4971" y="9.8244" width="9.5594" height=".51092" stroke="#fff" stroke-width=".20708"/>
</g>
</svg>
#! /bin/bash
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
${CURRENT_DIR}/app/build_application_resources.sh
${CURRENT_DIR}/ui/build_ui_resources.sh
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 91.389 91.821" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m45.696 2.4343a43.476 43.476 0 0 0-43.478 43.476 43.476 43.476 0 0 0 43.478 43.476 43.476 43.476 0 0 0 43.476-43.476 43.476 43.476 0 0 0-43.476-43.476zm3.1366 9.6579c0.591-6e-6 1.126 0.24403 1.5134 0.63142h0.0026c0.38728 0.38725 0.62881 0.92227 0.62886 1.5134v5.7058c0 1.1821-0.9627 2.1448-2.1448 2.1448-1.1819 0-2.1422-0.9627-2.1422-2.1448v-5.7058c-7.1e-5 -1.1819 0.96028-2.1448 2.1422-2.1448zm-20.177 8.3593c0.54774 9e-6 1.0955 0.21097 1.5134 0.62886l4.0365 4.0339c0.83585 0.83585 0.83585 2.1909 0 3.0267-0.83578 0.83585-2.1909 0.83585-3.0267 0l-4.0365-4.0339c-0.83578-0.83578-0.83578-2.1909 0-3.0267 0.41793-0.41792 0.96562-0.62887 1.5134-0.62886zm40.357 0c0.54775 0 1.0955 0.20842 1.5134 0.62631 0.83585 0.83585 0.83578 2.1909 0 3.0267l-4.0365 4.0365c-0.83585 0.83585-2.1909 0.83585-3.0267 0-0.83578-0.83578-0.83585-2.1909 0-3.0267l4.0365-4.0365c0.41789-0.41789 0.96561-0.62631 1.5134-0.62631zm-22.447 3.9496c5.4516-0.25629 10.98 1.8586 14.881 5.7595 6.9349 6.9345 8.2262 19.017 0.5854 26.658-4.7578 4.7575-9.7253 5.955-13.779 6.6516-4.0538 0.6968-6.9802 0.99072-9.5071 3.5175l-6.0534 6.0534c-1.9889 1.989-5.1849 1.8782-7.0632 0l-7.0632-7.0632c-1.8783-1.8782-1.9889-5.0744 0-7.0632l6.0534-6.0534c2.5267-2.527 2.8208-5.4535 3.5175-9.5071 0.69673-4.0537 1.8942-9.0187 6.6516-13.776 3.3429-3.343 7.537-4.9773 11.777-5.1766zm0.32977 4.2717c-3.2795 0.13023-6.516 1.3649-9.0802 3.9291-4.002 4.0023-4.8061 7.5968-5.4706 11.463-0.56653 3.2962-0.97171 6.9455-3.3105 10.184l8.3235 8.3235c3.2392-2.3388 6.8885-2.744 10.184-3.3105 3.8661-0.66448 7.458-1.4685 11.46-5.4706 5.8609-5.8608 4.7865-15.235-0.58285-20.604-3.0202-3.0202-7.3075-4.6819-11.524-4.5145zm0.63142 1.7869c2.1262-0.0535 4.2645 0.36548 6.2426 1.2603 0.28967 0.17483 0.54908 0.37763 0.75668 0.60074 0.62287 0.66941 0.80579 1.5401 0.1406 2.5691-0.56817 0.81323-1.7464 1.1365-2.6484 0.72345-3.1577-1.4285-6.89-1.1193-9.8036 0.91517-0.92039 0.64824-2.3633 0.40152-3.0114-0.51894-0.64801-0.92039-0.3837-2.3481 0.53683-2.996 2.3392-1.6335 5.0529-2.485 7.7866-2.5538zm24.134 10.167h5.7083c0.59107 5e-5 1.1261 0.24414 1.5134 0.63142 0.38738 0.38742 0.62886 0.92236 0.62886 1.5134 0 1.182-0.96028 2.1448-2.1422 2.1448h-5.7083c-1.1821 0-2.1422-0.96277-2.1422-2.1448 0-1.1821 0.96014-2.1448 2.1422-2.1448zm-6.6823 16.148c0.54774-9e-6 1.0954 0.20838 1.5134 0.6263l4.0339 4.0365c0.8358 0.83585 0.83578 2.1909 0 3.0267-0.83578 0.83585-2.1909 0.83585-3.0267 0l-4.0339-4.0365c-0.83584-0.83592-0.83585-2.1908 0-3.0267 0.41789-0.41789 0.96562-0.6263 1.5134-0.6263zm-38.846 0.6263-1.0072 1.0098 8.0704 8.0704 1.0098-1.0072zm-4.0339 4.0365-0.50616 0.5036c-0.32977 0.32975-0.25105 0.75863 0 1.0098l7.0632 7.0632c0.25106 0.25106 0.68 0.32975 1.0098 0l0.5036-0.50616z" color="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.3088" style="-inkscape-stroke:none"/></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 91.389 91.821" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m45.693 7.5248c-21.798 0-39.519 16.214-39.519 36.163 0 11.415 5.7398 21.549 14.726 28.163-0.83199 3.307-2.5787 7.5755-5.9899 12.697-2.1632 3.2003 0.41555 8.1073 3.4939 6.6139 6.4896-3.0936 13.977-7.4673 20.882-11.734 2.08 0.32004 4.2436 0.53349 6.4067 0.53349 21.798 0 39.521-16.216 39.521-36.166 0-20.056-17.723-36.268-39.521-36.268zm0.03572 14.926c1.6203 0 2.9398 0.5333 3.9583 1.5981 1.0648 1.0648 1.5957 2.3843 1.5957 3.9583 0 0.32407-0.04555 1.0875-0.13814 2.2912l-2.0149 20.625c-0.23148 2.2685-1.364 3.4034-3.401 3.4034-0.9722 0-1.7835-0.30081-2.4317-0.90265-0.60184-0.60184-0.9482-1.436-1.0408-2.5008l-2.0149-20.625c-0.09259-1.1111-0.13814-1.8745-0.13814-2.2912 0-1.6203 0.5333-2.9398 1.5981-3.9583 1.0648-1.0648 2.4071-1.5981 4.0274-1.5981zm-0.62638 36.18h1.1813c1.2963 0 2.3833 0.43983 3.2629 1.3194 0.87961 0.87961 1.3194 1.969 1.3194 3.2653s-0.43983 2.3833-1.3194 3.2629c-0.87961 0.87961-1.9666 1.3194-3.2629 1.3194h-1.1813c-1.2963 0-2.406-0.43983-3.332-1.3194-0.87961-0.92591-1.3194-2.0129-1.3194-3.2629s0.43983-2.3142 1.3194-3.1938c0.92591-0.92591 2.0357-1.3909 3.332-1.3909z" stroke-width="1.2194"/></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" ry="2" fill="none"/></svg>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment