Merge pull request #1941 from vector-im/wmwragg/room-tag-menu
Wmwragg/room tag menu
@ -36,6 +36,7 @@ module.exports.components['structures.SearchBox'] = require('./components/struct
 | 
				
			|||||||
module.exports.components['structures.ViewSource'] = require('./components/structures/ViewSource');
 | 
					module.exports.components['structures.ViewSource'] = require('./components/structures/ViewSource');
 | 
				
			||||||
module.exports.components['views.context_menus.MessageContextMenu'] = require('./components/views/context_menus/MessageContextMenu');
 | 
					module.exports.components['views.context_menus.MessageContextMenu'] = require('./components/views/context_menus/MessageContextMenu');
 | 
				
			||||||
module.exports.components['views.context_menus.NotificationStateContextMenu'] = require('./components/views/context_menus/NotificationStateContextMenu');
 | 
					module.exports.components['views.context_menus.NotificationStateContextMenu'] = require('./components/views/context_menus/NotificationStateContextMenu');
 | 
				
			||||||
 | 
					module.exports.components['views.context_menus.RoomTagContextMenu'] = require('./components/views/context_menus/RoomTagContextMenu');
 | 
				
			||||||
module.exports.components['views.elements.ImageView'] = require('./components/views/elements/ImageView');
 | 
					module.exports.components['views.elements.ImageView'] = require('./components/views/elements/ImageView');
 | 
				
			||||||
module.exports.components['views.elements.Spinner'] = require('./components/views/elements/Spinner');
 | 
					module.exports.components['views.elements.Spinner'] = require('./components/views/elements/Spinner');
 | 
				
			||||||
module.exports.components['views.globals.GuestWarningBar'] = require('./components/views/globals/GuestWarningBar');
 | 
					module.exports.components['views.globals.GuestWarningBar'] = require('./components/views/globals/GuestWarningBar');
 | 
				
			||||||
 | 
				
			|||||||
@ -149,11 +149,26 @@ var RoomSubList = React.createClass({
 | 
				
			|||||||
        return this.tsOfNewestEvent(roomB) - this.tsOfNewestEvent(roomA);
 | 
					        return this.tsOfNewestEvent(roomB) - this.tsOfNewestEvent(roomA);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lexicographicalComparator: function(roomA, roomB) {
 | 
				
			||||||
 | 
					        return roomA.name > roomB.name ? 1 : -1;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Generates the manual comparator using the given list
 | 
				
			||||||
    manualComparator: function(roomA, roomB) {
 | 
					    manualComparator: function(roomA, roomB) {
 | 
				
			||||||
        if (!roomA.tags[this.props.tagName] || !roomB.tags[this.props.tagName]) return 0;
 | 
					        if (!roomA.tags[this.props.tagName] || !roomB.tags[this.props.tagName]) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Make sure the room tag has an order element, if not set it to be the bottom
 | 
				
			||||||
        var a = roomA.tags[this.props.tagName].order;
 | 
					        var a = roomA.tags[this.props.tagName].order;
 | 
				
			||||||
        var b = roomB.tags[this.props.tagName].order;
 | 
					        var b = roomB.tags[this.props.tagName].order;
 | 
				
			||||||
        return a == b ? this.recentsComparator(roomA, roomB) : ( a > b  ? 1 : -1);
 | 
					
 | 
				
			||||||
 | 
					        // Order undefined room tag orders to the bottom
 | 
				
			||||||
 | 
					        if (a === undefined && b !== undefined) {
 | 
				
			||||||
 | 
					            return 1;
 | 
				
			||||||
 | 
					        } else if (a !== undefined && b === undefined) {
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return a == b ? this.lexicographicalComparator(roomA, roomB) : ( a > b  ? 1 : -1);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sortList: function(list, order) {
 | 
					    sortList: function(list, order) {
 | 
				
			||||||
@ -164,6 +179,9 @@ var RoomSubList = React.createClass({
 | 
				
			|||||||
        if (order === "manual") comparator = this.manualComparator;
 | 
					        if (order === "manual") comparator = this.manualComparator;
 | 
				
			||||||
        if (order === "recent") comparator = this.recentsComparator;
 | 
					        if (order === "recent") comparator = this.recentsComparator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Fix undefined orders here, and make sure the backend gets updated as well
 | 
				
			||||||
 | 
					        this._fixUndefinedOrder(list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //if (debug) console.log("sorting list for sublist " + this.props.label + " with length " + list.length + ", this.props.list = " + this.props.list);
 | 
					        //if (debug) console.log("sorting list for sublist " + this.props.label + " with length " + list.length + ", this.props.list = " + this.props.list);
 | 
				
			||||||
        this.setState({ sortedList: list.sort(comparator) });
 | 
					        this.setState({ sortedList: list.sort(comparator) });
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -312,6 +330,46 @@ var RoomSubList = React.createClass({
 | 
				
			|||||||
        this.props.onShowMoreRooms();
 | 
					        this.props.onShowMoreRooms();
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Fix any undefined order elements of a room in a manual ordered list
 | 
				
			||||||
 | 
					    //     room.tag[tagname].order
 | 
				
			||||||
 | 
					    _fixUndefinedOrder: function(list) {
 | 
				
			||||||
 | 
					        if (this.props.order === "manual") {
 | 
				
			||||||
 | 
					            var order = 0.0;
 | 
				
			||||||
 | 
					            var self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Find the highest (lowest position) order of a room in a manual ordered list
 | 
				
			||||||
 | 
					            list.forEach(function(room) {
 | 
				
			||||||
 | 
					                if (room.tags.hasOwnProperty(self.props.tagName)) {
 | 
				
			||||||
 | 
					                    if (order < room.tags[self.props.tagName].order) {
 | 
				
			||||||
 | 
					                        order = room.tags[self.props.tagName].order;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Fix any undefined order elements of a room in a manual ordered list
 | 
				
			||||||
 | 
					            // Do this one at a time, as each time a rooms tag data is updated the RoomList
 | 
				
			||||||
 | 
					            // gets triggered and another list is passed in. Doing it one at a time means that
 | 
				
			||||||
 | 
					            // we always correctly calculate the highest order for the list - stops multiple
 | 
				
			||||||
 | 
					            // rooms getting the same order. This is only really relevant for the first time this
 | 
				
			||||||
 | 
					            // is run with historical room tag data, after that there should only be undefined
 | 
				
			||||||
 | 
					            // in the list at a time anyway.
 | 
				
			||||||
 | 
					            for (let i = 0; i < list.length; i++) {
 | 
				
			||||||
 | 
					                if (list[i].tags[self.props.tagName].order === undefined) {
 | 
				
			||||||
 | 
					                    MatrixClientPeg.get().setRoomTag(list[i].roomId, self.props.tagName, {order: (order + 1.0) / 2.0}).finally(function() {
 | 
				
			||||||
 | 
					                        // Do any final stuff here
 | 
				
			||||||
 | 
					                    }).fail(function(err) {
 | 
				
			||||||
 | 
					                        var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
 | 
				
			||||||
 | 
					                        Modal.createDialog(ErrorDialog, {
 | 
				
			||||||
 | 
					                            title: "Failed to add tag " + self.props.tagName + " to room",
 | 
				
			||||||
 | 
					                            description: err.toString()
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render: function() {
 | 
					    render: function() {
 | 
				
			||||||
        var connectDropTarget = this.props.connectDropTarget;
 | 
					        var connectDropTarget = this.props.connectDropTarget;
 | 
				
			||||||
        var RoomDropTarget = sdk.getComponent('rooms.RoomDropTarget');
 | 
					        var RoomDropTarget = sdk.getComponent('rooms.RoomDropTarget');
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ module.exports = React.createClass({
 | 
				
			|||||||
            // Wrapping this in a q promise, as setRoomMutePushRule can return
 | 
					            // Wrapping this in a q promise, as setRoomMutePushRule can return
 | 
				
			||||||
            // a promise or a value
 | 
					            // a promise or a value
 | 
				
			||||||
            q(cli.setRoomMutePushRule("global", roomId, areNotifsMuted))
 | 
					            q(cli.setRoomMutePushRule("global", roomId, areNotifsMuted))
 | 
				
			||||||
            .then(function(s) {
 | 
					            .then(function() {
 | 
				
			||||||
                self.setState({areNotifsMuted: areNotifsMuted});
 | 
					                self.setState({areNotifsMuted: areNotifsMuted});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // delay slightly so that the user can see their state change
 | 
					                // delay slightly so that the user can see their state change
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										171
									
								
								src/components/views/context_menus/RoomTagContextMenu.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					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: 'RoomTagContextMenu',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    propTypes: {
 | 
				
			||||||
 | 
					        room: React.PropTypes.object.isRequired,
 | 
				
			||||||
 | 
					        /* callback called when the menu is dismissed */
 | 
				
			||||||
 | 
					        onFinished: React.PropTypes.func,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getInitialState: function() {
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            isFavourite: this.props.room.tags.hasOwnProperty("m.favourite"),
 | 
				
			||||||
 | 
					            isLowPriority: this.props.room.tags.hasOwnProperty("m.lowpriority"),
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _toggleTag: function(tagNameOn, tagNameOff) {
 | 
				
			||||||
 | 
					        var self = this;
 | 
				
			||||||
 | 
					        const roomId = this.props.room.roomId;
 | 
				
			||||||
 | 
					        var cli = MatrixClientPeg.get();
 | 
				
			||||||
 | 
					        if (!cli.isGuest()) {
 | 
				
			||||||
 | 
					            q.delay(500).then(function() {
 | 
				
			||||||
 | 
					                if (tagNameOff !== null && tagNameOff !== undefined) {
 | 
				
			||||||
 | 
					                    cli.deleteRoomTag(roomId, tagNameOff).finally(function() {
 | 
				
			||||||
 | 
					                        // Close the context menu
 | 
				
			||||||
 | 
					                        if (self.props.onFinished) {
 | 
				
			||||||
 | 
					                            self.props.onFinished();
 | 
				
			||||||
 | 
					                        };
 | 
				
			||||||
 | 
					                    }).fail(function(err) {
 | 
				
			||||||
 | 
					                        var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
 | 
				
			||||||
 | 
					                        Modal.createDialog(ErrorDialog, {
 | 
				
			||||||
 | 
					                            title: "Failed to remove tag " + tagNameOff + " from room",
 | 
				
			||||||
 | 
					                            description: err.toString()
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tagNameOn !== null && tagNameOn !== undefined) {
 | 
				
			||||||
 | 
					                    // If the tag ordering meta data is required, it is added by
 | 
				
			||||||
 | 
					                    // the RoomSubList when it sorts its rooms
 | 
				
			||||||
 | 
					                    cli.setRoomTag(roomId, tagNameOn, {}).finally(function() {
 | 
				
			||||||
 | 
					                        // Close the context menu
 | 
				
			||||||
 | 
					                        if (self.props.onFinished) {
 | 
				
			||||||
 | 
					                            self.props.onFinished();
 | 
				
			||||||
 | 
					                        };
 | 
				
			||||||
 | 
					                    }).fail(function(err) {
 | 
				
			||||||
 | 
					                        var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
 | 
				
			||||||
 | 
					                        Modal.createDialog(ErrorDialog, {
 | 
				
			||||||
 | 
					                            title: "Failed to add tag " + tagNameOn + " to room",
 | 
				
			||||||
 | 
					                            description: err.toString()
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _onClickFavourite: function() {
 | 
				
			||||||
 | 
					        // Tag room as 'Favourite'
 | 
				
			||||||
 | 
					        if (!this.state.isFavourite && this.state.isLowPriority) {
 | 
				
			||||||
 | 
					            this.setState({
 | 
				
			||||||
 | 
					                isFavourite: true,
 | 
				
			||||||
 | 
					                isLowPriority: false,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            this._toggleTag("m.favourite", "m.lowpriority");
 | 
				
			||||||
 | 
					        } else if (this.state.isFavourite) {
 | 
				
			||||||
 | 
					            this.setState({isFavourite: false});
 | 
				
			||||||
 | 
					            this._toggleTag(null, "m.favourite");
 | 
				
			||||||
 | 
					        } else if (!this.state.isFavourite) {
 | 
				
			||||||
 | 
					            this.setState({isFavourite: true});
 | 
				
			||||||
 | 
					            this._toggleTag("m.favourite");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _onClickLowPriority: function() {
 | 
				
			||||||
 | 
					        // Tag room as 'Low Priority'
 | 
				
			||||||
 | 
					        if (!this.state.isLowPriority && this.state.isFavourite) {
 | 
				
			||||||
 | 
					            this.setState({
 | 
				
			||||||
 | 
					                isFavourite: false,
 | 
				
			||||||
 | 
					                isLowPriority: true,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            this._toggleTag("m.lowpriority", "m.favourite");
 | 
				
			||||||
 | 
					        } else if (this.state.isLowPriority) {
 | 
				
			||||||
 | 
					            this.setState({isLowPriority: false});
 | 
				
			||||||
 | 
					            this._toggleTag(null, "m.lowpriority");
 | 
				
			||||||
 | 
					        } else if (!this.state.isLowPriority) {
 | 
				
			||||||
 | 
					            this.setState({isLowPriority: true});
 | 
				
			||||||
 | 
					            this._toggleTag("m.lowpriority");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _onClickLeave: function() {
 | 
				
			||||||
 | 
					        // Leave room
 | 
				
			||||||
 | 
					        dis.dispatch({
 | 
				
			||||||
 | 
					            action: 'leave_room',
 | 
				
			||||||
 | 
					            room_id: this.props.room.roomId,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Close the context menu
 | 
				
			||||||
 | 
					        if (this.props.onFinished) {
 | 
				
			||||||
 | 
					            this.props.onFinished();
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render: function() {
 | 
				
			||||||
 | 
					        var myUserId = MatrixClientPeg.get().credentials.userId;
 | 
				
			||||||
 | 
					        var myMember = this.props.room.getMember(myUserId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var favouriteClasses = classNames({
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_field': true,
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_fieldSet': this.state.isFavourite,
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_fieldDisabled': false,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var lowPriorityClasses = classNames({
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_field': true,
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_fieldSet': this.state.isLowPriority,
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_fieldDisabled': false,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var leaveClasses = classNames({
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_field': true,
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_fieldSet': false,
 | 
				
			||||||
 | 
					            'mx_RoomTagContextMenu_fieldDisabled': false,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (
 | 
				
			||||||
 | 
					            <div>
 | 
				
			||||||
 | 
					                <div className={ favouriteClasses } onClick={this._onClickFavourite} >
 | 
				
			||||||
 | 
					                    <img className="mx_RoomTagContextMenu_icon" src="img/icon_context_fave.svg" width="15" height="15" />
 | 
				
			||||||
 | 
					                    <img className="mx_RoomTagContextMenu_icon_set" src="img/icon_context_fave_on.svg" width="15" height="15" />
 | 
				
			||||||
 | 
					                    Favourite
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					                <div className={ lowPriorityClasses } onClick={this._onClickLowPriority} >
 | 
				
			||||||
 | 
					                    <img className="mx_RoomTagContextMenu_icon" src="img/icon_context_low.svg" width="15" height="15" />
 | 
				
			||||||
 | 
					                    <img className="mx_RoomTagContextMenu_icon_set" src="img/icon_context_low_on.svg" width="15" height="15" />
 | 
				
			||||||
 | 
					                    Low Priority
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					                <hr className="mx_RoomTagContextMenu_separator" />
 | 
				
			||||||
 | 
					                <div className={ leaveClasses } onClick={(myMember && myMember.membership === "join") ? this._onClickLeave : null} >
 | 
				
			||||||
 | 
					                    <img className="mx_RoomTagContextMenu_icon" src="img/icon_context_delete.svg" width="15" height="15" />
 | 
				
			||||||
 | 
					                    Leave
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -32,6 +32,8 @@ body {
 | 
				
			|||||||
    color: #454545;
 | 
					    color: #454545;
 | 
				
			||||||
    border: 0px;
 | 
					    border: 0px;
 | 
				
			||||||
    margin: 0px;
 | 
					    margin: 0px;
 | 
				
			||||||
 | 
					    /* This should render the fonts the same accross browsers */
 | 
				
			||||||
 | 
					    -webkit-font-smoothing: subpixel-antialiased;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div.error {
 | 
					div.error {
 | 
				
			||||||
 | 
				
			|||||||
@ -55,7 +55,7 @@ limitations under the License.
 | 
				
			|||||||
    border-bottom: 8px solid transparent;
 | 
					    border-bottom: 8px solid transparent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.mx_ContextualMenu_chevron_right:after{
 | 
					.mx_ContextualMenu_chevron_right:after {
 | 
				
			||||||
    content:'';
 | 
					    content:'';
 | 
				
			||||||
    width: 0;
 | 
					    width: 0;
 | 
				
			||||||
    height: 0;
 | 
					    height: 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -16,8 +16,8 @@ limitations under the License.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
.mx_SearchBox {
 | 
					.mx_SearchBox {
 | 
				
			||||||
    height: 24px;
 | 
					    height: 24px;
 | 
				
			||||||
    margin-left: 18px;
 | 
					    margin-left: 16px;
 | 
				
			||||||
    margin-right: 18px;
 | 
					    margin-right: 16px;
 | 
				
			||||||
    padding-top: 24px;
 | 
					    padding-top: 24px;
 | 
				
			||||||
    padding-bottom: 22px;
 | 
					    padding-bottom: 22px;
 | 
				
			||||||
    border-bottom: 1px solid rgba(0, 0, 0, 0.1);
 | 
					    border-bottom: 1px solid rgba(0, 0, 0, 0.1);
 | 
				
			||||||
 | 
				
			|||||||
@ -233,7 +233,7 @@ limitations under the License.
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.mx_RoomHeader_button {
 | 
					.mx_RoomHeader_button {
 | 
				
			||||||
    margin-left: 8px;
 | 
					    margin-left: 12px;
 | 
				
			||||||
    cursor: pointer;
 | 
					    cursor: pointer;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -32,13 +32,49 @@ limitations under the License.
 | 
				
			|||||||
    display: inline-block;
 | 
					    display: inline-block;
 | 
				
			||||||
    padding-top: 5px;
 | 
					    padding-top: 5px;
 | 
				
			||||||
    padding-bottom: 5px;
 | 
					    padding-bottom: 5px;
 | 
				
			||||||
    padding-left: 18px;
 | 
					    padding-left: 16px;
 | 
				
			||||||
    padding-right: 6px;
 | 
					    padding-right: 6px;
 | 
				
			||||||
    width: 24px;
 | 
					    width: 24px;
 | 
				
			||||||
    height: 24px;
 | 
					    height: 24px;
 | 
				
			||||||
    vertical-align: middle;
 | 
					    vertical-align: middle;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTile_avatar_container:hover:before,
 | 
				
			||||||
 | 
					.mx_RoomTile_avatar_container.mx_RoomTile_avatar_roomTagMenu:before {
 | 
				
			||||||
 | 
					    display: block;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    content: "";
 | 
				
			||||||
 | 
					    border-radius: 40px;
 | 
				
			||||||
 | 
					    background-image: url("img/icons_ellipsis.svg");
 | 
				
			||||||
 | 
					    background-size: 25px;
 | 
				
			||||||
 | 
					    left: 15px;
 | 
				
			||||||
 | 
					    width: 24px;
 | 
				
			||||||
 | 
					    height: 24px;
 | 
				
			||||||
 | 
					    z-index: 4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTile_avatar_container:hover:after,
 | 
				
			||||||
 | 
					.mx_RoomTile_avatar_container.mx_RoomTile_avatar_roomTagMenu:after {
 | 
				
			||||||
 | 
					    display: block;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    content: "";
 | 
				
			||||||
 | 
					    border-radius: 40px;
 | 
				
			||||||
 | 
					    background: #4A4A4A;
 | 
				
			||||||
 | 
					    top: 5px;
 | 
				
			||||||
 | 
					    width: 24px;
 | 
				
			||||||
 | 
					    height: 24px;
 | 
				
			||||||
 | 
					    opacity: 0.6;
 | 
				
			||||||
 | 
					    z-index: 2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.collapsed .mx_RoomTile_avatar_container:hover:before {
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.collapsed .mx_RoomTile_avatar_container:hover:after {
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.mx_RoomTile_name {
 | 
					.mx_RoomTile_name {
 | 
				
			||||||
    display: inline-block;
 | 
					    display: inline-block;
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
@ -116,13 +152,13 @@ limitations under the License.
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton,
 | 
					.mx_RoomTile .mx_RoomTile_badge.mx_RoomTile_badgeButton,
 | 
				
			||||||
.mx_RoomTile.mx_RoomTile_menu .mx_RoomTile_badge {
 | 
					.mx_RoomTile.mx_RoomTile_notificationStateMenu .mx_RoomTile_badge {
 | 
				
			||||||
    letter-spacing: 0.1em;
 | 
					    letter-spacing: 0.1em;
 | 
				
			||||||
    opacity: 1;
 | 
					    opacity: 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.mx_RoomTile.mx_RoomTile_noBadges .mx_RoomTile_badge.mx_RoomTile_badgeButton,
 | 
					.mx_RoomTile.mx_RoomTile_noBadges .mx_RoomTile_badge.mx_RoomTile_badgeButton,
 | 
				
			||||||
.mx_RoomTile.mx_RoomTile_menu.mx_RoomTile_noBadges .mx_RoomTile_badge {
 | 
					.mx_RoomTile.mx_RoomTile_notificationStateMenu.mx_RoomTile_noBadges .mx_RoomTile_badge {
 | 
				
			||||||
    background-color: rgb(214, 214, 214);
 | 
					    background-color: rgb(214, 214, 214);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					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_RoomTagContextMenu_field {
 | 
				
			||||||
 | 
					    padding-top: 8px;
 | 
				
			||||||
 | 
					    padding-right: 20px;
 | 
				
			||||||
 | 
					    padding-bottom: 8px;
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					    white-space: nowrap;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    line-height: 16px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_field:first-child {
 | 
				
			||||||
 | 
					    padding-top: 4px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_field:last-child {
 | 
				
			||||||
 | 
					    padding-bottom: 4px;
 | 
				
			||||||
 | 
					    color: #ff0064;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_field.mx_RoomTagContextMenu_fieldSet {
 | 
				
			||||||
 | 
					    font-weight: bold;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_field.mx_RoomTagContextMenu_fieldSet .mx_RoomTagContextMenu_icon {
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_field.mx_RoomTagContextMenu_fieldSet .mx_RoomTagContextMenu_icon_set {
 | 
				
			||||||
 | 
					    display: inline-block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_field.mx_RoomTagContextMenu_fieldDisabled {
 | 
				
			||||||
 | 
					    color: rgba(0, 0, 0, 0.2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_icon {
 | 
				
			||||||
 | 
					    padding-right: 8px;
 | 
				
			||||||
 | 
					    padding-left: 4px;
 | 
				
			||||||
 | 
					    display: inline-block
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_icon_set {
 | 
				
			||||||
 | 
					    padding-right: 8px;
 | 
				
			||||||
 | 
					    padding-left: 4px;
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_separator {
 | 
				
			||||||
 | 
					    margin-top: 0;
 | 
				
			||||||
 | 
					    margin-bottom: 0;
 | 
				
			||||||
 | 
					    border-bottom-style: none;
 | 
				
			||||||
 | 
					    border-left-style: none;
 | 
				
			||||||
 | 
					    border-right-style: none;
 | 
				
			||||||
 | 
					    border-top-style: solid;
 | 
				
			||||||
 | 
					    border-top-width: 1px;
 | 
				
			||||||
 | 
					    border-color: #bbbbbb;
 | 
				
			||||||
 | 
					    opacity: 0.4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.mx_RoomTagContextMenu_fieldSet .mx_RoomTagContextMenu_icon {
 | 
				
			||||||
 | 
					    /* Something to indicate that the icon is the set tag */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/skins/vector/img/icon-context-delete.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="15" height="15" viewBox="0, 0, 15, 15">
 | 
				
			||||||
 | 
					  <g id="Extra-icons">
 | 
				
			||||||
 | 
					    <g>
 | 
				
			||||||
 | 
					      <path d="M3.45,3.45 L11.55,11.55" fill-opacity="0" stroke="#FF0064" stroke-width="1" stroke-linecap="round" id="Line"/>
 | 
				
			||||||
 | 
					      <path d="M11.55,3.45 L3.45,11.55" fill-opacity="0" stroke="#FF0064" stroke-width="1" stroke-linecap="round" id="Line-Copy-2"/>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 607 B  | 
							
								
								
									
										15
									
								
								src/skins/vector/img/icon-context-fave-on.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 | 
				
			||||||
 | 
					    <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
 | 
				
			||||||
 | 
					    <title>DAE17B64-40B5-478A-8E8D-97AD1A6E25C8</title>
 | 
				
			||||||
 | 
					    <desc>Created with sketchtool.</desc>
 | 
				
			||||||
 | 
					    <defs></defs>
 | 
				
			||||||
 | 
					    <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
 | 
				
			||||||
 | 
					        <g id="Extra-icons-sheet" transform="translate(-93.000000, -313.000000)">
 | 
				
			||||||
 | 
					            <g id="icon_context_fave_on" transform="translate(92.000000, 312.000000)">
 | 
				
			||||||
 | 
					                <rect id="Rectangle" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect>
 | 
				
			||||||
 | 
					                <polygon id="Star-1" stroke="#4A4A4A" stroke-linejoin="round" fill="#4A4A4A" points="7.5 10.75 3.67939586 12.7586105 4.40906632 8.50430523 1.31813264 5.49138954 5.58969793 4.87069477 7.5 1 9.41030207 4.87069477 13.6818674 5.49138954 10.5909337 8.50430523 11.3206041 12.7586105"></polygon>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
							
								
								
									
										15
									
								
								src/skins/vector/img/icon-context-fave.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 | 
				
			||||||
 | 
					    <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
 | 
				
			||||||
 | 
					    <title>8A6E1837-F0F1-432E-A0DA-6F3741F71EBF</title>
 | 
				
			||||||
 | 
					    <desc>Created with sketchtool.</desc>
 | 
				
			||||||
 | 
					    <defs></defs>
 | 
				
			||||||
 | 
					    <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.2">
 | 
				
			||||||
 | 
					        <g id="Extra-icons-sheet" transform="translate(-63.000000, -313.000000)">
 | 
				
			||||||
 | 
					            <g id="icon_context_fave" transform="translate(62.000000, 312.000000)">
 | 
				
			||||||
 | 
					                <rect id="Rectangle" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect>
 | 
				
			||||||
 | 
					                <polygon id="Star-1" stroke="#000000" stroke-linejoin="round" points="7.5 10.75 3.67939586 12.7586105 4.40906632 8.50430523 1.31813264 5.49138954 5.58969793 4.87069477 7.5 1 9.41030207 4.87069477 13.6818674 5.49138954 10.5909337 8.50430523 11.3206041 12.7586105"></polygon>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
							
								
								
									
										15
									
								
								src/skins/vector/img/icon-context-low-on.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 | 
				
			||||||
 | 
					    <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
 | 
				
			||||||
 | 
					    <title>CD51482C-F2D4-4F63-AF9E-86513F9AF87F</title>
 | 
				
			||||||
 | 
					    <desc>Created with sketchtool.</desc>
 | 
				
			||||||
 | 
					    <defs></defs>
 | 
				
			||||||
 | 
					    <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
 | 
				
			||||||
 | 
					        <g id="Extra-icons-sheet" transform="translate(-93.000000, -338.000000)">
 | 
				
			||||||
 | 
					            <g id="icon_context_low_on" transform="translate(92.000000, 337.000000)">
 | 
				
			||||||
 | 
					                <rect id="Rectangle-Copy" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect>
 | 
				
			||||||
 | 
					                <path d="M12.7604081,8 C13.2413214,8 13.3067421,8.25679316 12.9190465,8.57356358 L8.20351162,12.4264364 C7.81340686,12.7451752 7.18723719,12.7432068 6.79954156,12.4264364 L2.08400668,8.57356358 C1.69390193,8.25482476 1.76733588,8 2.24264506,8 L4.46666667,8 L4.46666667,3.00292933 C4.46666667,2.44902676 4.84616384,2 5.33587209,2 L9.66412791,2 C10.1441768,2 10.5333333,2.43788135 10.5333333,3.00292933 L10.5333333,8 L12.7604081,8 Z" id="Combined-Shape" stroke="#4A4A4A" stroke-linejoin="round" fill="#4A4A4A"></path>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
							
								
								
									
										15
									
								
								src/skins/vector/img/icon-context-low.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 | 
				
			||||||
 | 
					    <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
 | 
				
			||||||
 | 
					    <title>B160345F-40D3-4BE6-A860-6D04BF223EF7</title>
 | 
				
			||||||
 | 
					    <desc>Created with sketchtool.</desc>
 | 
				
			||||||
 | 
					    <defs></defs>
 | 
				
			||||||
 | 
					    <g id="Extra-icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
 | 
				
			||||||
 | 
					        <g id="Extra-icons-sheet" transform="translate(-63.000000, -338.000000)">
 | 
				
			||||||
 | 
					            <g id="icon_context_low" transform="translate(62.000000, 337.000000)">
 | 
				
			||||||
 | 
					                <rect id="Rectangle" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="15" height="15"></rect>
 | 
				
			||||||
 | 
					                <path d="M12.7604081,8 C13.2413214,8 13.3067421,8.25679316 12.9190465,8.57356358 L8.20351162,12.4264364 C7.81340686,12.7451752 7.18723719,12.7432068 6.79954156,12.4264364 L2.08400668,8.57356358 C1.69390193,8.25482476 1.76733588,8 2.24264506,8 L4.46666667,8 L4.46666667,3.00292933 C4.46666667,2.44902676 4.84616384,2 5.33587209,2 L9.66412791,2 C10.1441768,2 10.5333333,2.43788135 10.5333333,3.00292933 L10.5333333,8 L12.7604081,8 Z" id="Combined-Shape" stroke="#000000" stroke-linejoin="round" opacity="0.2"></path>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
							
								
								
									
										11
									
								
								src/skins/vector/img/icon_context_delete.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
 | 
				
			||||||
 | 
					    <g transform="matrix(1,0,0,1,-0,-80)">
 | 
				
			||||||
 | 
					        <g id="icon_context_delete" transform="matrix(0.600982,0,0,0.600982,0,80)">
 | 
				
			||||||
 | 
					            <g transform="matrix(1.66394,0,0,1.66394,0,-133.116)">
 | 
				
			||||||
 | 
					                <path d="M7.508,86.728C8.739,85.523 9.979,84.326 11.196,83.109C11.277,83.034 11.364,82.99 11.472,82.968C11.512,82.964 11.549,82.962 11.589,82.964C11.668,82.973 11.743,82.994 11.811,83.036C11.994,83.148 12.086,83.371 12.036,83.579C12.017,83.657 11.98,83.724 11.93,83.787C10.749,85.064 9.524,86.299 8.285,87.52C9.489,88.752 10.686,89.991 11.904,91.209C11.958,91.267 12.001,91.331 12.026,91.408C12.042,91.458 12.05,91.51 12.05,91.562C12.05,91.82 11.846,92.041 11.589,92.061C11.454,92.071 11.33,92.025 11.225,91.942C9.948,90.762 8.713,89.536 7.492,88.297C6.261,89.501 5.021,90.698 3.804,91.916C3.745,91.97 3.681,92.013 3.605,92.038C3.555,92.054 3.502,92.062 3.45,92.062C3.192,92.062 2.972,91.858 2.952,91.602C2.941,91.466 2.987,91.342 3.07,91.238C4.251,89.96 5.476,88.726 6.715,87.505C5.511,86.273 4.314,85.034 3.096,83.816C3.042,83.757 2.999,83.693 2.974,83.617C2.908,83.413 2.983,83.184 3.156,83.058C3.221,83.01 3.294,82.984 3.372,82.968C3.412,82.964 3.449,82.962 3.489,82.964C3.598,82.977 3.689,83.014 3.775,83.082C5.052,84.263 6.287,85.488 7.508,86.728Z" style="fill:rgb(255,0,100);"/>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										12
									
								
								src/skins/vector/img/icon_context_fave.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
 | 
				
			||||||
 | 
					    <g transform="matrix(1,0,0,1,-0,-40)">
 | 
				
			||||||
 | 
					        <g id="icon_context_fave" transform="matrix(0.600982,0,0,0.600982,0,40)">
 | 
				
			||||||
 | 
					            <g transform="matrix(1.66394,0,0,1.66394,1.66394,2.71716)">
 | 
				
			||||||
 | 
					                <rect x="0" y="0" width="13" height="13" style="fill:rgb(224,223,224);fill-opacity:0;fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                <path d="M6.572,-0.495C6.614,-0.486 6.625,-0.486 6.666,-0.472C6.793,-0.427 6.884,-0.337 6.948,-0.221L8.742,3.414L12.754,3.997L12.801,4.006C12.88,4.029 12.951,4.062 13.013,4.117C13.161,4.248 13.218,4.459 13.157,4.646C13.132,4.725 13.087,4.789 13.031,4.849L10.128,7.679L10.813,11.674L10.819,11.722C10.821,11.804 10.812,11.882 10.779,11.958C10.7,12.139 10.517,12.259 10.32,12.259C10.237,12.259 10.162,12.236 10.088,12.201L6.5,10.315L2.912,12.201L2.868,12.222C2.791,12.249 2.714,12.264 2.631,12.256C2.435,12.237 2.265,12.1 2.204,11.913C2.178,11.834 2.177,11.756 2.187,11.674L2.872,7.679L-0.031,4.849L-0.064,4.814C-0.114,4.749 -0.152,4.681 -0.17,4.599C-0.213,4.407 -0.135,4.202 0.024,4.087C0.092,4.038 0.166,4.012 0.246,3.997L4.258,3.414L6.052,-0.221L6.075,-0.264C6.099,-0.299 6.104,-0.309 6.134,-0.34C6.211,-0.423 6.316,-0.478 6.428,-0.495C6.477,-0.502 6.523,-0.499 6.572,-0.495ZM5.038,4.092C5.017,4.13 5.013,4.14 4.987,4.174C4.928,4.251 4.847,4.31 4.755,4.342C4.715,4.357 4.704,4.357 4.662,4.365L1.393,4.841L3.758,7.146L3.791,7.182C3.817,7.216 3.825,7.224 3.846,7.261C3.903,7.364 3.916,7.474 3.902,7.589L3.343,10.845L6.267,9.307L6.311,9.287C6.42,9.249 6.531,9.237 6.643,9.271C6.684,9.283 6.694,9.289 6.733,9.307L9.657,10.845L9.098,7.589L9.092,7.541C9.089,7.425 9.113,7.317 9.18,7.22C9.204,7.185 9.213,7.178 9.242,7.146L11.607,4.841L8.338,4.365L8.291,4.356C8.25,4.344 8.239,4.342 8.2,4.324C8.093,4.275 8.018,4.193 7.962,4.092L6.5,1.13C6.013,2.117 5.525,3.105 5.038,4.092Z" style="fill:rgb(205,205,205);fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										29
									
								
								src/skins/vector/img/icon_context_fave_on.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
 | 
				
			||||||
 | 
					    <g transform="matrix(1,0,0,1,-20,-40)">
 | 
				
			||||||
 | 
					        <g id="icon_context_fave_on" transform="matrix(0.600982,0,0,0.600982,20,40)">
 | 
				
			||||||
 | 
					            <g transform="matrix(1.66394,0,0,1.66394,-14.9755,2.71716)">
 | 
				
			||||||
 | 
					                <g transform="matrix(1,0,0,1,10.0123,0)">
 | 
				
			||||||
 | 
					                    <clipPath id="_clip1">
 | 
				
			||||||
 | 
					                        <rect x="-1" y="-1" width="15" height="15"/>
 | 
				
			||||||
 | 
					                    </clipPath>
 | 
				
			||||||
 | 
					                    <g clip-path="url(#_clip1)">
 | 
				
			||||||
 | 
					                        <g transform="matrix(0.575972,0,0,0.576771,2.73925,2.16505)">
 | 
				
			||||||
 | 
					                            <rect x="-6" y="-6" width="25" height="25" style="fill:rgb(216,216,216);fill-opacity:0;fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                        </g>
 | 
				
			||||||
 | 
					                        <clipPath id="_clip2">
 | 
				
			||||||
 | 
					                            <path d="M6.5,9.75L2.679,11.759L3.409,7.504L0.318,4.491L4.59,3.871L6.5,0L8.41,3.871L12.682,4.491L9.591,7.504L10.321,11.759L6.5,9.75Z"/>
 | 
				
			||||||
 | 
					                        </clipPath>
 | 
				
			||||||
 | 
					                        <g clip-path="url(#_clip2)">
 | 
				
			||||||
 | 
					                            <path d="M-0.682,-1L13.682,-1L13.682,12.759L-0.682,12.759L-0.682,-1Z" style="fill:rgb(74,74,74);fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                        </g>
 | 
				
			||||||
 | 
					                    </g>
 | 
				
			||||||
 | 
					                </g>
 | 
				
			||||||
 | 
					                <g transform="matrix(1,0,0,1,10.0123,0)">
 | 
				
			||||||
 | 
					                    <path d="M6.572,-0.495C6.614,-0.486 6.625,-0.486 6.666,-0.472C6.793,-0.427 6.884,-0.337 6.948,-0.221L8.742,3.414L12.754,3.997L12.801,4.006C12.88,4.029 12.951,4.062 13.013,4.117C13.161,4.248 13.218,4.459 13.157,4.646C13.132,4.725 13.087,4.789 13.031,4.849L10.128,7.679L10.813,11.674L10.819,11.722C10.821,11.804 10.812,11.882 10.779,11.958C10.7,12.139 10.517,12.259 10.32,12.259C10.237,12.259 10.162,12.236 10.088,12.201L6.5,10.315L2.912,12.201L2.868,12.222C2.791,12.249 2.714,12.264 2.631,12.256C2.435,12.237 2.265,12.1 2.204,11.913C2.178,11.834 2.177,11.756 2.187,11.674L2.872,7.679L-0.031,4.849L-0.064,4.814C-0.114,4.749 -0.152,4.681 -0.17,4.599C-0.213,4.407 -0.135,4.202 0.024,4.087C0.092,4.038 0.166,4.012 0.246,3.997L4.258,3.414L6.052,-0.221L6.075,-0.264C6.15,-0.372 6.25,-0.453 6.38,-0.485C6.422,-0.496 6.433,-0.495 6.476,-0.499C6.524,-0.499 6.524,-0.499 6.572,-0.495ZM5.038,4.092C5.017,4.13 5.013,4.14 4.987,4.174C4.928,4.251 4.847,4.31 4.755,4.342C4.715,4.357 4.704,4.357 4.662,4.365L1.393,4.841L3.758,7.146L3.791,7.182C3.861,7.273 3.906,7.375 3.909,7.492C3.91,7.536 3.907,7.546 3.902,7.589L3.343,10.845L6.267,9.307L6.311,9.287C6.42,9.249 6.531,9.237 6.643,9.271C6.684,9.283 6.694,9.289 6.733,9.307L9.657,10.845L9.098,7.589L9.092,7.541C9.091,7.498 9.089,7.487 9.095,7.444C9.109,7.328 9.163,7.231 9.242,7.146L11.607,4.841L8.338,4.365L8.291,4.356C8.18,4.323 8.084,4.267 8.013,4.174C7.987,4.14 7.983,4.13 7.962,4.092L6.5,1.13C6.013,2.117 5.525,3.105 5.038,4.092Z" style="fill:rgb(74,74,74);fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                </g>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 3.2 KiB  | 
							
								
								
									
										11
									
								
								src/skins/vector/img/icon_context_low.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
 | 
				
			||||||
 | 
					    <g transform="matrix(1,0,0,1,-0,-60)">
 | 
				
			||||||
 | 
					        <g id="icon_context_fave" transform="matrix(0.600982,0,0,0.600982,0,60)">
 | 
				
			||||||
 | 
					            <g transform="matrix(1.66394,0,0,1.66394,1.66394,1.96327)">
 | 
				
			||||||
 | 
					                <path d="M8.737,0.502C8.882,0.514 9.02,0.542 9.155,0.598C9.544,0.759 9.832,1.105 9.958,1.503C10.008,1.664 10.03,1.829 10.033,1.998L10.033,6.5C10.63,6.5 11.226,6.491 11.822,6.501C11.882,6.504 11.882,6.504 11.942,6.51C12.067,6.527 12.188,6.556 12.301,6.614C12.494,6.715 12.636,6.904 12.665,7.122C12.682,7.246 12.662,7.376 12.613,7.492C12.541,7.662 12.419,7.799 12.282,7.921C10.713,9.244 9.104,10.519 7.515,11.818C7.423,11.889 7.328,11.952 7.223,12.003C6.836,12.19 6.376,12.215 5.969,12.079C5.814,12.028 5.673,11.951 5.539,11.857C3.901,10.585 2.306,9.258 0.72,7.921C0.583,7.798 0.46,7.66 0.389,7.488C0.284,7.235 0.332,6.938 0.528,6.743C0.596,6.676 0.678,6.622 0.766,6.585C0.915,6.521 1.077,6.503 1.238,6.5L2.967,6.5L2.967,1.998C2.968,1.927 2.968,1.928 2.973,1.858C2.991,1.692 3.025,1.532 3.088,1.378C3.229,1.035 3.495,0.744 3.84,0.6C3.975,0.543 4.116,0.515 4.262,0.502C5.753,0.459 7.246,0.46 8.737,0.502ZM4.343,1.5C4.313,1.501 4.285,1.503 4.256,1.511C4.096,1.559 4.003,1.732 3.977,1.886C3.972,1.915 3.969,1.944 3.967,1.973C3.932,3.648 3.967,5.324 3.967,7C3.964,7.063 3.956,7.122 3.933,7.181C3.877,7.326 3.753,7.438 3.603,7.481C3.558,7.494 3.514,7.498 3.467,7.5L1.784,7.5C3.234,8.685 4.656,9.904 6.134,11.053C6.16,11.071 6.187,11.087 6.215,11.102C6.433,11.202 6.7,11.184 6.892,11.035L11.219,7.5L9.533,7.5L9.487,7.498C9.441,7.491 9.397,7.483 9.353,7.466C9.223,7.416 9.118,7.311 9.067,7.181C9.05,7.137 9.042,7.093 9.035,7.046C8.957,5.357 9.069,3.663 9.033,1.972C9.021,1.793 8.941,1.581 8.757,1.516C8.732,1.507 8.707,1.503 8.68,1.501C7.235,1.46 5.789,1.5 4.343,1.5Z" style="fill:rgb(206,206,206);fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										30
									
								
								src/skins/vector/img/icon_context_low_on.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
 | 
				
			||||||
 | 
					    <g transform="matrix(1,0,0,1,-20,-60)">
 | 
				
			||||||
 | 
					        <g id="icon_context_fave_on" transform="matrix(0.600982,0,0,0.600982,20,60)">
 | 
				
			||||||
 | 
					            <clipPath id="_clip1">
 | 
				
			||||||
 | 
					                <rect x="0" y="0" width="25" height="25"/>
 | 
				
			||||||
 | 
					            </clipPath>
 | 
				
			||||||
 | 
					            <g clip-path="url(#_clip1)">
 | 
				
			||||||
 | 
					                <g transform="matrix(1.66394,0,0,1.66394,1.68116,1.96327)">
 | 
				
			||||||
 | 
					                    <clipPath id="_clip2">
 | 
				
			||||||
 | 
					                        <rect x="-1" y="-1" width="15" height="15"/>
 | 
				
			||||||
 | 
					                    </clipPath>
 | 
				
			||||||
 | 
					                    <g clip-path="url(#_clip2)">
 | 
				
			||||||
 | 
					                        <rect x="-6" y="-6" width="25" height="25" style="fill:rgb(74,74,74);fill-opacity:0;fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                        <clipPath id="_clip3">
 | 
				
			||||||
 | 
					                            <path d="M11.76,7C12.241,7 12.307,7.257 11.919,7.574L7.204,11.426C6.813,11.745 6.187,11.743 5.8,11.426L1.084,7.574C0.694,7.255 0.767,7 1.243,7L3.467,7L3.467,2.003C3.467,1.449 3.846,1 4.336,1L8.664,1C9.144,1 9.533,1.438 9.533,2.003L9.533,7L11.76,7Z"/>
 | 
				
			||||||
 | 
					                        </clipPath>
 | 
				
			||||||
 | 
					                        <g clip-path="url(#_clip3)">
 | 
				
			||||||
 | 
					                            <rect x="-4.167" y="-4" width="21.338" height="20.665" style="fill:rgb(74,74,74);fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                        </g>
 | 
				
			||||||
 | 
					                    </g>
 | 
				
			||||||
 | 
					                </g>
 | 
				
			||||||
 | 
					                <g transform="matrix(1.66394,0,0,1.66394,1.68116,1.96327)">
 | 
				
			||||||
 | 
					                    <path d="M8.737,0.502C8.882,0.514 9.02,0.542 9.155,0.598C9.544,0.759 9.832,1.105 9.958,1.503C10.008,1.664 10.03,1.829 10.033,1.998L10.033,6.5C10.63,6.5 11.226,6.491 11.822,6.501C11.882,6.504 11.882,6.504 11.942,6.51C12.067,6.527 12.188,6.556 12.301,6.614C12.494,6.715 12.636,6.904 12.665,7.122C12.682,7.246 12.662,7.376 12.613,7.492C12.541,7.662 12.419,7.799 12.282,7.921C10.713,9.244 9.104,10.519 7.515,11.818C7.423,11.889 7.328,11.952 7.223,12.003C6.836,12.19 6.376,12.215 5.969,12.079C5.814,12.028 5.673,11.951 5.539,11.857C3.901,10.585 2.306,9.258 0.72,7.921C0.583,7.798 0.46,7.66 0.389,7.488C0.284,7.235 0.332,6.938 0.528,6.743C0.596,6.676 0.678,6.622 0.766,6.585C0.915,6.521 1.077,6.503 1.238,6.5L2.967,6.5L2.967,1.998C2.968,1.927 2.968,1.928 2.973,1.858C2.991,1.692 3.025,1.532 3.088,1.378C3.229,1.035 3.495,0.744 3.84,0.6C3.975,0.543 4.116,0.515 4.262,0.502C5.753,0.459 7.246,0.46 8.737,0.502ZM4.343,1.5C4.313,1.501 4.285,1.503 4.256,1.511C4.096,1.559 4.003,1.732 3.977,1.886C3.972,1.915 3.969,1.944 3.967,1.973C3.932,3.648 3.967,5.324 3.967,7C3.964,7.047 3.96,7.091 3.948,7.137C3.905,7.286 3.792,7.41 3.647,7.466C3.588,7.489 3.529,7.497 3.467,7.5L1.784,7.5C3.234,8.685 4.656,9.904 6.134,11.053C6.16,11.071 6.187,11.087 6.215,11.102C6.433,11.202 6.7,11.184 6.892,11.035L11.219,7.5L9.533,7.5L9.487,7.498C9.441,7.491 9.397,7.483 9.353,7.466C9.223,7.416 9.118,7.311 9.067,7.181C9.05,7.137 9.042,7.093 9.035,7.046C8.957,5.357 9.069,3.663 9.033,1.972C9.021,1.793 8.941,1.581 8.757,1.516C8.732,1.507 8.707,1.503 8.68,1.501C7.235,1.46 5.789,1.5 4.343,1.5Z" style="fill:rgb(74,74,74);fill-rule:nonzero;"/>
 | 
				
			||||||
 | 
					                </g>
 | 
				
			||||||
 | 
					            </g>
 | 
				
			||||||
 | 
					        </g>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 3.4 KiB  | 
							
								
								
									
										1
									
								
								src/skins/vector/img/icons_ellipsis.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><path d="M7.831,13.382c0.504,0 0.826,-0.378 0.826,-0.882c0,-0.518 -0.322,-0.882 -0.826,-0.882c-0.49,0 -0.826,0.364 -0.826,0.882c-0.014,0.504 0.336,0.882 0.826,0.882ZM12.493,13.382c0.504,0 0.84,-0.378 0.84,-0.882c-0.014,-0.518 -0.336,-0.882 -0.826,-0.882c-0.49,0 -0.84,0.364 -0.84,0.882c-0.014,0.504 0.336,0.882 0.826,0.882ZM17.155,13.382c0.518,0 0.84,-0.378 0.84,-0.882c0,-0.518 -0.336,-0.882 -0.826,-0.882c-0.49,0 -0.84,0.364 -0.84,0.882c0,0.504 0.336,0.882 0.826,0.882Z" style="fill:#fff;"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 910 B  |