From f8e00e43e3613f6c71bb6da024a9cf75b6288337 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 9 Jan 2018 15:59:04 +0000 Subject: [PATCH 01/28] Show / hide sitckers icons --- src/skins/vector/img/icons-hide-stickers.svg | 16 ++++++++++++++++ src/skins/vector/img/icons-show-stickers.svg | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/skins/vector/img/icons-hide-stickers.svg create mode 100644 src/skins/vector/img/icons-show-stickers.svg diff --git a/src/skins/vector/img/icons-hide-stickers.svg b/src/skins/vector/img/icons-hide-stickers.svg new file mode 100644 index 0000000000..54178f8d26 --- /dev/null +++ b/src/skins/vector/img/icons-hide-stickers.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> +<g id="Layer_1_1_"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.429,250-250S388.571,0,250,0S0,111.429,0,250 + S111.429,500,250,500z"/> +</g> +<path fill="#FFFFFF" d="M249,42C133.563,42,41,135.6,41,250c0,114.4,92.563,208,208,208c115.438,0,208-93.6,208-208 + C457,135.6,363.401,42,249,42z M249,416.4c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4 + c91.517,0,166.404,74.882,166.404,166.4C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2 + s-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2 + c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z + M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919C159.564,334.236,200.117,364.4,249,364.4z"/> +</svg> diff --git a/src/skins/vector/img/icons-show-stickers.svg b/src/skins/vector/img/icons-show-stickers.svg new file mode 100644 index 0000000000..00e70f8cf7 --- /dev/null +++ b/src/skins/vector/img/icons-show-stickers.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> +<g id="Layer_1_1_" opacity="0.15"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.429,250-250S388.571,0,250,0S0,111.429,0,250 + S111.429,500,250,500z"/> +</g> +<path fill="#76CFA6" d="M249,42C133.563,42,41,135.6,41,250c0,114.4,92.563,208,208,208c115.438,0,208-93.6,208-208 + C457,135.6,363.401,42,249,42z M249,416.4c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4 + c91.517,0,166.404,74.882,166.404,166.4C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2 + s-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2 + c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z + M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919C159.564,334.236,200.117,364.4,249,364.4z"/> +</svg> From fa1059e2024430bcbee0e81c10797e0c40921599 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 9 Jan 2018 15:59:28 +0000 Subject: [PATCH 02/28] Show / hide stickers icon styling --- .../css/matrix-react-sdk/views/rooms/_MessageComposer.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index e6b1a1f0d0..41fd3062d6 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -154,7 +154,8 @@ limitations under the License. .mx_MessageComposer_hangup, .mx_MessageComposer_voicecall, .mx_MessageComposer_videocall, -.mx_MessageComposer_apps { +.mx_MessageComposer_apps, +.mx_MessageComposer_stickers { /*display: table-cell;*/ /*vertical-align: middle;*/ /*padding-left: 10px;*/ @@ -167,7 +168,8 @@ limitations under the License. .mx_MessageComposer_hangup object, .mx_MessageComposer_voicecall object, .mx_MessageComposer_videocall object, -.mx_MessageComposer_apps object { +.mx_MessageComposer_apps object, +.mx_MessageComposer_stickers object { pointer-events: none; } From 409bb5ff4d448a3ae8eeedb06aea7ba10984fe2d Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 9 Jan 2018 16:01:33 +0000 Subject: [PATCH 03/28] Improved icons. --- src/skins/vector/img/icons-hide-stickers.svg | 12 ++++++------ src/skins/vector/img/icons-show-stickers.svg | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/skins/vector/img/icons-hide-stickers.svg b/src/skins/vector/img/icons-hide-stickers.svg index 54178f8d26..c138f34bda 100644 --- a/src/skins/vector/img/icons-hide-stickers.svg +++ b/src/skins/vector/img/icons-hide-stickers.svg @@ -7,10 +7,10 @@ <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.429,250-250S388.571,0,250,0S0,111.429,0,250 S111.429,500,250,500z"/> </g> -<path fill="#FFFFFF" d="M249,42C133.563,42,41,135.6,41,250c0,114.4,92.563,208,208,208c115.438,0,208-93.6,208-208 - C457,135.6,363.401,42,249,42z M249,416.4c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4 - c91.517,0,166.404,74.882,166.404,166.4C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2 - s-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2 - c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z - M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919C159.564,334.236,200.117,364.4,249,364.4z"/> +<path fill="#FFFFFF" d="M249,60C143.553,60,59,145.5,59,250s84.553,190,190,190s190-85.5,190-190S353.501,60,249,60z M249,416.4 + c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4c91.517,0,166.404,74.882,166.404,166.4 + C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2s-13.519-31.2-31.201-31.2 + c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2 + c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919 + C159.564,334.236,200.117,364.4,249,364.4z"/> </svg> diff --git a/src/skins/vector/img/icons-show-stickers.svg b/src/skins/vector/img/icons-show-stickers.svg index 00e70f8cf7..300e2c6d5b 100644 --- a/src/skins/vector/img/icons-show-stickers.svg +++ b/src/skins/vector/img/icons-show-stickers.svg @@ -7,10 +7,10 @@ <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.429,250-250S388.571,0,250,0S0,111.429,0,250 S111.429,500,250,500z"/> </g> -<path fill="#76CFA6" d="M249,42C133.563,42,41,135.6,41,250c0,114.4,92.563,208,208,208c115.438,0,208-93.6,208-208 - C457,135.6,363.401,42,249,42z M249,416.4c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4 - c91.517,0,166.404,74.882,166.404,166.4C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2 - s-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2 - c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z - M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919C159.564,334.236,200.117,364.4,249,364.4z"/> +<path fill="#76CFA6" d="M249,60C143.553,60,59,145.5,59,250s84.553,190,190,190c105.448,0,190-85.5,190-190S353.501,60,249,60z + M249,416.4c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4c91.517,0,166.404,74.882,166.404,166.4 + C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2s-13.519-31.2-31.201-31.2 + c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2 + c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919 + C159.564,334.236,200.117,364.4,249,364.4z"/> </svg> From 50271b71237eaabc81560f34892d433ff18cdbac Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 10 Jan 2018 20:48:22 +0000 Subject: [PATCH 04/28] Remove padding on last component of MessageComposer (sticker toggle icons) --- .../css/matrix-react-sdk/views/rooms/_MessageComposer.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index 41fd3062d6..9e46c56381 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -34,6 +34,10 @@ limitations under the License. width: 100%; } +.mx_MessageComposer_row div:last-child{ + padding-right: 0; +} + .mx_MessageComposer .mx_MessageComposer_avatar { padding-left: 10px; padding-right: 28px; From a24c3ada53f57282469070d21e484c718f9623d0 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Fri, 12 Jan 2018 17:36:09 +0000 Subject: [PATCH 05/28] Sticker styling --- .../views/rooms/_MessageComposer.scss | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index 9e46c56381..462de6f4df 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -240,3 +240,18 @@ limitations under the License. height: 50px; } } + +.mx_PopoverOuterContainer { + border-radius: 5px; + padding: 2px; +} + +.mx_PopoverOuterContainer .mx_AppTileFullWidth { + margin-top: 0 !important; + border: none; +} + +.mx_PopoverOuterContainer .mx_StickersContent { + border-radius: 5px; + overflow: hidden; +} From 7924a149b47986aba69615d92c53d53bb5366c61 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Mon, 15 Jan 2018 11:14:30 +0000 Subject: [PATCH 06/28] Remove transparent background and fix z-index of popover. --- .../css/matrix-react-sdk/views/rooms/_MessageComposer.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index 462de6f4df..ae8a1b87f6 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -244,6 +244,8 @@ limitations under the License. .mx_PopoverOuterContainer { border-radius: 5px; padding: 2px; + background-color: white; + overflow: 'hidden'; } .mx_PopoverOuterContainer .mx_AppTileFullWidth { @@ -255,3 +257,8 @@ limitations under the License. border-radius: 5px; overflow: hidden; } + +// Set z-index for popovers +.another-react-popover-container { + z-index: 1000; +} From a7f0b11002b97177a9191af8d556afbdf6731eda Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 16 Jan 2018 18:15:17 +0000 Subject: [PATCH 07/28] Add generic element context menu / popover. --- .../GenericElementContextMenu.js | 30 +++++++++++++++++++ .../views/rooms/_MessageComposer.scss | 10 +++++-- 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/components/views/context_menus/GenericElementContextMenu.js diff --git a/src/components/views/context_menus/GenericElementContextMenu.js b/src/components/views/context_menus/GenericElementContextMenu.js new file mode 100644 index 0000000000..2959fbbe7d --- /dev/null +++ b/src/components/views/context_menus/GenericElementContextMenu.js @@ -0,0 +1,30 @@ +/* +Copyright 2017 New Vector 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'; + +import React from 'react'; +import PropTypes from 'prop-types'; + +export default class GenericElementContextMenu extends React.Component { + static PropTypes = { + element: PropTypes.element.isRequired, + }; + + render() { + return <div>{ this.props.element }</div>; + } +} diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index ae8a1b87f6..5a044297a9 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -258,7 +258,11 @@ limitations under the License. overflow: hidden; } -// Set z-index for popovers -.another-react-popover-container { - z-index: 1000; +.mx_StickersContentPlaceholder { + display: flex; + flex-grow: 1; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; } From f8643e9a96c9b16b7ba755d424f91c5bc9c7df87 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 16 Jan 2018 18:35:04 +0000 Subject: [PATCH 08/28] Add styling and image for stickerpack placeholder. --- .../views/rooms/_MessageComposer.scss | 4 ++++ .../vector/img/stickerpack-placeholder.png | Bin 0 -> 31995 bytes 2 files changed, 4 insertions(+) create mode 100644 src/skins/vector/img/stickerpack-placeholder.png diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index 5a044297a9..e6fbeb9e87 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -266,3 +266,7 @@ limitations under the License. justify-content: center; text-align: center; } + +.mx_StickersContentPlaceholder p { + max-width: 200px; +} diff --git a/src/skins/vector/img/stickerpack-placeholder.png b/src/skins/vector/img/stickerpack-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..7980114438527db8e140b9ff0bcd80a7fd8282f2 GIT binary patch literal 31995 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�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 literal 0 HcmV?d00001 From 56ae96fc752ae8098ac4588f962fa4c000608720 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 16 Jan 2018 21:46:50 +0000 Subject: [PATCH 09/28] Sticker content styling --- .../views/rooms/_MessageComposer.scss | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index e6fbeb9e87..1f1a652f1e 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -241,23 +241,14 @@ limitations under the License. } } -.mx_PopoverOuterContainer { - border-radius: 5px; - padding: 2px; - background-color: white; - overflow: 'hidden'; -} - -.mx_PopoverOuterContainer .mx_AppTileFullWidth { - margin-top: 0 !important; - border: none; -} - -.mx_PopoverOuterContainer .mx_StickersContent { - border-radius: 5px; +.mx_StickersContent { overflow: hidden; } +.mx_StickersContent .mx_AppTileFullWidth { + border: none; +} + .mx_StickersContentPlaceholder { display: flex; flex-grow: 1; From f4816b99ffa0d21992470379678509b0274bc47d Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 17 Jan 2018 00:05:16 +0000 Subject: [PATCH 10/28] Add stickerpack manage integration link styling. --- .../css/matrix-react-sdk/views/rooms/_MessageComposer.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index 1f1a652f1e..6037a41fc9 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -261,3 +261,9 @@ limitations under the License. .mx_StickersContentPlaceholder p { max-width: 200px; } + +.mx_Stickerpack_addLink { + display: inline; + cursor: pointer; + text-decoration: underline; +} From 854b5376954eea9a72f098d996e105890cdf4937 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 17 Jan 2018 11:27:57 +0000 Subject: [PATCH 11/28] Update sticker toggle icons. --- src/skins/vector/img/icons-hide-stickers.svg | 18 +++++++++--------- src/skins/vector/img/icons-show-stickers.svg | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/skins/vector/img/icons-hide-stickers.svg b/src/skins/vector/img/icons-hide-stickers.svg index c138f34bda..9b88ba5e64 100644 --- a/src/skins/vector/img/icons-hide-stickers.svg +++ b/src/skins/vector/img/icons-hide-stickers.svg @@ -3,14 +3,14 @@ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> -<g id="Layer_1_1_"> - <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.429,250-250S388.571,0,250,0S0,111.429,0,250 - S111.429,500,250,500z"/> +<g id="Layer_1_1_" opacity="0.6"> + <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.43,250-250C500,111.429,388.571,0,250,0 + C111.429,0,0,111.429,0,250C0,388.57,111.429,500,250,500z"/> </g> -<path fill="#FFFFFF" d="M249,60C143.553,60,59,145.5,59,250s84.553,190,190,190s190-85.5,190-190S353.501,60,249,60z M249,416.4 - c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4c91.517,0,166.404,74.882,166.404,166.4 - C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2s-13.519-31.2-31.201-31.2 - c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2 - c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919 - C159.564,334.236,200.117,364.4,249,364.4z"/> +<path fill="none" stroke="#FFFFFF" stroke-width="12" stroke-miterlimit="10" d="M250,430c-98.996,0-180-81.003-180-180 + c0-98.998,81.005-180,180-180c98.994,0,180,81.002,180,180C430,348.997,348.995,430,250,430z M322.8,229.2 + c17.685,0,31.201-13.519,31.201-31.2c0-17.683-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2 + C291.6,215.682,305.118,229.2,322.8,229.2z M177.2,229.2c17.682,0,31.2-13.519,31.2-31.2c0-17.683-13.519-31.2-31.2-31.2 + c-17.683,0-31.201,13.518-31.201,31.2C145.999,215.682,159.518,229.2,177.2,229.2z M250,364.4 + c48.883,0,89.436-30.164,106.081-72.801H143.919C160.564,334.236,201.117,364.4,250,364.4z"/> </svg> diff --git a/src/skins/vector/img/icons-show-stickers.svg b/src/skins/vector/img/icons-show-stickers.svg index 300e2c6d5b..26779a3940 100644 --- a/src/skins/vector/img/icons-show-stickers.svg +++ b/src/skins/vector/img/icons-show-stickers.svg @@ -4,13 +4,13 @@ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> <g id="Layer_1_1_" opacity="0.15"> - <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.429,250-250S388.571,0,250,0S0,111.429,0,250 - S111.429,500,250,500z"/> + <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.43,250-250C500,111.429,388.571,0,250,0 + C111.429,0,0,111.429,0,250C0,388.57,111.429,500,250,500z"/> </g> -<path fill="#76CFA6" d="M249,60C143.553,60,59,145.5,59,250s84.553,190,190,190c105.448,0,190-85.5,190-190S353.501,60,249,60z - M249,416.4c-91.518,0-166.404-74.883-166.404-166.4c0-91.518,74.887-166.4,166.404-166.4c91.517,0,166.404,74.882,166.404,166.4 - C415.404,341.518,340.518,416.4,249,416.4z M321.8,229.2c17.684,0,31.201-13.518,31.201-31.2s-13.519-31.2-31.201-31.2 - c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z M176.2,229.2c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2 - c-17.683,0-31.201,13.518-31.201,31.2S158.518,229.2,176.2,229.2z M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919 - C159.564,334.236,200.117,364.4,249,364.4z"/> +<path fill="none" stroke="#76CFA6" stroke-width="12" stroke-miterlimit="10" d="M249,430c-98.996,0-180-81.003-180-180 + c0-98.998,81.005-180,180-180c98.994,0,180,81.001,180,180C429,348.997,347.995,430,249,430z M321.8,229.2 + c17.685,0,31.201-13.518,31.201-31.2s-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S304.118,229.2,321.8,229.2z + M176.2,229.2c17.682,0,31.2-13.518,31.2-31.2s-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2 + S158.518,229.2,176.2,229.2z M249,364.4c48.883,0,89.436-30.164,106.081-72.801H142.919C159.564,334.236,200.117,364.4,249,364.4z" + /> </svg> From de597d4f5d95247e6c0df6b32d50ae9cb3ccf2ba Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 17 Jan 2018 15:13:29 +0000 Subject: [PATCH 12/28] Make background lighter. --- src/skins/vector/img/icons-hide-stickers.svg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/skins/vector/img/icons-hide-stickers.svg b/src/skins/vector/img/icons-hide-stickers.svg index 9b88ba5e64..f28e8646e6 100644 --- a/src/skins/vector/img/icons-hide-stickers.svg +++ b/src/skins/vector/img/icons-hide-stickers.svg @@ -3,14 +3,14 @@ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> -<g id="Layer_1_1_" opacity="0.6"> +<g id="Layer_1_1_" opacity="0.4"> <path id="Oval-109-Copy" fill="#76CFA6" d="M250,500c138.571,0,250-111.43,250-250C500,111.429,388.571,0,250,0 C111.429,0,0,111.429,0,250C0,388.57,111.429,500,250,500z"/> </g> <path fill="none" stroke="#FFFFFF" stroke-width="12" stroke-miterlimit="10" d="M250,430c-98.996,0-180-81.003-180-180 c0-98.998,81.005-180,180-180c98.994,0,180,81.002,180,180C430,348.997,348.995,430,250,430z M322.8,229.2 - c17.685,0,31.201-13.519,31.201-31.2c0-17.683-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2 - C291.6,215.682,305.118,229.2,322.8,229.2z M177.2,229.2c17.682,0,31.2-13.519,31.2-31.2c0-17.683-13.519-31.2-31.2-31.2 - c-17.683,0-31.201,13.518-31.201,31.2C145.999,215.682,159.518,229.2,177.2,229.2z M250,364.4 - c48.883,0,89.436-30.164,106.081-72.801H143.919C160.564,334.236,201.117,364.4,250,364.4z"/> + c17.686,0,31.201-13.519,31.201-31.2c0-17.683-13.519-31.2-31.201-31.2c-17.682,0-31.2,13.518-31.2,31.2S305.118,229.2,322.8,229.2z + M177.2,229.2c17.682,0,31.2-13.519,31.2-31.2c0-17.683-13.519-31.2-31.2-31.2c-17.683,0-31.201,13.518-31.201,31.2 + S159.518,229.2,177.2,229.2z M250,364.4c48.883,0,89.436-30.164,106.081-72.801H143.919C160.564,334.236,201.117,364.4,250,364.4z" + /> </svg> From c340032bd19a50a3f160296e2e5321a084a389fb Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 17 Jan 2018 15:49:03 +0000 Subject: [PATCH 13/28] Move sticker related CSS to its own file. --- src/skins/vector/css/_components.scss | 1 + .../views/rooms/_MessageComposer.scss | 27 ----------------- .../views/rooms/_Stickers.scss | 30 +++++++++++++++++++ 3 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 src/skins/vector/css/matrix-react-sdk/views/rooms/_Stickers.scss diff --git a/src/skins/vector/css/_components.scss b/src/skins/vector/css/_components.scss index 0dd6a1b1b7..5b04703a27 100644 --- a/src/skins/vector/css/_components.scss +++ b/src/skins/vector/css/_components.scss @@ -60,6 +60,7 @@ @import "./matrix-react-sdk/views/rooms/_MemberInfo.scss"; @import "./matrix-react-sdk/views/rooms/_MemberList.scss"; @import "./matrix-react-sdk/views/rooms/_MessageComposer.scss"; +@import "./matrix-react-sdk/views/rooms/_Stickers.scss"; @import "./matrix-react-sdk/views/rooms/_PinnedEventTile.scss"; @import "./matrix-react-sdk/views/rooms/_PinnedEventsPanel.scss"; @import "./matrix-react-sdk/views/rooms/_PresenceLabel.scss"; diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss index 6037a41fc9..9e46c56381 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_MessageComposer.scss @@ -240,30 +240,3 @@ limitations under the License. height: 50px; } } - -.mx_StickersContent { - overflow: hidden; -} - -.mx_StickersContent .mx_AppTileFullWidth { - border: none; -} - -.mx_StickersContentPlaceholder { - display: flex; - flex-grow: 1; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; -} - -.mx_StickersContentPlaceholder p { - max-width: 200px; -} - -.mx_Stickerpack_addLink { - display: inline; - cursor: pointer; - text-decoration: underline; -} diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_Stickers.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_Stickers.scss new file mode 100644 index 0000000000..ee6c38b24d --- /dev/null +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_Stickers.scss @@ -0,0 +1,30 @@ +.mx_Stickers_content { + overflow: hidden; +} + +.mx_Stickers_content .mx_AppTileFullWidth { + border: none; +} + +.mx_Stickers_contentPlaceholder { + display: flex; + flex-grow: 1; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; +} + +.mx_Stickers_contentPlaceholder p { + max-width: 200px; +} + +.mx_Stickers_addLink { + display: inline; + cursor: pointer; + text-decoration: underline; +} + +.mx_Stickers_hideStickers { + z-index: 2001; +} From 738b59fd42e27f8290de878c360f98ab95c304e3 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Thu, 18 Jan 2018 12:01:29 +0000 Subject: [PATCH 14/28] Call for update on window resize. --- .../context_menus/GenericElementContextMenu.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/components/views/context_menus/GenericElementContextMenu.js b/src/components/views/context_menus/GenericElementContextMenu.js index 2959fbbe7d..0a8d269293 100644 --- a/src/components/views/context_menus/GenericElementContextMenu.js +++ b/src/components/views/context_menus/GenericElementContextMenu.js @@ -24,6 +24,21 @@ export default class GenericElementContextMenu extends React.Component { element: PropTypes.element.isRequired, }; + componentDidMount() { + this.resize = this.resize.bind(this); + window.addEventListener("resize", this.resize.bind(this)); + } + + componentWillUnmount() { + window.removeEventListener("resize", this.resize.bind(this)); + } + + resize() { + if (this.props.onResize) { + this.props.onResize(); + } + } + render() { return <div>{ this.props.element }</div>; } From 095130a569792c61d7dac2b78f408e01c544e321 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Fri, 9 Feb 2018 13:23:56 +0000 Subject: [PATCH 15/28] Hide apps drawer --- .../vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss index 2d61ca7743..b6d267b43b 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss @@ -18,6 +18,10 @@ limitations under the License. margin: 5px; } +.mx_AppsDrawer_hidden { + display: none; +} + .mx_AppsContainer { display: flex; flex-direction: row; From 9fc7435ea2ef7af161fadf4b3f9abc4a4aadcb73 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Tue, 6 Mar 2018 10:47:53 +0000 Subject: [PATCH 16/28] Correctly position tooltips relative to parent element. --- src/components/views/rooms/RoomTooltip.js | 2 +- .../views/messages/_MImageBody.scss | 17 ++++++++--------- .../vector-web/views/rooms/_RoomTooltip.scss | 3 ++- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js index 714d57ca24..518ceacc4c 100644 --- a/src/components/views/rooms/RoomTooltip.js +++ b/src/components/views/rooms/RoomTooltip.js @@ -66,7 +66,7 @@ module.exports = React.createClass({ // positioned, also taking into account any window zoom // NOTE: The additional 6 pixels for the left position, is to take account of the // tooltips chevron - var parent = ReactDOM.findDOMNode(this); + var parent = ReactDOM.findDOMNode(this).parentNode; var style = {}; style.top = parent.getBoundingClientRect().top + window.pageYOffset; style.left = 6 + parent.getBoundingClientRect().right + window.pageXOffset; diff --git a/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss b/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss index 1702aac8ad..9d26cacbff 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss @@ -15,15 +15,14 @@ limitations under the License. */ .mx_MImageBody { - display: block; - margin-right: 34px; + display: block; + margin-right: 34px; } -.mx_MImageBody_thumbnail { - max-width: 100%; -/* - background-color: $primary-bg-color; - border: 2px solid $primary-bg-color; - border-radius: 1px; -*/ +.mx_MImageBody_thumbnail_container { + display: inline-block; +} + +img.mx_MImageBody_thumbnail { + max-width: 100%; } diff --git a/src/skins/vector/css/vector-web/views/rooms/_RoomTooltip.scss b/src/skins/vector/css/vector-web/views/rooms/_RoomTooltip.scss index 5469a9e6d3..9988425b8f 100644 --- a/src/skins/vector/css/vector-web/views/rooms/_RoomTooltip.scss +++ b/src/skins/vector/css/vector-web/views/rooms/_RoomTooltip.scss @@ -49,5 +49,6 @@ limitations under the License. line-height: 14px; font-size: 13px; color: $primary-fg-color; + max-width: 600px; + margin-right: 50px; } - From d77ab891a0b10156399711947bb319ad4ff0b2ed Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Tue, 6 Mar 2018 11:25:15 +0000 Subject: [PATCH 17/28] Update tooltip position on scroll. --- src/components/views/rooms/RoomTooltip.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js index 518ceacc4c..a902045f07 100644 --- a/src/components/views/rooms/RoomTooltip.js +++ b/src/components/views/rooms/RoomTooltip.js @@ -39,6 +39,7 @@ module.exports = React.createClass({ this.tooltipContainer = document.createElement("div"); this.tooltipContainer.className = "mx_RoomTileTooltip_wrapper"; document.body.appendChild(this.tooltipContainer); + window.addEventListener('scroll', this._renderTooltip, true); this._renderTooltip(); }, @@ -57,6 +58,7 @@ module.exports = React.createClass({ ReactDOM.unmountComponentAtNode(this.tooltipContainer); document.body.removeChild(this.tooltipContainer); + window.removeEventListener('scroll', this._renderTooltip, true); }, _renderTooltip: function() { From 78ae1ada3c3b62c8a42f42c66610fe0fb9c08e19 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Tue, 6 Mar 2018 14:21:31 +0000 Subject: [PATCH 18/28] Fix tooltip vertical positioning. --- src/components/views/rooms/RoomTooltip.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js index a902045f07..034f80ecee 100644 --- a/src/components/views/rooms/RoomTooltip.js +++ b/src/components/views/rooms/RoomTooltip.js @@ -21,6 +21,8 @@ var ReactDOM = require('react-dom'); var dis = require('matrix-react-sdk/lib/dispatcher'); import classNames from 'classnames'; +const MIN_TOOLTIP_HEIGHT = 25; + module.exports = React.createClass({ displayName: 'RoomTooltip', @@ -41,6 +43,12 @@ module.exports = React.createClass({ document.body.appendChild(this.tooltipContainer); window.addEventListener('scroll', this._renderTooltip, true); + const parent = ReactDOM.findDOMNode(this).parentNode; + this.state={ + parent, + parentBox: parent.getBoundingClientRect(), + }; + this._renderTooltip(); }, @@ -61,6 +69,17 @@ module.exports = React.createClass({ window.removeEventListener('scroll', this._renderTooltip, true); }, + _updatePosition(style) { + const parentBox = this.state.parent.getBoundingClientRect(); + let offset = 0; + if (parentBox.height > MIN_TOOLTIP_HEIGHT) { + offset = Math.floor((parentBox.height - MIN_TOOLTIP_HEIGHT) / 2); + } + style.top = (parentBox.top - 2) + window.pageYOffset + offset; + style.left = 6 + parentBox.right + window.pageXOffset; + return style; + }, + _renderTooltip: function() { var label = this.props.room ? this.props.room.name : this.props.label; @@ -70,8 +89,8 @@ module.exports = React.createClass({ // tooltips chevron var parent = ReactDOM.findDOMNode(this).parentNode; var style = {}; - style.top = parent.getBoundingClientRect().top + window.pageYOffset; - style.left = 6 + parent.getBoundingClientRect().right + window.pageXOffset; + console.warn('Bounding box', parent.getBoundingClientRect()); + style = this._updatePosition(style); style.display = "block"; const tooltipClasses = classNames( From 6785d75ad2117f752b35c592eaa25964520025bc Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Tue, 6 Mar 2018 14:46:40 +0000 Subject: [PATCH 19/28] Remove logging. --- src/components/views/rooms/RoomTooltip.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js index 034f80ecee..398c96b4de 100644 --- a/src/components/views/rooms/RoomTooltip.js +++ b/src/components/views/rooms/RoomTooltip.js @@ -89,7 +89,6 @@ module.exports = React.createClass({ // tooltips chevron var parent = ReactDOM.findDOMNode(this).parentNode; var style = {}; - console.warn('Bounding box', parent.getBoundingClientRect()); style = this._updatePosition(style); style.display = "block"; From fe3f0be920ed9ea1d329dba24506ff664935da91 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Wed, 7 Mar 2018 12:03:28 +0000 Subject: [PATCH 20/28] Ignore local config. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2ad05012a0..46d294ecf7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ electron/dist electron/pub **/.idea /config.json +/config.local*.json /src/component-index.js From 38efebb8d3946f321e6814cbd957afd042505538 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Thu, 8 Mar 2018 12:31:23 +0000 Subject: [PATCH 21/28] Split out sticker CSS --- src/skins/vector/css/_components.scss | 1 + .../views/messages/_MImageBody.scss | 8 ---- .../views/messages/_MStickerBody.scss | 48 +++++++++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss diff --git a/src/skins/vector/css/_components.scss b/src/skins/vector/css/_components.scss index 0ae5af1609..0bcc48c3b8 100644 --- a/src/skins/vector/css/_components.scss +++ b/src/skins/vector/css/_components.scss @@ -48,6 +48,7 @@ @import "./matrix-react-sdk/views/messages/_MEmoteBody.scss"; @import "./matrix-react-sdk/views/messages/_MFileBody.scss"; @import "./matrix-react-sdk/views/messages/_MImageBody.scss"; +@import "./matrix-react-sdk/views/messages/_MStickerBody.scss"; @import "./matrix-react-sdk/views/messages/_MNoticeBody.scss"; @import "./matrix-react-sdk/views/messages/_MTextBody.scss"; @import "./matrix-react-sdk/views/messages/_RoomAvatarEvent.scss"; diff --git a/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss b/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss index 9d26cacbff..bf483feda3 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/messages/_MImageBody.scss @@ -18,11 +18,3 @@ limitations under the License. display: block; margin-right: 34px; } - -.mx_MImageBody_thumbnail_container { - display: inline-block; -} - -img.mx_MImageBody_thumbnail { - max-width: 100%; -} diff --git a/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss b/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss new file mode 100644 index 0000000000..29b77f8846 --- /dev/null +++ b/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss @@ -0,0 +1,48 @@ +/* +Copyright 2018 New Vector 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_MStickerBody { + display: block; + margin-right: 34px; + min-height: 110px; +} + +.mx_MStickerBody_thumbnail_container { + display: inline-block; + position: relative; +} + +.mx_MStickerBody_thumbnail { + max-width: 100%; + transition: 500ms; + opacity: 0; +} + +.mx_MStickerBody_thumbnail_visible { + transition: 500ms; + opacity: 1; +} + +.mx_MStickerBody_placeholder { + position: absolute; + transition: 500ms; + opacity: 1; +} + +.mx_MStickerBody_placeholder_invisible { + transition: 500ms; + opacity: 0; +} From 351f9b32ea01dfd7f4417ea32829ec27ac527c90 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Thu, 8 Mar 2018 23:54:44 +0000 Subject: [PATCH 22/28] Remove broken transitions. --- .../css/matrix-react-sdk/views/messages/_MStickerBody.scss | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss b/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss index 29b77f8846..4d63376a47 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss @@ -18,6 +18,7 @@ limitations under the License. display: block; margin-right: 34px; min-height: 110px; + padding: 20px 0; } .mx_MStickerBody_thumbnail_container { @@ -27,18 +28,15 @@ limitations under the License. .mx_MStickerBody_thumbnail { max-width: 100%; - transition: 500ms; opacity: 0; } .mx_MStickerBody_thumbnail_visible { - transition: 500ms; opacity: 1; } .mx_MStickerBody_placeholder { position: absolute; - transition: 500ms; opacity: 1; } From d2f4bb2dd3322f8b778ddd65f7741553e1cd24eb Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Tue, 13 Mar 2018 10:49:55 +0000 Subject: [PATCH 23/28] Fix spinner position / height. --- .../matrix-react-sdk/views/rooms/_AppsDrawer.scss | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss index b6d267b43b..c464865bd7 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss @@ -58,6 +58,7 @@ limitations under the License. margin-right: 5px; border: 1px solid $primary-hairline-color; border-radius: 2px; + background-color: $dialog-background-bg-color; } .mx_AppTile:last-child { @@ -257,12 +258,21 @@ form.mx_Custom_Widget_Form div { } .mx_AppLoading { - min-height: 305px; display: flex; flex-direction: column; justify-content: center; align-items: center; font-weight: bold; + position: relative; + height: 280px; +} + +.mx_AppLoading .mx_Spinner { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; } .mx_AppLoading iframe { From 8d8580a21330926a5981c2d936b0e5e070952785 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Tue, 13 Mar 2018 10:57:43 +0000 Subject: [PATCH 24/28] Cleanup comments. Reduce default app tile height to 280px. --- .../css/matrix-react-sdk/views/rooms/_AppsDrawer.scss | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss index c464865bd7..e22207676f 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_AppsDrawer.scss @@ -72,8 +72,6 @@ limitations under the License. padding: 0; border: 1px solid $primary-hairline-color; border-radius: 2px; - // height: 350px; - // display: inline-block; } .mx_AppTile, .mx_AppTileFullWidth { @@ -108,7 +106,6 @@ limitations under the License. } .mx_AppTileMenuBarWidget { - // pointer-events: none; cursor: pointer; width: 10px; height: 10px; @@ -127,14 +124,14 @@ limitations under the License. } .mx_AppTileBody{ - height: 350px; + height: 280px; width: 100%; overflow: hidden; } .mx_AppTileBody iframe { width: 100%; - height: 350px; + height: 280px; overflow: hidden; border: none; padding: 0; @@ -142,9 +139,6 @@ limitations under the License. display: block; } -// .mx_CloseAppWidget { -// } - .mx_AppTileMenuBarWidgetPadding { margin-right: 5px; } From 85fca9dee8adf8c9380b008380fac0584b17f7f3 Mon Sep 17 00:00:00 2001 From: Richard Lewis <rick@matrix.org> Date: Wed, 14 Mar 2018 11:11:48 +0000 Subject: [PATCH 25/28] Style sticker content rather than thumbnail. --- .../css/matrix-react-sdk/views/messages/_MStickerBody.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss b/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss index 4d63376a47..3e6bbe5aa4 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/messages/_MStickerBody.scss @@ -21,17 +21,17 @@ limitations under the License. padding: 20px 0; } -.mx_MStickerBody_thumbnail_container { +.mx_MStickerBody_image_container { display: inline-block; position: relative; } -.mx_MStickerBody_thumbnail { +.mx_MStickerBody_image { max-width: 100%; opacity: 0; } -.mx_MStickerBody_thumbnail_visible { +.mx_MStickerBody_image_visible { opacity: 1; } From e36d972d94fea5ad2814e75a7c112631174bda9d Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Mon, 26 Mar 2018 11:36:42 +0100 Subject: [PATCH 26/28] Bind function in constructor. --- .../views/context_menus/GenericElementContextMenu.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/views/context_menus/GenericElementContextMenu.js b/src/components/views/context_menus/GenericElementContextMenu.js index 0a8d269293..4ae0bfd7dd 100644 --- a/src/components/views/context_menus/GenericElementContextMenu.js +++ b/src/components/views/context_menus/GenericElementContextMenu.js @@ -24,13 +24,18 @@ export default class GenericElementContextMenu extends React.Component { element: PropTypes.element.isRequired, }; + constructor(props) { + super(props); + this.resize = this.resize.bind(this); + } + componentDidMount() { this.resize = this.resize.bind(this); - window.addEventListener("resize", this.resize.bind(this)); + window.addEventListener("resize", this.resize); } componentWillUnmount() { - window.removeEventListener("resize", this.resize.bind(this)); + window.removeEventListener("resize", this.resize); } resize() { From 700515cce34b06e0d9f470f189cd5a56a1469520 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Mon, 26 Mar 2018 11:48:29 +0100 Subject: [PATCH 27/28] Add some comments. --- .../views/context_menus/GenericElementContextMenu.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/components/views/context_menus/GenericElementContextMenu.js b/src/components/views/context_menus/GenericElementContextMenu.js index 4ae0bfd7dd..3f4804dbd1 100644 --- a/src/components/views/context_menus/GenericElementContextMenu.js +++ b/src/components/views/context_menus/GenericElementContextMenu.js @@ -19,9 +19,19 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; +/* + * This component can be used to display generic HTML content in a contextual + * menu. + */ + + export default class GenericElementContextMenu extends React.Component { static PropTypes = { element: PropTypes.element.isRequired, + // Function to be called when the parent window is resized + // This can be used to reposition or close the menu on resize and + // ensure that it is not displayed in a stale position. + onResize: PropTypes.func, }; constructor(props) { From e3a3dec8a21782007651b1a44b5c45143d1704ff Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Mon, 26 Mar 2018 11:53:39 +0100 Subject: [PATCH 28/28] Move variables out of state. --- src/components/views/rooms/RoomTooltip.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js index 398c96b4de..5e766a665f 100644 --- a/src/components/views/rooms/RoomTooltip.js +++ b/src/components/views/rooms/RoomTooltip.js @@ -43,11 +43,7 @@ module.exports = React.createClass({ document.body.appendChild(this.tooltipContainer); window.addEventListener('scroll', this._renderTooltip, true); - const parent = ReactDOM.findDOMNode(this).parentNode; - this.state={ - parent, - parentBox: parent.getBoundingClientRect(), - }; + this.parent = ReactDOM.findDOMNode(this).parentNode; this._renderTooltip(); }, @@ -70,7 +66,7 @@ module.exports = React.createClass({ }, _updatePosition(style) { - const parentBox = this.state.parent.getBoundingClientRect(); + const parentBox = this.parent.getBoundingClientRect(); let offset = 0; if (parentBox.height > MIN_TOOLTIP_HEIGHT) { offset = Math.floor((parentBox.height - MIN_TOOLTIP_HEIGHT) / 2); @@ -117,8 +113,8 @@ module.exports = React.createClass({ render: function() { // Render a placeholder return ( - <div className={ this.props.className } > + <div className={this.props.className} > </div> ); - } + }, });