)
@@ -136,7 +136,7 @@ module.exports = React.createClass({
// XXX: this should be https://matrix.to.
// XXX: if we use room ID, we should also include a server where the event can be found (other than in the domain of the event ID)
permalinkButton = (
-
+
diff --git a/src/components/views/context_menus/NotificationStateContextMenu.js b/src/components/views/context_menus/NotificationStateContextMenu.js
new file mode 100644
index 00000000..cadc8287
--- /dev/null
+++ b/src/components/views/context_menus/NotificationStateContextMenu.js
@@ -0,0 +1,150 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var q = require("q");
+var React = require('react');
+var classNames = require('classnames');
+var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
+var dis = require('matrix-react-sdk/lib/dispatcher');
+
+module.exports = React.createClass({
+ displayName: 'NotificationStateContextMenu',
+
+ propTypes: {
+ room: React.PropTypes.object.isRequired,
+ /* callback called when the menu is dismissed */
+ onFinished: React.PropTypes.func,
+ },
+
+ getInitialState: function() {
+ var areNotifsMuted = false;
+ var cli = MatrixClientPeg.get();
+ if (!cli.isGuest()) {
+ var roomPushRule = cli.getRoomPushRule("global", this.props.room.roomId);
+ if (roomPushRule) {
+ if (0 <= roomPushRule.actions.indexOf("dont_notify")) {
+ areNotifsMuted = true;
+ }
+ }
+ }
+
+ return {
+ areNotifsMuted: areNotifsMuted,
+ };
+ },
+
+ _save: function( isMuted ) {
+ var self = this;
+ const roomId = this.props.room.roomId;
+ var cli = MatrixClientPeg.get();
+
+ if (!cli.isGuest()) {
+ cli.setRoomMutePushRule(
+ "global", roomId, isMuted
+ ).then(function() {
+ self.setState({areNotifsMuted: isMuted});
+
+ // delay slightly so that the user can see their state change
+ // before closing the menu
+ q.delay(500).then(function() {
+ // tell everyone that wants to know of the change in
+ // notification state
+ dis.dispatch({
+ action: 'notification_change',
+ roomId: self.props.room.roomId,
+ isMuted: isMuted,
+ });
+
+ // Close the context menu
+ if (self.props.onFinished) {
+ self.props.onFinished();
+ };
+ });
+ }).fail(function(error) {
+ // TODO: some form of error notification to the user
+ // to inform them that their state change failed.
+ });
+ }
+ },
+
+ _onClickAlertMe: function() {
+ // Placeholder
+ },
+
+ _onClickAllNotifs: function() {
+ this._save(false);
+ },
+
+ _onClickMentions: function() {
+ // Placeholder
+ },
+
+ _onClickMute: function() {
+ this._save(true);
+ },
+
+ render: function() {
+ var cli = MatrixClientPeg.get();
+
+ var alertMeClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldDisabled': true,
+ });
+
+ var allNotifsClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldSet': !this.state.areNotifsMuted,
+ });
+
+ var mentionsClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldDisabled': true,
+ });
+
+ var muteNotifsClasses = classNames({
+ 'mx_NotificationStateContextMenu_field': true,
+ 'mx_NotificationStateContextMenu_fieldSet': this.state.areNotifsMuted,
+ });
+
+ return (
+
+
+
+
+
+
+ Alert me
+
+
+
+
+ All notifications
+
+
+
+ Mentions only
+
+
+
+
+ Mute
+
+
+ );
+ }
+});
diff --git a/src/skins/vector/css/common.css b/src/skins/vector/css/common.css
index bc217309..cacf8f8d 100644
--- a/src/skins/vector/css/common.css
+++ b/src/skins/vector/css/common.css
@@ -85,50 +85,6 @@ input[type=text]:focus, textarea:focus {
border-left: 6px solid transparent;
}
-.mx_ContextualMenu_background {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- opacity: 1.0;
- z-index: 2000;
-}
-
-.mx_ContextualMenu {
- border: 1px solid #a4a4a4;
- border-radius: 8px;
- background-color: #fff;
- color: #747474;
- position: fixed;
- z-index: 2001;
- padding: 6px;
-}
-
-.mx_ContextualMenu_chevron_right {
- padding: 12px;
- position: absolute;
- right: -21px;
- top: 0px;
-}
-
-.mx_ContextualMenu_chevron_left {
- padding: 12px;
- position: absolute;
- left: -21px;
- top: 0px;
-}
-
-.mx_ContextualMenu_field {
- padding: 3px 6px 3px 6px;
- cursor: pointer;
-}
-
-.mx_ContextualMenu_spinner {
- display: block;
- margin: 0 auto;
-}
-
.mx_Dialog_wrapper {
position: fixed;
z-index: 4000;
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/ContextualMenu.css b/src/skins/vector/css/matrix-react-sdk/structures/ContextualMenu.css
new file mode 100644
index 00000000..7523bd10
--- /dev/null
+++ b/src/skins/vector/css/matrix-react-sdk/structures/ContextualMenu.css
@@ -0,0 +1,106 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_ContextualMenu_wrapper {
+ position: fixed;
+ z-index: 2000;
+}
+
+.mx_ContextualMenu_background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 1.0;
+ z-index: 2000;
+}
+
+.mx_ContextualMenu {
+ border: solid 1px rgba(187, 187, 187, 0.5);
+ border-radius: 4px;
+ background-color: #f6f6f6;
+ color: #4a4a4a;
+ position: absolute;
+ padding: 6px;
+ font-size: 14px;
+ z-index: 2001;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_right {
+ right: 8px;
+}
+
+.mx_ContextualMenu_chevron_right {
+ position: absolute;
+ right: -8px;
+ top: 0px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-left: 8px solid rgba(187, 187, 187, 0.5);
+ border-bottom: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_right:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-left: 7px solid #f6f6f6;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ right: 1px;
+}
+
+.mx_ContextualMenu.mx_ContextualMenu_left {
+ left: 8px;
+}
+
+.mx_ContextualMenu_chevron_left {
+ position: absolute;
+ left: -8px;
+ top: 0px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid transparent;
+ border-right: 8px solid rgba(187, 187, 187, 0.5);
+ border-bottom: 8px solid transparent;
+}
+
+.mx_ContextualMenu_chevron_left:after{
+ content:'';
+ width: 0;
+ height: 0;
+ border-top: 7px solid transparent;
+ border-right: 7px solid #f6f6f6;
+ border-bottom: 7px solid transparent;
+ position:absolute;
+ top: -7px;
+ left: 1px;
+}
+
+.mx_ContextualMenu_field {
+ padding: 3px 6px 3px 6px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.mx_ContextualMenu_spinner {
+ display: block;
+ margin: 0 auto;
+}
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css b/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css
index d28f4d94..95455601 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css
+++ b/src/skins/vector/css/matrix-react-sdk/structures/MatrixChat.css
@@ -93,8 +93,8 @@ limitations under the License.
background-color: #eaf5f0;
- -webkit-flex: 0 0 210px;
- flex: 0 0 210px;
+ -webkit-flex: 0 0 235px;
+ flex: 0 0 235px;
}
.mx_MatrixChat .mx_LeftPanel.collapsed {
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css b/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css
index 96f192c4..59895238 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css
+++ b/src/skins/vector/css/matrix-react-sdk/structures/SearchBox.css
@@ -16,8 +16,8 @@ limitations under the License.
.mx_SearchBox {
height: 24px;
- margin-left: 16px;
- margin-right: 20px;
+ margin-left: 18px;
+ margin-right: 18px;
padding-top: 24px;
padding-bottom: 22px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css b/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css
index 770a3a62..d995243b 100644
--- a/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css
+++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/RoomTile.css
@@ -15,18 +15,29 @@ limitations under the License.
*/
.mx_RoomTile {
+ position: relative;
cursor: pointer;
- /* This fixes wrapping of long room names, but breaks drag & drop previews */
- /* display: table-row; */
font-size: 13px;
display: block;
+ height: 34px;
+}
+
+.mx_RoomTile .mx_RoomTile_mute {
+ opacity: 0.4;
+}
+
+.mx_RoomTile_nameContainer {
+ display: inline-block;
+ width: 180px;
+ height: 24px;
}
.mx_RoomTile_avatar {
display: inline-block;
- padding-top: 6px;
- padding-bottom: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
padding-left: 18px;
+ padding-right: 6px;
width: 24px;
height: 24px;
vertical-align: middle;
@@ -34,13 +45,17 @@ limitations under the License.
.mx_RoomTile_name {
display: inline-block;
- width: 100px;
+ position: relative;
+ width: 165px;
vertical-align: middle;
- overflow: hidden;
- word-break: break-word;
- padding-left: 11px;
- padding-right: 15px;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 2px;
+ padding-bottom: 3px;
color: rgba(69, 69, 69, 0.8);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
.mx_RoomTile_ellipsis .mx_RoomTile_name {
@@ -53,17 +68,16 @@ limitations under the License.
*/
}
+.collapsed .mx_RoomTile_nameContainer {
+ height: 0;
+}
+
.collapsed .mx_RoomTile_name {
display: none;
}
-.collapsed .mx_RoomTile {
- height: 36px;
-}
-
.collapsed .mx_RoomTile_badge {
- top: -40px;
- left: 30px;
+ top: -2px;
min-width: 12px;
height: 16px;
border-radius: 16px;
@@ -71,46 +85,81 @@ limitations under the License.
z-index: 200;
}
-/* This is the bottom of the speech bubble */
-.mx_RoomTile_highlight .mx_RoomTile_badge:after {
+/* Position mute icon when room muted and collapsed - invisible at the moment */
+.collapsed .mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeMute {
+ background-color: rgba(0,0,0,0);
+ opacity: 0;
+ top: -2px;
+}
+
+/* Position menu icon when room muted and collapsed */
+.collapsed .mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton.mx_RoomTile_badgeMute,
+.collapsed .mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton.mx_RoomTile_badgeMute {
+ display: inline-block;
+ background-color: rgb(214, 214, 214);
+ letter-spacing: 0.1em;
+ opacity: 1;
+ top: -2px;
+}
+
+/* Hide the bottom of speech bubble */
+.collapsed .mx_RoomTile_highlight .mx_RoomTile_badge:not(.mx_RoomTile_badgeMute):after {
+ display: none;
+}
+
+/* This is the bottom of the speech bubble - not drawn when room muted */
+.mx_RoomTile_highlight .mx_RoomTile_badge:not(.mx_RoomTile_badgeMute):after {
content: "";
position: absolute;
display: block;
width: 0;
height: 0;
- margin-left: 4px;
+ margin-left: 6px;
border-top: 8px solid #ff0064;
border-right: 10px solid transparent;
}
-/* Because the specificity of this and the above ".mx_RoomTile_highlight .mx_RoomTile_badge:after"
-style are the same, this style needs to be AFTER it to take effect when matched */
-.collapsed .mx_RoomTile_badge:after {
- display: none;
-}
-
.mx_RoomTile_badge {
display: inline-block;
- min-width: 14px;
- height: 18px;
- position: relative;
- left: 8px;
- top: 2px;
- border-radius: 18px;
+ min-width: 19px;
+ height: 17px;
+ position: absolute;
+ right: 8px; /*gutter */
+ top: 9px;
+ border-radius: 14px;
color: #fff;
- font-weight: bold;
+ font-weight: 600;
font-size: 11px;
text-align: center;
- padding-top: 2px;
+ padding-top: 1px;
padding-left: 4px;
padding-right: 4px;
}
-.mx_RoomTile_badge:hover {
+.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton,
+.mx_RoomTile.mx_RoomTile_menu .mx_RoomTile_badge {
letter-spacing: 0.1em;
opacity: 1;
}
+/* Position menu icon when room muted */
+.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton.mx_RoomTile_badgeMute,
+.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton.mx_RoomTile_badgeMute {
+ background-color: rgb(214, 214, 214);
+ letter-spacing: 0.1em;
+ opacity: 1;
+ top: 9px;
+ right: 8px; /* gutter */
+}
+
+/* Position mute icon when room muted */
+.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeMute {
+ background-color: rgba(0,0,0,0);
+ opacity: 1;
+ top: 11px;
+ right: 6px;
+}
+
.mx_RoomTile_unreadNotify .mx_RoomTile_badge {
background-color: #76cfa6;
}
@@ -119,26 +168,23 @@ style are the same, this style needs to be AFTER it to take effect when matched
background-color: #ff0064;
}
-.mx_RoomTile_badge_no_unread {
+.mx_RoomTile_read .mx_RoomTile_badge {
background-color: rgb(214, 214, 214);
opacity: 0;
}
.mx_RoomTile_unread, .mx_RoomTile_highlight {
- font-weight: bold;
+ font-weight: 600;
}
-.mx_RoomTile_selected .mx_RoomTile_name span {
- display: inline-block;
- position: relative;
- width: 100%;
- padding: 4px;
- margin-top: -4px;
- margin-bottom: -4px;
- border-radius: 2px;
+.mx_RoomTile_selected {
background-color: rgba(118,207,166,0.2);
}
+.mx_RoomTile .mx_RoomTile_name.mx_RoomTile_badgeShown {
+ width: 144px;
+}
+
.mx_RoomTile_arrow {
position: absolute;
right: 0px;
diff --git a/src/skins/vector/css/vector-web/structures/LeftPanel.css b/src/skins/vector/css/vector-web/structures/LeftPanel.css
index ea12c953..316246cb 100644
--- a/src/skins/vector/css/vector-web/structures/LeftPanel.css
+++ b/src/skins/vector/css/vector-web/structures/LeftPanel.css
@@ -51,6 +51,10 @@ limitations under the License.
overflow-y: auto;
}
+.mx_LeftPanel.collapsed .mx_BottomLeftMenu {
+ flex: 0 0 120px;
+}
+
.mx_LeftPanel .mx_BottomLeftMenu {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
@@ -59,10 +63,11 @@ limitations under the License.
order: 3;
border-top: 1px solid rgba(0, 0, 0, 0.1);
- margin-left: 18px;
- margin-right: 18px;
+ margin-left: 16px; /* gutter */
+ margin-right: 16px; /* gutter */
-webkit-flex: 0 0 60px;
flex: 0 0 60px;
+ z-index: 1;
}
.mx_LeftPanel .mx_BottomLeftMenu_options {
@@ -95,3 +100,7 @@ limitations under the License.
.mx_LeftPanel .mx_BottomLeftMenu_settings {
float: right;
}
+
+.mx_LeftPanel.collapsed .mx_BottomLeftMenu_settings {
+ float: none;
+}
diff --git a/src/skins/vector/css/vector-web/structures/RoomSubList.css b/src/skins/vector/css/vector-web/structures/RoomSubList.css
index 8f9db8fe..b54fea98 100644
--- a/src/skins/vector/css/vector-web/structures/RoomSubList.css
+++ b/src/skins/vector/css/vector-web/structures/RoomSubList.css
@@ -25,8 +25,8 @@ limitations under the License.
color: #3d3b39;
font-weight: 600;
font-size: 13px;
- padding-left: 12px;
- padding-right: 12px;
+ padding-left: 16px; /* gutter */
+ padding-right: 16px; /* gutter */
margin-top: 8px;
margin-bottom: 4px;
cursor: pointer;
diff --git a/src/skins/vector/css/vector-web/views/context_menus/MessageContextMenu.css b/src/skins/vector/css/vector-web/views/context_menus/MessageContextMenu.css
new file mode 100644
index 00000000..85e8080c
--- /dev/null
+++ b/src/skins/vector/css/vector-web/views/context_menus/MessageContextMenu.css
@@ -0,0 +1,25 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_MessageContextMenu_field {
+ padding: 3px 6px 3px 6px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.mx_MessageContextMenu_field.mx_MessageContextMenu_fieldSet {
+ font-weight: bold;
+}
diff --git a/src/skins/vector/css/vector-web/views/context_menus/NotificationStateContextMenu.css b/src/skins/vector/css/vector-web/views/context_menus/NotificationStateContextMenu.css
new file mode 100644
index 00000000..1a186178
--- /dev/null
+++ b/src/skins/vector/css/vector-web/views/context_menus/NotificationStateContextMenu.css
@@ -0,0 +1,56 @@
+/*
+Copyright 2015, 2016 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_NotificationStateContextMenu_picker {
+ position: absolute;
+ top: 16px;
+ left: 5px;
+}
+
+.mx_NotificationStateContextMenu_field {
+ padding-top: 4px;
+ padding-right: 6px;
+ padding-bottom: 10px;
+ padding-left: 20px;
+ cursor: pointer;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+}
+
+.mx_NotificationStateContextMenu_field.mx_NotificationStateContextMenu_fieldSet {
+ font-weight: bold;
+ padding-left: 8px;
+}
+
+.mx_NotificationStateContextMenu_field.mx_NotificationStateContextMenu_fieldDisabled {
+ color: rgba(0, 0, 0, 0.2);
+}
+
+.mx_NotificationStateContextMenu_icon {
+ padding-right: 4px;
+ padding-left: 4px;
+}
+
+.mx_NotificationStateContextMenu_activeIcon {
+ display: none;
+ position: relative;
+ left: -5px;
+}
+
+.mx_NotificationStateContextMenu_fieldSet .mx_NotificationStateContextMenu_activeIcon {
+ display: inline-block;
+}
diff --git a/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css b/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css
index 7ad5e893..61fbbf74 100644
--- a/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css
+++ b/src/skins/vector/css/vector-web/views/rooms/RoomDropTarget.css
@@ -16,8 +16,8 @@ limitations under the License.
.mx_RoomDropTarget {
font-size: 13px;
- margin-left: 10px;
- margin-right: 15px;
+ margin-left: 18px;
+ margin-right: 18px;
padding-top: 5px;
padding-bottom: 5px;
border: 1px dashed #76cfa6;
@@ -28,6 +28,7 @@ limitations under the License.
.collapsed .mx_RoomDropTarget {
margin-right: 10px;
+ margin-left: 10px;
}
.mx_RoomDropTarget_placeholder {
diff --git a/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css b/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css
index 3aec0fa7..deb8cd3f 100644
--- a/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css
+++ b/src/skins/vector/css/vector-web/views/rooms/RoomTooltip.css
@@ -14,19 +14,19 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
+.mx_RoomTooltip_chevron {
+ position: absolute;
+ left: -9px;
+ top: 7px;
+}
+
.mx_RoomTooltip {
display: none;
position: fixed;
border: 1px solid #a4a4a4;
border-radius: 8px;
background-color: #fff;
- z-index: 1000;
- left: 64px;
+ z-index: 2000;
+ left: 52px;
padding: 6px;
}
-
-.mx_RoomTooltip_chevron {
- position: absolute;
- left: -9px;
- top: 8px;
-}
diff --git a/src/skins/vector/img/icon-context-mute-mentions.svg b/src/skins/vector/img/icon-context-mute-mentions.svg
new file mode 100644
index 00000000..3693b7a8
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute-mentions.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute-off-copy.svg b/src/skins/vector/img/icon-context-mute-off-copy.svg
new file mode 100644
index 00000000..861f2975
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute-off-copy.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute-off.svg b/src/skins/vector/img/icon-context-mute-off.svg
new file mode 100644
index 00000000..d801823b
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute-off.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/icon-context-mute.svg b/src/skins/vector/img/icon-context-mute.svg
new file mode 100644
index 00000000..f53b868a
--- /dev/null
+++ b/src/skins/vector/img/icon-context-mute.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/notif-active.svg b/src/skins/vector/img/notif-active.svg
new file mode 100644
index 00000000..9eb279f8
--- /dev/null
+++ b/src/skins/vector/img/notif-active.svg
@@ -0,0 +1,20 @@
+
+
+
+ E15782FC-B5FA-472A-AE12-CFFF484E7253
+ Created with sketchtool.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/skins/vector/img/notif-slider.svg b/src/skins/vector/img/notif-slider.svg
new file mode 100644
index 00000000..55fa06d1
--- /dev/null
+++ b/src/skins/vector/img/notif-slider.svg
@@ -0,0 +1,22 @@
+
+
+
+ 16CB4618-0BD3-4568-BB20-FC56EBC46046
+ Created with sketchtool.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+