add factory constructor

This commit is contained in:
Salvatore Giordano
2020-11-24 13:39:36 +01:00
parent 93c324ac56
commit 6b62eadaa4
22 changed files with 424 additions and 166 deletions
+1 -2
View File
@@ -44,8 +44,7 @@ class _AdvancedOptionsPageState extends State<AdvancedOptionsPage> {
),
),
leading: IconButton(
icon: StreamSvgIcon(
assetName: 'Icon_left.svg',
icon: StreamSvgIcon.left(
color: Colors.black,
),
onPressed: () {
+9 -8
View File
@@ -130,14 +130,15 @@ class ChipInputTextFieldState<T> extends State<ChipsInputTextField<T>> {
Align(
alignment: Alignment.bottomCenter,
child: IconButton(
icon: StreamSvgIcon(
assetName: _chips.isEmpty
? 'Icon_user.svg'
: 'Icon_User_add.svg',
color: Colors.black.withOpacity(0.5),
height: 24,
width: 24,
),
icon: _chips.isEmpty
? StreamSvgIcon.user(
color: Colors.black.withOpacity(0.5),
size: 24,
)
: StreamSvgIcon.userAdd(
color: Colors.black.withOpacity(0.5),
size: 24,
),
onPressed:
!_pauseItemAddition ? null : resumeItemAddition,
alignment: Alignment.topRight,
+1 -2
View File
@@ -196,8 +196,7 @@ class ChooseUserPage extends StatelessWidget {
);
},
leading: CircleAvatar(
child: StreamSvgIcon(
assetName: 'settings.svg',
child: StreamSvgIcon.settings(
color: Colors.black,
),
backgroundColor:
+1 -3
View File
@@ -105,9 +105,7 @@ class _GroupChatDetailsScreenState extends State<GroupChatDetailsScreen> {
StreamNeumorphicButton(
child: IconButton(
padding: const EdgeInsets.all(0),
icon: StreamSvgIcon(
assetName: 'Icon_check.svg',
),
icon: StreamSvgIcon.check(),
color: Color(0xFF006CFF),
onPressed: _isGroupNameEmpty
? null
+3 -6
View File
@@ -143,8 +143,7 @@ class ChannelListPage extends StatelessWidget {
),
),
ListTile(
leading: StreamSvgIcon(
assetName: 'Icon_pen-write.svg',
leading: StreamSvgIcon.penWrite(
color: Colors.black.withOpacity(.5),
),
onTap: () {
@@ -162,8 +161,7 @@ class ChannelListPage extends StatelessWidget {
),
),
ListTile(
leading: StreamSvgIcon(
assetName: 'Icon_contacts.svg',
leading: StreamSvgIcon.contacts(
color: Colors.black.withOpacity(.5),
),
onTap: () {
@@ -197,8 +195,7 @@ class ChannelListPage extends StatelessWidget {
),
);
},
leading: StreamSvgIcon(
assetName: 'Icon_user.svg',
leading: StreamSvgIcon.user(
color: Colors.black.withOpacity(.5),
),
title: Text(
+5 -10
View File
@@ -163,8 +163,7 @@ class _NewChatScreenState extends State<NewChatScreen> {
),
),
Positioned(
child: StreamSvgIcon(
assetName: 'Icon_close.svg',
child: StreamSvgIcon.close(
color: Colors.white,
),
),
@@ -194,11 +193,9 @@ class _NewChatScreenState extends State<NewChatScreen> {
children: [
StreamNeumorphicButton(
child: Center(
child: StreamSvgIcon(
assetName: 'Icon_contacts.svg',
child: StreamSvgIcon.contacts(
color: Color(0xFF006CFF),
height: 24,
width: 24,
size: 24,
),
),
),
@@ -292,10 +289,8 @@ class _NewChatScreenState extends State<NewChatScreen> {
children: [
Padding(
padding: const EdgeInsets.all(24),
child: StreamSvgIcon(
assetName: 'Icon_search.svg',
height: 96,
width: 96,
child: StreamSvgIcon.search(
size: 96,
color: Colors.grey,
),
),
+7 -14
View File
@@ -65,8 +65,7 @@ class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
actions: [
if (_selectedUsers.isNotEmpty)
IconButton(
icon: StreamSvgIcon(
assetName: 'Icon_right.svg',
icon: StreamSvgIcon.right(
color: Color(0xFF006CFF),
),
onPressed: () {
@@ -101,11 +100,9 @@ class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
child: TextField(
controller: _controller,
decoration: InputDecoration(
prefixIcon: StreamSvgIcon(
assetName: 'Icon_search.svg',
prefixIcon: StreamSvgIcon.search(
color: Colors.black,
height: 24,
width: 24,
size: 24,
),
hintText: 'Search',
hintStyle: TextStyle(
@@ -163,10 +160,8 @@ class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
),
child: Padding(
padding: const EdgeInsets.all(0.0),
child: StreamSvgIcon(
assetName: 'Icon_close.svg',
height: 24,
width: 24,
child: StreamSvgIcon.close(
size: 24,
),
),
),
@@ -262,10 +257,8 @@ class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
children: [
Padding(
padding: const EdgeInsets.all(24),
child: StreamSvgIcon(
assetName: 'Icon_search.svg',
height: 96,
width: 96,
child: StreamSvgIcon.search(
size: 96,
color: Colors.grey,
),
),
+1 -1
View File
@@ -1,6 +1,6 @@
name: example
description: A new Flutter project.
version: 1.0.69+71
version: 1.0.70+72
environment:
sdk: ">=2.2.2 <3.0.0"
+2 -4
View File
@@ -33,10 +33,8 @@ class StreamBackButton extends StatelessWidget {
Navigator.of(context).pop();
}
},
child: StreamSvgIcon(
assetName: 'Icon_left.svg',
height: 24,
width: 24,
child: StreamSvgIcon.left(
size: 24,
color: Theme.of(context).brightness == Brightness.dark
? Colors.white
: Colors.black,
+4 -8
View File
@@ -72,10 +72,8 @@ class ChannelBottomSheet extends StatelessWidget {
initialData: channel.isMuted,
builder: (context, snapshot) {
return ListTile(
leading: StreamSvgIcon(
assetName: 'Icon_mute.svg',
height: 22,
width: 22,
leading: StreamSvgIcon.mute(
size: 22,
color: StreamChatTheme.of(context).primaryIconTheme.color,
),
title: Text('Mute ${channel.isGroup ? 'group' : 'user'}'),
@@ -94,10 +92,8 @@ class ChannelBottomSheet extends StatelessWidget {
Divider(),
if (channel.isGroup && !channel.isDistinct)
ListTile(
leading: StreamSvgIcon(
assetName: 'Icon_User_deselect.svg',
height: 22,
width: 22,
leading: StreamSvgIcon.userRemove(
size: 22,
color: Colors.black,
),
title: Text('Leave Group'),
+4 -10
View File
@@ -201,10 +201,8 @@ class _ChannelListViewState extends State<ChannelListView>
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: StreamSvgIcon(
assetName: 'Icon_message.svg',
height: 136,
width: 136,
child: StreamSvgIcon.message(
size: 136,
color: Color(0xffDBDBDB),
),
),
@@ -519,9 +517,7 @@ class _ChannelListViewState extends State<ChannelListView>
),
IconSlideAction(
color: backgroundColor,
iconWidget: StreamSvgIcon(
assetName: 'Icon_mute.svg',
),
iconWidget: StreamSvgIcon.mute(),
onTap: () async {
if (!channel.isMuted) {
await channel.mute();
@@ -533,9 +529,7 @@ class _ChannelListViewState extends State<ChannelListView>
if (channel.isGroup && !channel.isDistinct)
IconSlideAction(
color: backgroundColor,
iconWidget: StreamSvgIcon(
assetName: 'Icon_User_deselect.svg',
),
iconWidget: StreamSvgIcon.userRemove(),
onTap: () async {
final confirm = await showConfirmationDialog(
context,
+2 -4
View File
@@ -153,10 +153,8 @@ class ChannelPreview extends StatelessWidget {
return Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
StreamSvgIcon(
assetName: 'Icon_mute.svg',
height: 16,
width: 16,
StreamSvgIcon.mute(
size: 16,
),
Text(
' Channel is muted',
+10 -20
View File
@@ -112,11 +112,9 @@ class GiphyAttachment extends StatelessWidget {
),
child: Row(
children: [
StreamSvgIcon(
assetName: 'Icon_lightning-command runner.svg',
StreamSvgIcon.lightning(
color: StreamChatTheme.of(context).accentColor,
height: 16.0,
width: 16.0,
size: 16.0,
),
Text(
'GIPHY',
@@ -146,10 +144,8 @@ class GiphyAttachment extends StatelessWidget {
child: IconButton(
padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)),
icon: StreamSvgIcon(
assetName: 'Icon_left.svg',
height: 24.0,
width: 24.0,
icon: StreamSvgIcon.left(
size: 24.0,
),
splashRadius: 16,
onPressed: () {
@@ -175,10 +171,8 @@ class GiphyAttachment extends StatelessWidget {
child: IconButton(
padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)),
icon: StreamSvgIcon(
assetName: 'Icon_right.svg',
height: 24.0,
width: 24.0,
icon: StreamSvgIcon.right(
size: 24.0,
),
splashRadius: 16,
onPressed: () {
@@ -257,11 +251,9 @@ class GiphyAttachment extends StatelessWidget {
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
StreamSvgIcon(
assetName: 'Icon_eye-off.svg',
StreamSvgIcon.eye(
color: Colors.black.withOpacity(0.5),
height: 16.0,
width: 16.0,
size: 16.0,
),
SizedBox(
width: 8.0,
@@ -331,11 +323,9 @@ class GiphyAttachment extends StatelessWidget {
),
child: Row(
children: [
StreamSvgIcon(
assetName: 'Icon_lightning-command runner.svg',
StreamSvgIcon.lightning(
color: Colors.white,
height: 16,
width: 16,
size: 16,
),
Text(
'GIPHY',
+2 -4
View File
@@ -71,10 +71,8 @@ class _MediaListViewState extends State<MediaListView> {
child: CircleAvatar(
radius: 12,
backgroundColor: Colors.white,
child: StreamSvgIcon(
assetName: 'Icon_check.svg',
height: 24,
width: 24,
child: StreamSvgIcon.check(
size: 24,
color: Colors.black,
),
),
+6 -12
View File
@@ -188,8 +188,7 @@ class MessageActionsModal extends StatelessWidget {
style:
Theme.of(context).textTheme.headline6.copyWith(color: Colors.red),
),
leading: StreamSvgIcon(
assetName: 'Icon_delete.svg',
leading: StreamSvgIcon.delete(
color: Colors.red,
),
onTap: () {
@@ -208,8 +207,7 @@ class MessageActionsModal extends StatelessWidget {
'Copy message',
style: Theme.of(context).textTheme.headline6,
),
leading: StreamSvgIcon(
assetName: 'Icon_copy.svg',
leading: StreamSvgIcon.copy(
color: StreamChatTheme.of(context).primaryIconTheme.color,
),
onTap: () async {
@@ -225,8 +223,7 @@ class MessageActionsModal extends StatelessWidget {
'Edit message',
style: Theme.of(context).textTheme.headline6,
),
leading: StreamSvgIcon(
assetName: 'Icon_edit.svg',
leading: StreamSvgIcon.edit(
color: StreamChatTheme.of(context).primaryIconTheme.color,
),
onTap: () async {
@@ -267,10 +264,8 @@ class MessageActionsModal extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
IconButton(
icon: StreamSvgIcon(
assetName: 'Icon_edit.svg',
height: 22,
width: 22,
icon: StreamSvgIcon.edit(
size: 22,
color:
StreamChatTheme.of(context).primaryIconTheme.color,
),
@@ -324,8 +319,7 @@ class MessageActionsModal extends StatelessWidget {
'Thread reply',
style: Theme.of(context).textTheme.headline6,
),
leading: StreamSvgIcon(
assetName: 'Icon_Thread_Reply.svg',
leading: StreamSvgIcon.thread(
color: StreamChatTheme.of(context).primaryIconTheme.color,
),
onTap: () {
+21 -44
View File
@@ -284,10 +284,8 @@ class MessageInputState extends State<MessageInput> {
crossFadeState: _sendAsDm
? CrossFadeState.showFirst
: CrossFadeState.showSecond,
firstChild: StreamSvgIcon(
assetName: 'Icon_check.svg',
height: 16.0,
width: 16.0,
firstChild: StreamSvgIcon.check(
size: 16.0,
color: Colors.white,
),
secondChild: SizedBox(
@@ -331,8 +329,7 @@ class MessageInputState extends State<MessageInput> {
_actionsShrunk = false;
});
},
icon: StreamSvgIcon(
assetName: 'Icon_empty_circle_left.svg',
icon: StreamSvgIcon.emptyCircleLeft(
color: StreamChatTheme.of(context).accentColor,
),
),
@@ -404,8 +401,7 @@ class MessageInputState extends State<MessageInput> {
_chosenCommand?.name ?? "",
style: TextStyle(color: Colors.white),
),
avatar: StreamSvgIcon(
assetName: 'Icon_lightning-command runner.svg',
avatar: StreamSvgIcon.lightning(
color: Colors.white,
),
),
@@ -582,9 +578,7 @@ class MessageInputState extends State<MessageInput> {
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
),
child: StreamSvgIcon(
assetName:
'Icon_lightning-command runner.svg',
child: StreamSvgIcon.lightning(
color: StreamChatTheme.of(context)
.accentColor,
),
@@ -622,12 +616,9 @@ class MessageInputState extends State<MessageInput> {
trailing: CircleAvatar(
backgroundColor:
StreamChatTheme.of(context).accentColor,
child: StreamSvgIcon(
assetName:
'Icon_lightning-command runner.svg',
child: StreamSvgIcon.lightning(
color: Colors.white,
height: 12.5,
width: 12.5,
size: 12.5,
),
maxRadius: 12,
),
@@ -661,10 +652,8 @@ class MessageInputState extends State<MessageInput> {
mainAxisAlignment: MainAxisAlignment.start,
children: [
IconButton(
icon: StreamSvgIcon(
assetName: 'pictures.svg',
height: 24,
width: 24,
icon: StreamSvgIcon.pictures(
size: 24,
color: _filePickerIndex == 0
? StreamChatTheme.of(context).accentColor
: Colors.black.withOpacity(0.5),
@@ -676,10 +665,8 @@ class MessageInputState extends State<MessageInput> {
},
),
IconButton(
icon: StreamSvgIcon(
assetName: 'files.svg',
height: 24,
width: 24,
icon: StreamSvgIcon.files(
size: 24,
color: _filePickerIndex == 1
? StreamChatTheme.of(context).accentColor
: Colors.black.withOpacity(0.5),
@@ -689,10 +676,8 @@ class MessageInputState extends State<MessageInput> {
},
),
IconButton(
icon: StreamSvgIcon(
assetName: 'Icon_camera.svg',
height: 24,
width: 24,
icon: StreamSvgIcon.camera(
size: 24,
color: _filePickerIndex == 2
? StreamChatTheme.of(context).accentColor
: Colors.black.withOpacity(0.5),
@@ -702,10 +687,8 @@ class MessageInputState extends State<MessageInput> {
},
),
IconButton(
icon: StreamSvgIcon(
assetName: 'Icon_record.svg',
height: 24,
width: 24,
icon: StreamSvgIcon.record(
size: 24,
color: _filePickerIndex == 3
? StreamChatTheme.of(context).accentColor
: Colors.black.withOpacity(0.5),
@@ -1000,8 +983,7 @@ class MessageInputState extends State<MessageInput> {
fontWeight: FontWeight.bold),
),
subtitle: Text('@${m.userId}'),
trailing: StreamSvgIcon(
assetName: 'mentions.svg',
trailing: StreamSvgIcon.mentions(
color: StreamChatTheme.of(context)
.accentColor,
),
@@ -1098,8 +1080,7 @@ class MessageInputState extends State<MessageInput> {
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8.0),
child: StreamSvgIcon(
assetName: 'Icon_smile.svg',
child: StreamSvgIcon.smile(
color: StreamChatTheme.of(context).accentColor,
),
),
@@ -1234,10 +1215,8 @@ class MessageInputState extends State<MessageInput> {
},
fillColor: Colors.black.withOpacity(.5),
child: Center(
child: StreamSvgIcon(
assetName: 'Icon_close.svg',
height: 24,
width: 24,
child: StreamSvgIcon.close(
size: 24,
color: Colors.white,
),
),
@@ -1307,8 +1286,7 @@ class MessageInputState extends State<MessageInput> {
child: Padding(
padding:
const EdgeInsets.only(left: 4.0, right: 8.0, top: 8.0, bottom: 8.0),
child: StreamSvgIcon(
assetName: 'Icon_lightning-command runner.svg',
child: StreamSvgIcon.lightning(
color: Color(0xFF000000).withAlpha(128),
),
),
@@ -1331,8 +1309,7 @@ class MessageInputState extends State<MessageInput> {
child: Padding(
padding:
EdgeInsets.only(left: 8.0, right: padding, top: 8.0, bottom: 8.0),
child: StreamSvgIcon(
assetName: 'Icon_attach.svg',
child: StreamSvgIcon.attach(
color: _openFilePickerSection
? StreamChatTheme.of(context).accentColor
: Color(0xFF000000).withAlpha(128),
+1 -2
View File
@@ -375,8 +375,7 @@ class _MessageListViewState extends State<MessageListView> {
children: [
FloatingActionButton(
backgroundColor: Colors.white,
child: StreamSvgIcon(
assetName: 'Icon_down.svg',
child: StreamSvgIcon.down(
color: Colors.black,
),
onPressed: () {
+336
View File
@@ -39,4 +39,340 @@ class StreamSvgIcon extends StatelessWidget {
alignment: Alignment.center,
);
}
factory StreamSvgIcon.settings({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'settings.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.down({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_down.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.attach({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_attach.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.smile({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_smile.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.mentions({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'mentions.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.record({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_record.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.camera({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_camera.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.files({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'files.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.pictures({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'pictures.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.left({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_left.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.user({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_user.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.userAdd({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_User_add.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.check({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_check.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.penWrite({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_pen-write.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.contacts({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_contacts.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.close({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_close.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.search({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_search.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.right({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_right.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.mute({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_mute.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.userRemove({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_User_deselect.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.lightning({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_lightning-command runner.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.emptyCircleLeft({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_empty_circle_left.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.message({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_message.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.thread({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_Thread_Reply.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.edit({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_edit.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.copy({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_copy.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.delete({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_delete.svg',
color: color,
width: size,
height: size,
);
}
factory StreamSvgIcon.eye({
double size,
Color color,
}) {
return StreamSvgIcon(
assetName: 'Icon_eye-off.svg',
color: color,
width: size,
height: size,
);
}
}
+2 -4
View File
@@ -86,10 +86,8 @@ class ThreadHeader extends StatelessWidget implements PreferredSizeWidget {
aspectRatio: 1,
child: IconButton(
onPressed: onBackPressed,
icon: StreamSvgIcon(
assetName: 'Icon_close.svg',
height: 24,
width: 24,
icon: StreamSvgIcon.close(
size: 24,
color: Theme.of(context).brightness == Brightness.dark
? Colors.white
: Colors.black,
+2 -4
View File
@@ -74,10 +74,8 @@ class UserItem extends StatelessWidget {
),
trailing: selected
? CircleAvatar(
child: StreamSvgIcon(
assetName: 'Icon_check.svg',
height: 20,
width: 20,
child: StreamSvgIcon.check(
size: 20,
),
radius: 10,
)
+2 -2
View File
@@ -1,3 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15 3H9L7 5H3C2.44771 5 2 5.44772 2 6V20C2 20.5523 2.44771 21 3 21H21C21.5523 21 22 20.5523 22 20V6C22 5.44772 21.5523 5 21 5H17L15 3ZM7.828 7L9.828 5H14.172L16.172 7H20V19H4V7H7.828ZM12 18C8.96243 18 6.5 15.5376 6.5 12.5C6.5 9.46243 8.96243 7 12 7C15.0376 7 17.5 9.46243 17.5 12.5C17.5 15.5376 15.0376 18 12 18ZM15.5 12.5C15.5 14.433 13.933 16 12 16C10.067 16 8.5 14.433 8.5 12.5C8.5 10.567 10.067 9 12 9C13.933 9 15.5 10.567 15.5 12.5Z" fill="black"/>
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M21 9H15L13 11H9C8.44771 11 8 11.4477 8 12V26C8 26.5523 8.44771 27 9 27H27C27.5523 27 28 26.5523 28 26V12C28 11.4477 27.5523 11 27 11H23L21 9ZM13.828 13L15.828 11H20.172L22.172 13H26V25H10V13H13.828ZM18 24C14.9624 24 12.5 21.5376 12.5 18.5C12.5 15.4624 14.9624 13 18 13C21.0376 13 23.5 15.4624 23.5 18.5C23.5 21.5376 21.0376 24 18 24ZM21.5 18.5C21.5 20.433 19.933 22 18 22C16.067 22 14.5 20.433 14.5 18.5C14.5 16.567 16.067 15 18 15C19.933 15 21.5 16.567 21.5 18.5Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 606 B

After

Width:  |  Height:  |  Size: 634 B

+2 -2
View File
@@ -1,3 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 6C2.89543 6 2 6.89543 2 8V16C2 17.1046 2.89543 18 4 18H12C13.1046 18 14 17.1046 14 16V8C14 6.89543 13.1046 6 12 6H4ZM4 8H12V16H4V8ZM22 7C22 6.63973 21.8062 6.30731 21.4927 6.1298C21.1792 5.95229 20.7944 5.95715 20.4855 6.14251L15.4855 9.14251C15.1843 9.32323 15 9.64874 15 10V14C15 14.3513 15.1843 14.6768 15.4855 14.8575L20.4855 17.8575C20.7944 18.0429 21.1792 18.0477 21.4927 17.8702C21.8062 17.6927 22 17.3603 22 17V7ZM17 13.4338V10.5662L20 8.76619V15.2338L17 13.4338Z" fill="black"/>
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 12C8.89543 12 8 12.8954 8 14V22C8 23.1046 8.89543 24 10 24H18C19.1046 24 20 23.1046 20 22V14C20 12.8954 19.1046 12 18 12H10ZM10 14H18V22H10V14ZM28 13C28 12.6397 27.8062 12.3073 27.4927 12.1298C27.1792 11.9523 26.7944 11.9572 26.4855 12.1425L21.4855 15.1425C21.1843 15.3232 21 15.6487 21 16V20C21 20.3513 21.1843 20.6768 21.4855 20.8575L26.4855 23.8575C26.7944 24.0429 27.1792 24.0477 27.4927 23.8702C27.8062 23.6927 28 23.3603 28 23V13ZM23 19.4338V16.5662L26 14.7662V21.2338L23 19.4338Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 659 B