Merge branch 'develop' of github.com:vector-im/riot-web into anoa/jitsi_ptt

This commit is contained in:
Andrew Morgan 2019-02-04 16:40:29 +00:00
commit 726ca5b530
81 changed files with 3059 additions and 2132 deletions

55
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,55 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
<!-- Please report security issues by email to security@matrix.org -->
<!-- This is a bug report template. By following the instructions below and
filling out the sections with your information, you will help the us to get all
the necessary data to fix your issue.
You can also preview your report before submitting it. You may remove sections
that aren't relevant to your particular case.
Text between <!-- and --> marks will be invisible in the report.
-->
### Description
Describe here the problem that you are experiencing, or the feature you are requesting.
### Steps to reproduce
- For bugs, list the steps
- that reproduce the bug
- using hyphens as bullet points
Describe how what happens differs from what you expected.
Log: sent/not sent? <!-- You can send us the app's logs via the 'Report bug'
link on the 'Settings' page. Very important for hard-to-reproduce bugs. Please
file a bug here too! -->
<!-- Include screenshots if possible: you can drag and drop images below. -->
### Version information
<!-- IMPORTANT: please answer the following questions, to help us narrow down the problem -->
- **Platform**: web (in-browser) or desktop?
For the web app:
- **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web?
For the desktop app:
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **Version**: 0.x.y <!-- check the user settings panel if unsure -->

View file

@ -0,0 +1,32 @@
---
name: Redesign Issue
about: Bugs, feedback or feature requests specifically associated with the Redesign
project (https://riot.im/experimental)
title: ''
labels: redesign
assignees: ''
---
<!-- Thanks for providing feedback on the redesign! By filling out the sections with your information, you will help the us to process your issue.
-->
- **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
### Description
Describe here the problem that you are experiencing, or the feature you are requesting.
Include screenshots if possible: you can drag and drop images below.
### Steps to reproduce
- For bugs, list the steps
- that reproduce the bug
- using hyphens as bullet points
Describe how what happens differs from what you expected.
Log: sent/not sent? <!-- You can send us the app's logs via the 'Report bug'
link on the 'Settings' page. Very important for hard-to-reproduce bugs. Please
file a bug here too! -->

View file

@ -11,25 +11,18 @@ sudo: required
language: node_js language: node_js
node_js: node_js:
# make sure we work with a range of node versions. # make sure we work with a range of node versions.
# As of the time of writing:
# - 4.x is still in LTS (until April 2018), but some of our deps (notably
# extract-zip) don't work with it
# - 5.x has been EOLed for nearly a year.
# - 6.x is the active 'LTS' version
# - 7.x is no longer supported
# - 8.x is the current 'current' version (until October 2017)
# #
# see: https://github.com/nodejs/LTS/ # Current status of node versions: https://github.com/nodejs/LTS/
# # We don't work with node 6 because it doesn't support package-lock
# anything before 6.3 ships with npm 3.9 or earlier, which had problems # files which we need to avoid the broken version of base-x
# with symlinks in node_modules (see - 8
# https://github.com/npm/npm/releases/tag/v3.10.0 'FIXES AND REFACTORING'). - 10
- 6.3
- 6
- 7
addons: addons:
chrome: stable chrome: stable
install: install:
# clone the deps with depth 1: we know we will only ever need that one # clone the deps with depth 1: we know we will only ever need that one
# commit. # commit.
- scripts/fetch-develop.deps.sh --depth 1 && npm install - npm install && scripts/fetch-develop.deps.sh --depth 1
script:
- npm run test
- npm run lint

View file

@ -1,3 +1,95 @@
Changes in [0.17.9](https://github.com/vector-im/riot-web/releases/tag/v0.17.9) (2019-01-22)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.9-rc.1...v0.17.9)
* Bugfix in react-sdk for setting DM rooms
Changes in [0.17.9-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.17.9-rc.1) (2019-01-17)
======================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.8...v0.17.9-rc.1)
* Merge develop into experimental
[\#8003](https://github.com/vector-im/riot-web/pull/8003)
* Electron: Load app from custom protocol
[\#7943](https://github.com/vector-im/riot-web/pull/7943)
* Fix the IndexedDB worker
[\#7920](https://github.com/vector-im/riot-web/pull/7920)
* Make clear that the Debian package is for desktop
[\#7919](https://github.com/vector-im/riot-web/pull/7919)
* Run the Desktop app in a sandbox
[\#7907](https://github.com/vector-im/riot-web/pull/7907)
* Update to new electron single instance API
[\#7908](https://github.com/vector-im/riot-web/pull/7908)
* Update the tests to match https://github.com/matrix-org/matrix-react-
sdk/pull/2340
[\#7834](https://github.com/vector-im/riot-web/pull/7834)
Changes in [0.17.8](https://github.com/vector-im/riot-web/releases/tag/v0.17.8) (2018-12-10)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.8-rc.1...v0.17.8)
* No changes since rc.1
Changes in [0.17.8-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.17.8-rc.1) (2018-12-06)
======================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.7...v0.17.8-rc.1)
* Update from Weblate.
[\#7784](https://github.com/vector-im/riot-web/pull/7784)
* Add a function to send a rageshake from the console
[\#7755](https://github.com/vector-im/riot-web/pull/7755)
* Re-apply "Run lint on travis builds and use modern node versions"
[\#7738](https://github.com/vector-im/riot-web/pull/7738)
* Revert "Run lint on travis builds and use modern node versions"
[\#7737](https://github.com/vector-im/riot-web/pull/7737)
* Run lint on travis builds and use modern node versions
[\#7490](https://github.com/vector-im/riot-web/pull/7490)
* Fix missing js-sdk logging
[\#7736](https://github.com/vector-im/riot-web/pull/7736)
* Add $accent-color-50pct as a CSS variable to the Status theme
[\#7710](https://github.com/vector-im/riot-web/pull/7710)
Changes in [0.17.7](https://github.com/vector-im/riot-web/releases/tag/v0.17.7) (2018-11-22)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.6...v0.17.7)
* Warning when crypto DB is too new to use.
* Fix missing entries from js-sdk in rageshake logs
Changes in [0.17.6](https://github.com/vector-im/riot-web/releases/tag/v0.17.6) (2018-11-19)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.6-rc.2...v0.17.6)
* No changes since rc.2
Changes in [0.17.6-rc.2](https://github.com/vector-im/riot-web/releases/tag/v0.17.6-rc.2) (2018-11-15)
======================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.6-rc.1...v0.17.6-rc.2)
* Update to js-sdk 0.14 and react-sdk rc.2. rc.1 was broken as it was built against
js-sdk 0.13 which does not use the new Olm 3.0 API.
Changes in [0.17.6-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.17.6-rc.1) (2018-11-15)
======================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.5...v0.17.6-rc.1)
* Update from Weblate.
[\#7708](https://github.com/vector-im/riot-web/pull/7708)
* Add Japanese (#7599)
[\#7673](https://github.com/vector-im/riot-web/pull/7673)
* Allow Webpack dev server to listen to all interfaces
[\#7674](https://github.com/vector-im/riot-web/pull/7674)
* Remove the request-only stuff we don't need anymore
[\#7637](https://github.com/vector-im/riot-web/pull/7637)
* Correct the author of the electron app
[\#7615](https://github.com/vector-im/riot-web/pull/7615)
* Mock fs, tls, and net to support request in the browser
[\#7552](https://github.com/vector-im/riot-web/pull/7552)
* Update chokidar to transitively get newer fsevents
[\#7598](https://github.com/vector-im/riot-web/pull/7598)
* Support WebAssembly version of Olm
[\#7385](https://github.com/vector-im/riot-web/pull/7385)
Changes in [0.17.5](https://github.com/vector-im/riot-web/releases/tag/v0.17.5) (2018-11-13) Changes in [0.17.5](https://github.com/vector-im/riot-web/releases/tag/v0.17.5) (2018-11-13)
============================================================================================ ============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.4...v0.17.5) [Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.4...v0.17.5)

View file

@ -1,4 +1,4 @@
Contributing code to Riot Contributing code to Riot
========================= =========================
Riot follows the same pattern as https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst. Riot follows the same pattern as https://github.com/matrix-org/matrix-js-sdk/blob/master/CONTRIBUTING.rst.

View file

@ -28,7 +28,8 @@ Note that Chrome does not allow microphone or webcam access for sites served
over http (except localhost), so for working VoIP you will need to serve Riot over http (except localhost), so for working VoIP you will need to serve Riot
over https. over https.
### Installation Steps for Debian Stretch ### Desktop Installation for Debian Stretch
1. Add the repository to your sources.list using either of the following two options: 1. Add the repository to your sources.list using either of the following two options:
- Directly to sources.list: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee -a /etc/apt/sources.list` - Directly to sources.list: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee -a /etc/apt/sources.list`
- As a separate entry in sources.list.d: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/riot.list` - As a separate entry in sources.list.d: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/riot.list`
@ -129,7 +130,7 @@ For a good example, see https://riot.im/develop/config.json
1. `brand`: String to pass to your homeserver when configuring email notifications, to let the 1. `brand`: String to pass to your homeserver when configuring email notifications, to let the
homeserver know what email template to use when talking to you. homeserver know what email template to use when talking to you.
1. `integrations_ui_url`: URL to the web interface for the integrations server. The integrations 1. `integrations_ui_url`: URL to the web interface for the integrations server. The integrations
server is not Riot and normally not your Home Server either. The integration server settings server is not Riot and normally not your homeserver either. The integration server settings
may be left blank to disable integrations. may be left blank to disable integrations.
1. `integrations_rest_url`: URL to the REST interface for the integrations server. 1. `integrations_rest_url`: URL to the REST interface for the integrations server.
1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server. 1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server.
@ -156,8 +157,6 @@ For a good example, see https://riot.im/develop/config.json
1. `whitelistedHSUrls`: a list of HS URLs to not redact from the analytics 1. `whitelistedHSUrls`: a list of HS URLs to not redact from the analytics
1. `whitelistedISUrls`: a list of IS URLs to not redact from the analytics 1. `whitelistedISUrls`: a list of IS URLs to not redact from the analytics
1. `siteId`: The Piwik Site ID to use when sending analytics to the Piwik server configured above 1. `siteId`: The Piwik Site ID to use when sending analytics to the Piwik server configured above
1. `teamServerConfig`, `teamTokenMap`, `referralBaseUrl`: an obsolete precursor to communities
with referral tracking; please ignore it.
1. `welcomeUserId`: the user ID of a bot to invite whenever users register that can give them a tour 1. `welcomeUserId`: the user ID of a bot to invite whenever users register that can give them a tour

11
docs/shortcuts.md Normal file
View file

@ -0,0 +1,11 @@
# Keyboard Shortcuts
The modifier is <kbd>Ctrl</kbd> on Windows & Linux and <kbd></kbd> on Mac.
- <kbd>Ctrl</kbd>/<kbd></kbd>+<kbd>m</kbd> - toggle markdown
- <kbd>Ctrl</kbd>/<kbd></kbd>+<kbd>d</kbd> - toggle mic mute
- <kbd>Ctrl</kbd>/<kbd></kbd>+<kbd>e</kbd> - toggle video on/off
- <kbd>Ctrl</kbd>/<kbd></kbd>+<kbd>k</kbd> - jump to named room
- <kbd></kbd>/<kbd></kbd> - navigate within room list
- <kbd>PageUp</kbd>/<kbd>PageDown</kbd> - scroll timeline up/down
- <kbd>Ctrl</kbd>/<kbd></kbd>+<kbd>Home</kbd>/<kbd>End</kbd> - jump to timeline start/end

View file

@ -2,7 +2,7 @@
"name": "riot-web", "name": "riot-web",
"productName": "Riot", "productName": "Riot",
"main": "src/electron-main.js", "main": "src/electron-main.js",
"version": "0.17.5", "version": "0.17.9",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.", "author": "New Vector Ltd.",
"dependencies": { "dependencies": {

View file

@ -2,6 +2,7 @@
Copyright 2016 Aviral Dasgupta Copyright 2016 Aviral Dasgupta
Copyright 2016 OpenMarket Ltd Copyright 2016 OpenMarket Ltd
Copyright 2017 Michael Telatynski <7t3chguy@gmail.com> Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -23,17 +24,24 @@ const checkSquirrelHooks = require('./squirrelhooks');
if (checkSquirrelHooks()) return; if (checkSquirrelHooks()) return;
const argv = require('minimist')(process.argv); const argv = require('minimist')(process.argv);
const {app, ipcMain, powerSaveBlocker, BrowserWindow, Menu} = require('electron'); const {app, ipcMain, powerSaveBlocker, BrowserWindow, Menu, autoUpdater, protocol} = require('electron');
const AutoLaunch = require('auto-launch'); const AutoLaunch = require('auto-launch');
const ioHook = require('iohook'); const ioHook = require('iohook');
const path = require('path');
const tray = require('./tray'); const tray = require('./tray');
const vectorMenu = require('./vectormenu'); const vectorMenu = require('./vectormenu');
const webContentsHandler = require('./webcontents-handler'); const webContentsHandler = require('./webcontents-handler');
const updater = require('./updater'); const updater = require('./updater');
const { migrateFromOldOrigin } = require('./originMigrator');
const windowStateKeeper = require('electron-window-state'); const windowStateKeeper = require('electron-window-state');
// boolean flag set whilst we are doing one-time origin migration
// We only serve the origin migration script while we're actually
// migrating to mitigate any risk of it being used maliciously.
let migratingOrigin = false;
if (argv['profile']) { if (argv['profile']) {
app.setPath('userData', `${app.getPath('userData')}-${argv['profile']}`); app.setPath('userData', `${app.getPath('userData')}-${argv['profile']}`);
} }
@ -98,27 +106,75 @@ ipcMain.on('app_onAction', function(ev, payload) {
} }
}); });
autoUpdater.on('update-downloaded', (ev, releaseNotes, releaseName, releaseDate, updateURL) => {
if (!mainWindow) return;
// forward to renderer
mainWindow.webContents.send('update-downloaded', {
releaseNotes,
releaseName,
releaseDate,
updateURL,
});
});
ipcMain.on('ipcCall', async function(ev, payload) {
if (!mainWindow) return;
const args = payload.args || [];
let ret;
switch (payload.name) {
case 'getUpdateFeedUrl':
ret = autoUpdater.getFeedURL();
break;
case 'getAutoLaunchEnabled':
ret = launcher.isEnabled;
break;
case 'setAutoLaunchEnabled':
if (args[0]) {
launcher.enable();
} else {
launcher.disable();
}
break;
case 'getAppVersion':
ret = app.getVersion();
break;
case 'focusWindow':
if (mainWindow.isMinimized()) {
mainWindow.restore();
} else if (!mainWindow.isVisible()) {
mainWindow.show();
} else {
mainWindow.focus();
}
case 'origin_migrate':
migratingOrigin = true;
await migrateFromOldOrigin();
migratingOrigin = false;
break;
default:
mainWindow.webContents.send('ipcReply', {
id: payload.id,
error: "Unknown IPC Call: " + payload.name,
});
return;
}
mainWindow.webContents.send('ipcReply', {
id: payload.id,
reply: ret,
});
});
app.commandLine.appendSwitch('--enable-usermedia-screen-capturing'); app.commandLine.appendSwitch('--enable-usermedia-screen-capturing');
const shouldQuit = app.makeSingleInstance((commandLine, workingDirectory) => { const gotLock = app.requestSingleInstanceLock();
// If other instance launched with --hidden then skip showing window if (!gotLock) {
if (commandLine.includes('--hidden')) return;
// Someone tried to run a second instance, we should focus our window.
if (mainWindow) {
if (!mainWindow.isVisible()) mainWindow.show();
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
});
if (shouldQuit) {
console.log('Other instance detected: exiting'); console.log('Other instance detected: exiting');
app.exit(); app.exit();
} }
const launcher = new AutoLaunch({ const launcher = new AutoLaunch({
name: vectorConfig.brand || 'Riot', name: vectorConfig.brand || 'Riot',
isHidden: true, isHidden: true,
@ -127,39 +183,12 @@ const launcher = new AutoLaunch({
}, },
}); });
const settings = { // Register the scheme the app is served from as 'standard'
'auto-launch': { // which allows things like relative URLs and IndexedDB to
get: launcher.isEnabled, // work.
set: function(bool) { // Also mark it as secure (ie. accessing resources from this
if (bool) { // protocol and HTTPS won't trigger mixed content warnings).
return launcher.enable(); protocol.registerStandardSchemes(['vector'], {secure: true});
} else {
return launcher.disable();
}
},
},
};
ipcMain.on('settings_get', async function(ev) {
const data = {};
try {
await Promise.all(Object.keys(settings).map(async function (setting) {
data[setting] = await settings[setting].get();
}));
ev.sender.send('settings', data);
} catch (e) {
console.error(e);
}
});
ipcMain.on('settings_set', function(ev, key, value) {
console.log(key, value);
if (settings[key] && settings[key].set) {
settings[key].set(value);
}
});
app.on('ready', () => { app.on('ready', () => {
if (argv['devtools']) { if (argv['devtools']) {
@ -176,6 +205,66 @@ app.on('ready', () => {
} }
} }
protocol.registerFileProtocol('vector', (request, callback) => {
if (request.method !== 'GET') {
callback({error: -322}); // METHOD_NOT_SUPPORTED from chromium/src/net/base/net_error_list.h
return null;
}
const parsedUrl = new URL(request.url);
if (parsedUrl.protocol !== 'vector:') {
callback({error: -302}); // UNKNOWN_URL_SCHEME
return;
}
if (parsedUrl.host !== 'vector') {
callback({error: -105}); // NAME_NOT_RESOLVED
return;
}
const target = parsedUrl.pathname.split('/');
// path starts with a '/'
if (target[0] !== '') {
callback({error: -6}); // FILE_NOT_FOUND
return;
}
if (target[target.length - 1] == '') {
target[target.length - 1] = 'index.html';
}
let baseDir;
// first part of the path determines where we serve from
if (migratingOrigin && target[1] === 'origin_migrator_dest') {
// the origin migrator destination page
// (only the destination script needs to come from the
// custom protocol: the source part is loaded from a
// file:// as that's the origin we're migrating from).
baseDir = __dirname + "/../../origin_migrator/dest";
} else if (target[1] === 'webapp') {
baseDir = __dirname + "/../../webapp";
} else {
callback({error: -6}); // FILE_NOT_FOUND
return;
}
// Normalise the base dir and the target path separately, then make sure
// the target path isn't trying to back out beyond its root
baseDir = path.normalize(baseDir);
const relTarget = path.normalize(path.join(...target.slice(2)));
if (relTarget.startsWith('..')) {
callback({error: -6}); // FILE_NOT_FOUND
return;
}
const absTarget = path.join(baseDir, relTarget);
callback({
path: absTarget,
});
}, (error) => {
if (error) console.error('Failed to register protocol')
});
if (vectorConfig['update_base_url']) { if (vectorConfig['update_base_url']) {
console.log(`Starting auto update with base URL: ${vectorConfig['update_base_url']}`); console.log(`Starting auto update with base URL: ${vectorConfig['update_base_url']}`);
@ -192,6 +281,7 @@ app.on('ready', () => {
defaultHeight: 768, defaultHeight: 768,
}); });
const preloadScript = path.normalize(`${__dirname}/preload.js`);
mainWindow = global.mainWindow = new BrowserWindow({ mainWindow = global.mainWindow = new BrowserWindow({
icon: iconPath, icon: iconPath,
show: false, show: false,
@ -201,8 +291,20 @@ app.on('ready', () => {
y: mainWindowState.y, y: mainWindowState.y,
width: mainWindowState.width, width: mainWindowState.width,
height: mainWindowState.height, height: mainWindowState.height,
webPreferences: {
preload: preloadScript,
nodeIntegration: false,
sandbox: true,
enableRemoteModule: false,
// We don't use this: it's useful for the preload script to
// share a context with the main page so we can give select
// objects to the main page. The sandbox option isolates the
// main page from the background script.
contextIsolation: false,
webgl: false,
},
}); });
mainWindow.loadURL(`file://${__dirname}/../../webapp/index.html`); mainWindow.loadURL('vector://vector/webapp/');
Menu.setApplicationMenu(vectorMenu); Menu.setApplicationMenu(vectorMenu);
// explicitly hide because setApplicationMenu on Linux otherwise shows... // explicitly hide because setApplicationMenu on Linux otherwise shows...
@ -362,6 +464,18 @@ ipcMain.on('stop-listening-keys', () => {
stopListeningKeys(); stopListeningKeys();
}); });
app.on('second-instance', (ev, commandLine, workingDirectory) => {
// If other instance launched with --hidden then skip showing window
if (commandLine.includes('--hidden')) return;
// Someone tried to run a second instance, we should focus our window.
if (mainWindow) {
if (!mainWindow.isVisible()) mainWindow.show();
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
});
// Set the App User Model ID to match what the squirrel // Set the App User Model ID to match what the squirrel
// installer uses for the shortcut icon. // installer uses for the shortcut icon.
// This makes notifications work on windows 8.1 (and is // This makes notifications work on windows 8.1 (and is

View file

@ -0,0 +1,62 @@
/*
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.
*/
const { BrowserWindow, ipcMain } = require('electron');
const path = require('path');
async function migrateFromOldOrigin() {
console.log("Attempting to migrate data between origins");
// We can use the same preload script: we just need ipcRenderer exposed
const preloadScript = path.normalize(`${__dirname}/preload.js`);
await new Promise(resolve => {
const migrateWindow = new BrowserWindow({
show: false,
webPreferences: {
preload: preloadScript,
nodeIntegration: false,
sandbox: true,
enableRemoteModule: false,
webgl: false,
},
});
ipcMain.on('origin_migration_complete', (e, success, sentSummary, storedSummary) => {
if (success) {
console.log("Origin migration completed successfully!");
} else {
console.error("Origin migration failed!");
}
console.error("Data sent", sentSummary);
console.error("Data stored", storedSummary);
migrateWindow.close();
resolve();
});
ipcMain.on('origin_migration_nodata', (e) => {
console.log("No session to migrate from old origin");
migrateWindow.close();
resolve();
});
// Normalise the path because in the distribution, __dirname will be inside the
// electron asar.
const sourcePagePath = path.normalize(__dirname + '/../../origin_migrator/source.html');
console.log("Loading path: " + sourcePagePath);
migrateWindow.loadURL('file://' + sourcePagePath);
});
}
module.exports = {
migrateFromOldOrigin,
};

View file

@ -1,8 +1,5 @@
// @flow
/* /*
Copyright 2016 Aviral Dasgupta Copyright 2018 New Vector Ltd
Copyright 2016 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -17,13 +14,16 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
let Platform = null; const { ipcRenderer, webFrame } = require('electron');
if (window && window.process && window.process && window.process.type === 'renderer') { // expose ipcRenderer to the renderer process
// we're running inside electron window.ipcRenderer = ipcRenderer;
Platform = require('./ElectronPlatform');
} else {
Platform = require('./WebPlatform');
}
export default Platform; // Allow the fetch API to load resources from this
// protocol: this is necessary to load olm.wasm.
// (Also mark it a secure although we've already
// done this in the main process).
webFrame.registerURLSchemeAsPrivileged('vector', {
secure: true,
supportFetchAPI: true,
});

View file

@ -1,10 +1,12 @@
const {clipboard, nativeImage, Menu, MenuItem, shell} = require('electron'); const {clipboard, nativeImage, Menu, MenuItem, shell} = require('electron');
const url = require('url'); const url = require('url');
const MAILTO_PREFIX = "mailto:";
const PERMITTED_URL_SCHEMES = [ const PERMITTED_URL_SCHEMES = [
'http:', 'http:',
'https:', 'https:',
'mailto:', MAILTO_PREFIX,
]; ];
function safeOpenURL(target) { function safeOpenURL(target) {
@ -47,7 +49,7 @@ function onLinkContextMenu(ev, params) {
if (params.mediaType && params.mediaType === 'image' && !url.startsWith('file://')) { if (params.mediaType && params.mediaType === 'image' && !url.startsWith('file://')) {
popupMenu.append(new MenuItem({ popupMenu.append(new MenuItem({
label: 'Copy Image', label: 'Copy image',
click() { click() {
if (url.startsWith('data:')) { if (url.startsWith('data:')) {
clipboard.writeImage(nativeImage.createFromDataURL(url)); clipboard.writeImage(nativeImage.createFromDataURL(url));
@ -58,15 +60,25 @@ function onLinkContextMenu(ev, params) {
})); }));
} }
// No point offerring to copy a blob: URL either // No point offering to copy a blob: URL either
if (!url.startsWith('blob:')) { if (!url.startsWith('blob:')) {
// Special-case e-mail URLs to strip the `mailto:` like modern browsers do
if (url.startsWith(MAILTO_PREFIX)) {
popupMenu.append(new MenuItem({ popupMenu.append(new MenuItem({
label: 'Copy Link Address', label: 'Copy email address',
click() {
clipboard.writeText(url.substr(MAILTO_PREFIX.length));
},
}));
} else {
popupMenu.append(new MenuItem({
label: 'Copy link address',
click() { click() {
clipboard.writeText(url); clipboard.writeText(url);
}, },
})); }));
} }
}
// popup() requires an options object even for no options // popup() requires an options object even for no options
popupMenu.popup({}); popupMenu.popup({});
ev.preventDefault(); ev.preventDefault();
@ -117,6 +129,18 @@ function onEditableContextMenu(ev, params) {
module.exports = (webContents) => { module.exports = (webContents) => {
webContents.on('new-window', onWindowOrNavigate); webContents.on('new-window', onWindowOrNavigate);
// XXX: The below now does absolutely nothing because of
// https://github.com/electron/electron/issues/8841
// Whilst this isn't a security issue since without
// node integration and with the sandbox, it should be
// no worse than opening the site in Chrome, it obviously
// means the user has to restart Riot to make it usable
// again (often unintuitive because it minimises to the
// system tray). We therefore need to be vigilant about
// putting target="_blank" on links in Riot (although
// we should generally be doing this anyway since links
// navigating you away from Riot in the browser is
// also annoying).
webContents.on('will-navigate', onWindowOrNavigate); webContents.on('will-navigate', onWindowOrNavigate);
webContents.on('context-menu', function(ev, params) { webContents.on('context-menu', function(ev, params) {

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,6 @@
<html>
<body>
<script src="browser-matrix.min.js"></script>
<script src="dest.js"></script>
</body>
</html>

View file

@ -0,0 +1,125 @@
/*
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.
*/
const SOURCE_ORIGIN = 'file://';
const IndexedDBCryptoStore = window.matrixcs.IndexedDBCryptoStore;
const cryptoStore = new IndexedDBCryptoStore(window.indexedDB, 'matrix-js-sdk:crypto');
let accountStored = 0;
let sessionsStored = 0;
let inboundGroupSessionsStored = 0;
let deviceDataStored = 0;
let roomsStored = 0;
let localStorageKeysStored = 0;
const promises = [];
async function onMessage(e) {
if (e.origin !== SOURCE_ORIGIN) return;
const data = e.data.data; // bleh, naming clash
switch (e.data.cmd) {
case 'init':
// start with clean stores before we migrate data in
window.localStorage.clear();
await cryptoStore.deleteAllData();
e.source.postMessage({
cmd: 'initOK',
}, SOURCE_ORIGIN);
break;
case 'storeAccount':
promises.push(cryptoStore.doTxn(
'readwrite', [IndexedDBCryptoStore.STORE_ACCOUNT],
(txn) => {
cryptoStore.storeAccount(txn, data);
},
).then(() => {
++accountStored;
}));
break;
case 'storeSessions':
promises.push(cryptoStore.doTxn(
'readwrite', [IndexedDBCryptoStore.STORE_SESSIONS],
(txn) => {
for (const sess of data) {
cryptoStore.storeEndToEndSession(sess.deviceKey, sess.sessionId, sess, txn);
}
},
).then(() => {
sessionsStored += data.length;
}));
break;
case 'storeInboundGroupSessions':
promises.push(cryptoStore.doTxn(
'readwrite', [IndexedDBCryptoStore.STORE_INBOUND_GROUP_SESSIONS],
(txn) => {
for (const sess of data) {
cryptoStore.addEndToEndInboundGroupSession(
sess.senderKey, sess.sessionId, sess.sessionData, txn,
);
}
},
).then(() => {
inboundGroupSessionsStored += data.length;
}));
break;
case 'storeDeviceData':
promises.push(cryptoStore.doTxn(
'readwrite', [IndexedDBCryptoStore.STORE_DEVICE_DATA],
(txn) => {
cryptoStore.storeEndToEndDeviceData(data, txn);
},
).then(() => {
++deviceDataStored;
}));
break;
case 'storeRooms':
promises.push(cryptoStore.doTxn(
'readwrite', [IndexedDBCryptoStore.STORE_ROOMS],
(txn) => {
for (const [roomId, roomInfo] of Object.entries(data)) {
cryptoStore.storeEndToEndRoom(roomId, roomInfo, txn);
}
},
).then(() => {
++roomsStored;
}));
break;
case 'storeLocalStorage':
window.localStorage.setItem(data.key, data.val);
++localStorageKeysStored;
break;
case 'getSummary':
await Promise.all(promises);
e.source.postMessage({
cmd: 'summary',
data: {
accountStored,
sessionsStored,
inboundGroupSessionsStored,
deviceDataStored,
roomsStored,
localStorageKeysStored,
},
}, SOURCE_ORIGIN);
break;
}
}
window.addEventListener('message', onMessage);

View file

@ -0,0 +1,7 @@
<html>
<body>
<script src="dest/browser-matrix.min.js"></script>
<script src="source.js"></script>
<iframe name="dest" src="vector://vector/origin_migrator_dest/dest.html" onload="doMigrate()"></iframe>
</body>
</html>

210
origin_migrator/source.js Normal file
View file

@ -0,0 +1,210 @@
/*
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.
*/
const TARGET_ORIGIN = 'vector://vector';
const BATCH_SIZE = 500;
let destFrame;
let initResolver = null;
let getSummaryResolver = null;
function onMessage(e) {
if (e.origin !== TARGET_ORIGIN) return;
if (e.data.cmd === 'initOK' && initResolver) {
initResolver();
initResolver = null;
} else if (e.data.cmd === 'summary' && getSummaryResolver) {
getSummaryResolver(e.data.data);
getSummaryResolver = null;
}
}
async function initDestFrame() {
return new Promise(resolve => {
initResolver = resolve;
destFrame.postMessage({
cmd: 'init',
}, TARGET_ORIGIN);
});
}
async function getSummary() {
return new Promise(resolve => {
getSummaryResolver = resolve;
destFrame.postMessage({
cmd: 'getSummary',
}, TARGET_ORIGIN);
});
}
async function doMigrate() {
let accountSent = 0;
let sessionsSent = 0;
let inboundGroupSessionsSent = 0;
let deviceDataSent = 0;
let roomsSent = 0;
let localStorageKeysSent = 0;
if (!window.ipcRenderer) {
console.error("ipcRenderer not found");
return;
}
if (window.localStorage.getItem('mx_user_id') === null) {
window.ipcRenderer.send("origin_migration_nodata");
return;
}
destFrame = window.parent.frames.dest;
await initDestFrame();
const IndexedDBCryptoStore = window.matrixcs.IndexedDBCryptoStore;
const cryptoStore = new IndexedDBCryptoStore(window.indexedDB, 'matrix-js-sdk:crypto');
await cryptoStore.doTxn(
'readonly', [IndexedDBCryptoStore.STORE_ACCOUNT],
(txn) => {
cryptoStore.getAccount(txn, (account) => {
destFrame.postMessage({
cmd: 'storeAccount',
data: account,
}, TARGET_ORIGIN);
++accountSent;
});
},
);
await cryptoStore.doTxn(
'readonly', [IndexedDBCryptoStore.STORE_SESSIONS],
(txn) => {
let sessBatch = [];
cryptoStore.getAllEndToEndSessions(txn, (sessInfo) => {
if (sessInfo) {
++sessionsSent;
sessBatch.push(sessInfo);
}
if (sessBatch.length >= BATCH_SIZE || sessInfo === null) {
destFrame.postMessage({
cmd: 'storeSessions',
data: sessBatch,
}, TARGET_ORIGIN);
sessBatch = [];
}
});
},
);
await cryptoStore.doTxn(
'readonly', [IndexedDBCryptoStore.STORE_INBOUND_GROUP_SESSIONS],
(txn) => {
let sessBatch = [];
cryptoStore.getAllEndToEndInboundGroupSessions(txn, (sessInfo) => {
if (sessInfo) {
++inboundGroupSessionsSent;
sessBatch.push(sessInfo);
}
if (sessBatch.length >= BATCH_SIZE || sessInfo === null) {
destFrame.postMessage({
cmd: 'storeInboundGroupSessions',
data: sessBatch,
}, TARGET_ORIGIN);
sessBatch = [];
}
});
},
);
await cryptoStore.doTxn(
'readonly', [IndexedDBCryptoStore.STORE_DEVICE_DATA],
(txn) => {
cryptoStore.getEndToEndDeviceData(txn, (deviceData) => {
destFrame.postMessage({
cmd: 'storeDeviceData',
data: deviceData,
}, TARGET_ORIGIN);
++deviceDataSent;
});
},
);
await cryptoStore.doTxn(
'readonly', [IndexedDBCryptoStore.STORE_ROOMS],
(txn) => {
cryptoStore.getEndToEndRooms(txn, (rooms) => {
destFrame.postMessage({
cmd: 'storeRooms',
data: rooms,
}, TARGET_ORIGIN);
++roomsSent;
});
},
);
// we don't bother migrating;
// * sync data (we can just initialsync again)
// * logs
// * key requests (worst case they'll just be re-sent)
// * sessions needing backup (feature isn't available on Electron)
for (let i = 0; i < window.localStorage.length; ++i) {
const key = window.localStorage.key(i);
const val = window.localStorage.getItem(key);
destFrame.postMessage({
cmd: 'storeLocalStorage',
data: { key, val },
}, TARGET_ORIGIN);
++localStorageKeysSent;
}
const summary = await getSummary();
let success = false;
if (
summary.accountStored === accountSent &&
summary.sessionsStored === sessionsSent &&
summary.inboundGroupSessionsStored === inboundGroupSessionsSent &&
summary.deviceDataStored === deviceDataSent &&
summary.roomsStored === roomsSent &&
summary.localStorageKeysStored === localStorageKeysSent
) {
success = true;
window.localStorage.clear();
await cryptoStore.deleteAllData();
// we don't bother migrating them, but also blow away the sync & logs db,
// otherwise they'll just hang about taking up space
await new Promise(resolve => {
const req = window.indexedDB.deleteDatabase('matrix-js-sdk:riot-web-sync');
req.onsuccess = resolve;
req.onerror = resolve;
});
await new Promise(resolve => {
const req = window.indexedDB.deleteDatabase('logs');
req.onsuccess = resolve;
req.onerror = resolve;
});
}
window.ipcRenderer.send("origin_migration_complete", success, {
accountSent, sessionsSent, inboundGroupSessionsSent,
deviceDataSent, roomsSent, localStorageKeysSent,
}, summary);
}
window.addEventListener('message', onMessage);

1458
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@
"name": "riot-web", "name": "riot-web",
"productName": "Riot", "productName": "Riot",
"main": "electron_app/src/electron-main.js", "main": "electron_app/src/electron-main.js",
"version": "0.17.5", "version": "0.17.9",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.", "author": "New Vector Ltd.",
"repository": { "repository": {
@ -33,8 +33,8 @@
"build:res": "node scripts/copy-res.js", "build:res": "node scripts/copy-res.js",
"build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js", "build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js",
"build:compile": "npm run reskindex && babel --source-maps -d lib src", "build:compile": "npm run reskindex && babel --source-maps -d lib src",
"build:bundle": "cross-env NODE_ENV=production webpack-cli -p --progress --bail --mode production", "build:bundle": "cross-env NODE_ENV=production webpack -p --progress --bail --mode production",
"build:bundle:dev": "webpack-cli --progress --bail --mode development", "build:bundle:dev": "webpack --progress --bail --mode development",
"build:electron": "npm run clean && npm run build && npm run install:electron && build -wml --ia32 --x64", "build:electron": "npm run clean && npm run build && npm run install:electron && build -wml --ia32 --x64",
"build:react-sdk": "node scripts/npm-sub.js matrix-react-sdk run build", "build:react-sdk": "node scripts/npm-sub.js matrix-react-sdk run build",
"build:js-sdk": "node scripts/npm-sub.js matrix-js-sdk run start:init", "build:js-sdk": "node scripts/npm-sub.js matrix-js-sdk run start:init",
@ -70,8 +70,8 @@
"gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279", "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279",
"gfm.css": "^1.1.2", "gfm.css": "^1.1.2",
"highlight.js": "^9.13.1", "highlight.js": "^9.13.1",
"matrix-js-sdk": "matrix-org/matrix-js-sdk#develop", "matrix-js-sdk": "0.14.3",
"matrix-react-sdk": "matrix-org/matrix-react-sdk#develop", "matrix-react-sdk": "0.14.8",
"modernizr": "^3.6.0", "modernizr": "^3.6.0",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^15.6.0", "react": "^15.6.0",
@ -84,7 +84,7 @@
"autoprefixer": "^6.6.0", "autoprefixer": "^6.6.0",
"babel-cli": "^6.26.0", "babel-cli": "^6.26.0",
"babel-core": "^6.26.3", "babel-core": "^6.26.3",
"babel-eslint": "^6.1.2", "babel-eslint": "^8.1.1",
"babel-loader": "^7.1.5", "babel-loader": "^7.1.5",
"babel-plugin-add-module-exports": "^0.2.1", "babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-transform-async-to-bluebird": "^1.1.1", "babel-plugin-transform-async-to-bluebird": "^1.1.1",
@ -100,7 +100,8 @@
"concurrently": "^4.0.1", "concurrently": "^4.0.1",
"cpx": "^1.3.2", "cpx": "^1.3.2",
"cross-env": "^4.0.0", "cross-env": "^4.0.0",
"electron-builder": "^20.29.0", "css-loader": "^2.1.0",
"electron-builder": "^20.38.5",
"electron-builder-squirrel-windows": "^11.6.1", "electron-builder-squirrel-windows": "^11.6.1",
"electron-devtools-installer": "^2.2.4", "electron-devtools-installer": "^2.2.4",
"emojione": "^2.2.7", "emojione": "^2.2.7",
@ -110,6 +111,7 @@
"eslint-plugin-flowtype": "^2.50.3", "eslint-plugin-flowtype": "^2.50.3",
"eslint-plugin-react": "^7.11.1", "eslint-plugin-react": "^7.11.1",
"expect": "^1.16.0", "expect": "^1.16.0",
"file-loader": "^3.0.1",
"fs-extra": "^0.30.0", "fs-extra": "^0.30.0",
"html-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^3.2.0",
"json-loader": "^0.5.3", "json-loader": "^0.5.3",
@ -136,7 +138,6 @@
"postcss-scss": "^1.0.6", "postcss-scss": "^1.0.6",
"postcss-simple-vars": "^4.1.0", "postcss-simple-vars": "^4.1.0",
"postcss-strip-inline-comments": "^0.1.5", "postcss-strip-inline-comments": "^0.1.5",
"raw-loader": "^0.5.1",
"react-addons-perf": "^15.4.0", "react-addons-perf": "^15.4.0",
"react-addons-test-utils": "^15.6.0", "react-addons-test-utils": "^15.6.0",
"rimraf": "^2.4.3", "rimraf": "^2.4.3",
@ -146,18 +147,19 @@
"webpack-dev-server": "^3.1.10" "webpack-dev-server": "^3.1.10"
}, },
"optionalDependencies": { "optionalDependencies": {
"olm": "https://matrix.org/packages/npm/olm/olm-3.0.0.tgz" "olm": "https://matrix.org/packages/npm/olm/olm-3.1.0-pre1.tgz"
}, },
"build": { "build": {
"appId": "im.riot.app", "appId": "im.riot.app",
"electronVersion": "3.0.5", "electronVersion": "4.0.1",
"files": [ "files": [
"node_modules/**", "node_modules/**",
"src/**", "src/**",
"img/**" "img/**"
], ],
"extraResources": [ "extraResources": [
"webapp/**/*" "webapp/**/*",
"origin_migrator/**/*"
], ],
"linux": { "linux": {
"target": "deb", "target": "deb",

View file

@ -47,4 +47,4 @@ git commit package.json -m "$tag"
cd .. cd ..
exec ./node_modules/matrix-js-sdk/release.sh -z "$orig_args" exec ./node_modules/matrix-js-sdk/release.sh -u vector-im -z "$orig_args"

View file

@ -4,289 +4,197 @@
* voodoo where we have to set display: none by default * voodoo where we have to set display: none by default
*/ */
.mx_HomePage_header h1 { h1::after {
margin-left: 0px; content: "!";
margin-bottom: 0px;
margin-top: 20px;
margin-right: 20px;
color: #454545;
} }
.mx_HomePage_header h2 { .mx_HomePage_body {
margin-left: 0px; display: flex;
margin-top: 5px; flex-direction: column;
margin-bottom: 20px; justify-content: center;
margin-right: 20px; height: 100%;
color: #454545;
} }
.mx_HomePage_header h1 a { .mx_Parent {
color: #454545; display: -webkit-box;
} display: -webkit-flex;
display: -ms-flexbox;
.mx_HomePage h3 { display: flex;
margin-top: 30px; -webkit-box-orient: vertical;
} -webkit-box-direction: normal;
-webkit-flex-direction: column;
.mx_HomePage_header { -ms-flex-direction: column;
border: 1px solid #76CFA6; flex-direction: column;
background-color: #eaf5f0; -webkit-box-pack: center;
border-radius: 5px; -webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center; align-items: center;
}
.mx_HomePage_col {
display: flex;
flex-direction: row;
}
.mx_HomePage_toprow {
flex-wrap: wrap;
}
.mx_HomePage_row {
flex: 1 1 0;
margin-right: 20px;
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.mx_HomePage_logo {
margin-top: 20px;
margin-left: 40px;
margin-right: 40px;
margin-bottom: 20px;
display: inline;
height: 100px;
}
.mx_HomePage_room {
cursor: pointer;
float: left;
text-decoration: none;
text-align: center; text-align: center;
padding-left: 10px; margin-bottom: 50px;
padding-right: 10px;
width: 120px;
} }
.mx_HomePage_toprow .mx_HomePage_room { .mx_Well {
width: 64px;
}
.mx_HomePage_room .mx_HomePage_icon {
border-radius: 50%;
width: 64px;
height: 64px;
}
.mx_HomePage_room .mx_HomePage_name {
display: block; display: block;
} -webkit-box-pack: center;
-webkit-justify-content: center;
.mx_HomePage_room .mx_HomePage_desc { -ms-flex-pack: center;
display: block; justify-content: center;
font-size: 12px; -webkit-flex-wrap: wrap;
margin-top: 8px; -ms-flex-wrap: wrap;
} flex-wrap: wrap;
-webkit-box-align: center;
.mx_HomePage_comment { -webkit-align-items: center;
display: flex; -ms-flex-align: center;
align-items: center; align-items: center;
margin-left: 100px; border-radius: 10px;
min-height: 64px; background-color: #F2F5F8;
} }
.mx_HomePage_container h3::after, .mx_ButtonParent {
.mx_HomePage_container h4::after { display: -webkit-box;
content: ":"; display: -webkit-flex;
display: -ms-flexbox;
display: flex;
padding: 10px 20px;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
border-radius: 4px;
width: 150px;
background-repeat: no-repeat;
background-position: 10px center;
text-decoration: none;
color: #2e2f32 !important;
} }
.mx_HomePage_container { .mx_ButtonRow {
display: block ! important; display: -webkit-box;
margin: 20px; display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 480px;
-webkit-justify-content: space-around;
-ms-flex-pack: distribute;
justify-content: space-around;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
justify-content: space-between;
padding: 0 40px;
box-sizing: border-box;
margin: 28px 0;
} }
.mx_HomePage_container h1, .mx_ButtonRow_guest {
.mx_HomePage_container h2, display: none;
.mx_HomePage_container h3, }
.mx_HomePage_container h4 {
/* mx_HomePage_guest is set on the `HomePage` component for guest users */
.mx_HomePage_guest .mx_ButtonRow_guest {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.mx_buttonheadline {
margin-bottom: 14px;
}
.mx_buttonlabel {
margin-left: 20px;
}
.mx_buttonwrappertext {
font-size: 13px;
margin-bottom: 10px;
}
.mx_Header2 {
font-size: 32px;
font-weight: 600; font-weight: 600;
margin-top: 40px;
} }
.mx_Header22 {
font-size: 14px;
font-weight: 200;
margin-bottom: 40px;
}
.mx_ButtonSignIn {
background-color: #368BD6;
color: white !important;
}
.mx_ButtonCreateAccount {
background-color: #03B381;
color: white !important;
}
.mx_secondarybutton {
background-color: #FFFFFF;
color: #2E2F32;
}
.mx_Button_iconSignIn {
background-image: url('home/images/icon-sign-in.svg');
}
.mx_Button_iconCreateAccount {
background-image: url('home/images/icon-create-account.svg');
}
.mx_Button_iconHelp {
background-image: url('home/images/icon-help.svg');
}
.mx_Button_iconRoomDirectory {
background-image: url('home/images/icon-room-directory.svg');
}
</style> </style>
<div class="mx_HomePage_container"> <div class="mx_Parent">
<div class="mx_HomePage_col mx_HomePage_header"> <a href="https://riot.im" target="_blank" rel="noopener">
<a href="https://riot.im"><img src="home/images/logo.svg" class="mx_HomePage_logo"></a> <img src="home/images/logo.svg" alt="" class="mx_logo"/>
<div>
<h1>_t("Welcome to Riot.im")</h1>
<h2>_t("Decentralised, encrypted chat &amp; collaboration powered by [matrix]")</h2>
</div>
</div>
<div class="mx_HomePage_col mx_HomePage_toprow">
<div class="mx_HomePage_row">
<div>
<h3>_t("Search the room directory")</h3>
<a class="mx_HomePage_room" href="#/directory">
<img class="mx_HomePage_icon" src="img/icons-directory.svg">
</a> </a>
<span class="mx_HomePage_comment"> <h1 class="mx_Header2">_t("Welcome to Riot.im")</h1>
_t("Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!") <h4 class="mx_Header22">_t("Decentralised, encrypted chat &amp; collaboration powered by [matrix]")</h4>
</span> <div class="mx_Well">
</div> <div class="mx_ButtonRow mx_ButtonRow_guest">
</div> <a href="#/login" class="mx_ButtonParent mx_ButtonSignIn mx_Button_iconSignIn">
<div class="mx_HomePage_row"> <div class="mx_buttonlabel">_t("Sign In")</div>
<div>
<h3>_t("Chat with Riot Bot")</h3>
<a class="mx_HomePage_room" href="#/user/@riot-bot:matrix.org?action=chat">
<img class="mx_HomePage_icon" src="home/rooms/riot-bot.png">
</a> </a>
<span class="mx_HomePage_comment"> <a href="#/register" class="mx_ButtonParent mx_ButtonCreateAccount mx_Button_iconCreateAccount">
_t("Get started with some tips from Riot Bot!") <div class="mx_buttonlabel">_t("Create Account")</div>
</span>
</div>
</div>
</div>
<h3>_t("General discussion about Matrix and Riot")</h3>
<div class="mx_HomePage_row">
<div class="mx_HomePage_room">
<a href="#/room/#matrix:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/matrix.png">
<span class="mx_HomePage_name">Matrix HQ</span>
</a> </a>
<span class="mx_HomePage_desc">_t("Discussion of all things Matrix!")</span>
</div> </div>
<div class="mx_HomePage_room"> <div class="mx_ButtonRow">
<a href="#/room/#riot:matrix.org"> <div class="mx_buttonwrapper">
<img class="mx_HomePage_icon" src="home/rooms/riot.png"> <div class="mx_buttonwrappertext">_t("Need help?")</div>
<span class="mx_HomePage_name">Riot</span> <a href="#/user/@riot-bot:matrix.org?action=chat" class="mx_ButtonParent mx_secondarybutton mx_Button_iconHelp">
<div class="mx_buttonlabel">_t("Chat with Riot Bot")</div>
</a> </a>
<span class="mx_HomePage_desc">_t("Riot/Web &amp; Desktop chat")</span>
</div> </div>
<div class="mx_HomePage_room"> <div class="mx_buttonwrapper">
<a href="#/room/#riot-ios:matrix.org"> <div class="mx_buttonwrappertext">_t("Explore rooms")</div>
<img class="mx_HomePage_icon" src="home/rooms/riot-ios.png"> <a href="#/directory" class="mx_ButtonParent mx_secondarybutton mx_Button_iconRoomDirectory">
<span class="mx_HomePage_name">#riot-ios</span> <div class="mx_buttonlabel">_t("Room Directory")</div>
</a> </a>
<span class="mx_HomePage_desc">_t("Riot/iOS &amp; matrix-ios-sdk chat")</span> </div>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#riot-android:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/riot-android.png">
<span class="mx_HomePage_name">#riot-android</span>
</a>
<span class="mx_HomePage_desc">_t("Riot/Android &amp; matrix-android-sdk chat")</span>
</div>
</div>
<h3>_t("Matrix technical discussions")</h3>
<h4>_t("Running Matrix services")</h4>
<div class="mx_HomePage_row">
<div class="mx_HomePage_room">
<a href="#/room/#synapse:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/matrix.png">
<span class="mx_HomePage_name">Synapse Support Community</span>
</a>
<span class="mx_HomePage_desc">_t("Community-run support for Synapse")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#dendrite:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/dendrite.png">
<span class="mx_HomePage_name">#dendrite:matrix.org</span>
</a>
<span class="mx_HomePage_desc">_t("Admin support for Dendrite")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#homeowners:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/homeowners.png">
<span class="mx_HomePage_name">Synapse Homeowners</span>
</a>
<span class="mx_HomePage_desc">_t("Announcements about Synapse releases")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#irc:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/irc.png">
<span class="mx_HomePage_name">IRC Matrix Bridges</span>
</a>
<span class="mx_HomePage_desc">_t("Support for those using and running matrix-appservice-irc")</span>
</div>
</div>
<h4>_t("Building services on Matrix")</h4>
<div class="mx_HomePage_row">
<div class="mx_HomePage_room">
<a href="#/room/#matrix-dev:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/matrix-dev.png">
<span class="mx_HomePage_name">#matrix-dev:matrix.org</span>
</a>
<span class="mx_HomePage_desc">_t("Support for those using the Matrix spec")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#e2e:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/e2e.png">
<span class="mx_HomePage_name">End-to-end crypto in Matrix</span>
</a>
<span class="mx_HomePage_desc">_t("Design and implementation of E2E in Matrix")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#vr:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/vr.png">
<span class="mx_HomePage_name">#vr:matrix.org</span>
</a>
<span class="mx_HomePage_desc">_t("Implementing VR services with Matrix")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#webrtc:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/webrtc.png">
<span class="mx_HomePage_name">#webrtc:matrix.org</span>
</a>
<span class="mx_HomePage_desc">_t("Implementing VoIP services with Matrix")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#matrix-identity:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/identity.jpg">
<span class="mx_HomePage_name">Matrix Identity</span>
</a>
<span class="mx_HomePage_desc">_t("Discussion of the Identity Service API")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#bridging:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/bridging.png">
<span class="mx_HomePage_name">Matrix Bridging</span>
</a>
<span class="mx_HomePage_desc">_t("Support for those using, running and writing other bridges")</span>
</div>
</div>
<h4>_t("Contributing code to Matrix and Riot")</h4>
<div class="mx_HomePage_row">
<div class="mx_HomePage_room">
<a href="#/room/#riot-dev:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/riot-dev.png">
<span class="mx_HomePage_name">#riot-dev</span>
</a>
<span class="mx_HomePage_desc">_t("Dev chat for the Riot/Web dev team")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#dendrite-dev:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/dendrite-dev.png">
<span class="mx_HomePage_name">#dendrite-dev</span>
</a>
<span class="mx_HomePage_desc">_t("Dev chat for the Dendrite dev team")</span>
</div>
<div class="mx_HomePage_room">
<a href="#/room/#riotweb-translations:matrix.org">
<img class="mx_HomePage_icon" src="home/rooms/riot-translations.png">
<span class="mx_HomePage_name">Riot Translations</span>
</a>
<span class="mx_HomePage_desc">_t("Co-ordination for Riot translators")</span>
</div> </div>
</div> </div>
</div> </div>

View file

@ -0,0 +1,17 @@
<svg width="24px" height="20px" viewBox="0 0 24 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Experiments" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Home" transform="translate(-880.000000, -478.000000)" stroke="#FFFFFF" stroke-width="1.6">
<g id="Group-11" transform="translate(621.000000, 176.000000)">
<g id="Group-7-Copy" transform="translate(243.000000, 290.000000)">
<g id="user-plus" transform="translate(17.000000, 13.000000)">
<path d="M15,18 L15,16 C15,13.790861 13.209139,12 11,12 L4,12 C1.790861,12 2.22044605e-16,13.790861 0,16 L0,18" id="Path"></path>
<circle id="Oval" cx="7.5" cy="4" r="4"></circle>
<path d="M19,5 L19,11" id="Path"></path>
<path d="M22,8 L16,8" id="Path"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,16 @@
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Experiments" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Home" transform="translate(-672.000000, -577.000000)" stroke="#000000" stroke-width="1.6">
<g id="Group-11" transform="translate(621.000000, 176.000000)">
<g id="Group-10" transform="translate(39.000000, 391.000000)">
<g id="help-circle" transform="translate(13.000000, 11.000000)">
<circle id="Oval" cx="10" cy="10" r="10"></circle>
<path d="M7.09,7 C7.57543688,5.62004444 8.98538362,4.79140632 10.4271763,5.0387121 C11.868969,5.28601788 12.9221794,6.53715293 12.92,8 C12.92,10 9.92,11 9.92,11" id="Path"></path>
<path d="M10,15 L10.0050017,15.0050017" id="Path"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,19 @@
<svg width="20px" height="14px" viewBox="0 0 20 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Experiments" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Home" transform="translate(-880.000000, -581.000000)" stroke="#000000" stroke-width="1.6">
<g id="Group-11" transform="translate(621.000000, 176.000000)">
<g id="Group-8" transform="translate(243.000000, 391.000000)">
<g id="list" transform="translate(15.000000, 14.000000)">
<path d="M7,1 L20,1" id="Path"></path>
<path d="M7,7 L20,7" id="Path"></path>
<path d="M7,13 L20,13" id="Path"></path>
<path d="M2,1 L2.02063964,1.02063964" id="Path"></path>
<path d="M2,7 L2,7.03169624" id="Path"></path>
<path d="M2,13 L2,13.0336048" id="Path"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,16 @@
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Experiments" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Home" transform="translate(-673.000000, -478.000000)" stroke="#FFFFFF" stroke-width="1.6">
<g id="Group-11" transform="translate(621.000000, 176.000000)">
<g id="Group-7" transform="translate(40.000000, 283.000000)">
<g id="log-in" transform="translate(13.000000, 20.000000)">
<path d="M12,0 L16,0 C17.1045695,0 18,0.8954305 18,2 L18,16 C18,17.1045695 17.1045695,18 16,18 L12,18" id="Path"></path>
<polyline id="Path" points="7 14 12 9 7 4"></polyline>
<path d="M12,9 L0,9" id="Path"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1,000 B

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="25px" height="25px" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>icons_directory</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Left-panel" transform="translate(-83.000000, -726.000000)">
<g id="icons_directory">
<g transform="translate(83.000000, 726.000000)">
<path d="M12.5,25 C19.4035594,25 25,19.4035594 25,12.5 C25,5.59644063 19.4035594,0 12.5,0 C5.59644063,0 0,5.59644063 0,12.5 C0,19.4035594 5.59644063,25 12.5,25 Z" id="Oval-1-Copy-7" fill="#76CFA6"></path>
<g id="Lines" transform="translate(6.000000, 7.000000)" stroke="#FFFFFF" stroke-linecap="round">
<path d="M4,5.5 L9,5.5" id="Line"></path>
<path d="M4,1.5 L13,1.5" id="Line-Copy-4"></path>
<path d="M0,1.5 L2,1.5" id="Line" opacity="0.6"></path>
<path d="M0,5.5 L2,5.5" id="Line" opacity="0.6"></path>
<path d="M4,9.5 L11,9.5" id="Line-Copy-6"></path>
<path d="M0,9.5 L2,9.5" id="Line-Copy-3" opacity="0.6"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View file

@ -1,158 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 163.60767 144.2"
xml:space="preserve"
sodipodi:docname="riot-im-logo-1.svg"
width="163.60767"
height="144.2"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
id="metadata3918"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs3916" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="2071"
id="namedview3914"
showgrid="false"
inkscape:zoom="0.98333333"
inkscape:cx="81.80767"
inkscape:cy="72.1"
inkscape:window-x="1912"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style3856">
.st0{fill:#7DC8A2;}
.st1{fill:#AFDBC5;}
.st2{fill:#764D80;}
.st3{fill:#764D80;stroke:#764D80;stroke-miterlimit:10;}
</style><g
id="Layer_3"
transform="translate(-38.19233,-47.9)"><g
id="g3910"><g
id="g3886"><g
id="g3884"><path
class="st0"
d="M 100.6,48.1 H 59.7 c -0.1,0 -0.2,0 -0.3,0 -11.4,0 -20.6,9.2 -20.6,20.6 v 102.8 c 0,11.4 9.2,20.6 20.6,20.6 11.4,0 20.6,-9.2 20.6,-20.6 v -20.6 h 20.6 c 28.3,0 51.4,-23.1 51.4,-51.4 0,-28.3 -23.1,-51.4 -51.4,-51.4 z"
id="path3858"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="M 59.5,186.9 C 51,186.9 44.1,180 44.1,171.5 V 68.6 c 0,-8.5 6.9,-15.4 15.3,-15.4 0.1,0 0.2,0 0.3,0 h 40.9 c 25.5,0 46.3,20.8 46.3,46.3 0,25.5 -20.8,46.3 -46.3,46.3 H 74.9 v 25.7 c 0,8.4 -6.9,15.4 -15.4,15.4 z"
id="path3860"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 59.5,181.7 c -5.7,0 -10.3,-4.6 -10.3,-10.3 V 68.6 c 0,-5.6 4.5,-10.2 10.1,-10.3 0.1,0 0.2,0 0.3,0 h 41 c 22.7,0 41.1,18.5 41.1,41.1 0,22.6 -18.5,41.1 -41.1,41.1 H 69.8 v 30.8 c 0,5.8 -4.6,10.4 -10.3,10.4 z"
id="path3862"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="m 59.5,176.6 c -2.9,0 -5.2,-2.3 -5.2,-5.2 V 68.6 c 0,-2.8 2.2,-5.1 5,-5.2 h 0.2 41.1 c 19.9,0 36,16.2 36,36 0,19.8 -16.1,36 -36,36 H 64.7 v 36 c 0,2.9 -2.3,5.2 -5.2,5.2 z"
id="path3864"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 59.5,130.3 h 41.1 c 17,0 30.9,-13.8 30.9,-30.9 0,-17.1 -13.8,-30.9 -30.9,-30.9 H 59.5 Z"
id="path3866"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="M 64.7,125.2 V 73.7 h 36 c 14.2,0 25.7,11.5 25.7,25.7 0,14.2 -11.5,25.7 -25.7,25.7 z"
id="path3868"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="M 69.8,120.1 V 78.9 h 30.8 c 11.4,0 20.6,9.2 20.6,20.6 0,11.4 -9.2,20.6 -20.6,20.6 z"
id="path3870"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="M 74.9,115 V 84 h 25.7 c 8.5,0 15.5,6.9 15.5,15.5 0,8.6 -6.9,15.5 -15.5,15.5 z"
id="path3872"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="M 80,109.8 V 89.1 h 20.6 c 5.7,0 10.4,4.6 10.4,10.4 0,5.8 -4.6,10.4 -10.4,10.4 z"
id="path3874"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="M 85.2,104.7 V 94.2 h 15.4 c 2.9,0 5.2,2.3 5.2,5.2 0,2.9 -2.3,5.2 -5.2,5.2 z"
id="path3876"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><g
id="g3882"><circle
transform="matrix(0.8192,-0.5736,0.5736,0.8192,-28.7245,46.1263)"
class="st2"
cx="58.799999"
cy="68.599998"
id="ellipse3878"
r="20.6"
style="fill:#764d80" /><path
class="st2"
d="m 147.6,159.6 c 6.5,9.3 4.3,22.1 -5,28.6 -9.3,6.5 -22.1,4.3 -28.6,-5 l -30.8,-44 c -6.5,-9.3 -4.3,-22.1 5,-28.6 9.3,-6.5 22.1,-4.3 28.6,5 z"
id="path3880"
inkscape:connector-curvature="0"
style="fill:#764d80" /></g></g></g><g
id="g3908"><g
id="g3896"><path
class="st2"
d="M 183.6,80.7 H 200 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.9 -0.7,-1.6 -1.6,-1.6 h -16.4 c -0.9,0 -1.6,0.7 -1.6,1.6 0,0.9 0.7,1.6 1.6,1.6 z"
id="path3888"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 183.6,51.3 h 4.9 v 5 0 l -5.8,4 c -0.7,0.5 -0.9,1.5 -0.4,2.3 0.5,0.7 1.5,0.9 2.3,0.4 l 4.6,-3.2 c 1.1,2.2 3.3,3.6 5.9,3.6 3.6,0 6.6,-3 6.6,-6.6 v -7.2 0 c 0,-0.6 -0.3,-1.1 -0.7,-1.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.3 v 0 h -9.8 -6.5 c -0.9,0 -1.6,0.7 -1.6,1.6 -0.2,1.1 0.5,1.8 1.4,1.8 z m 14.7,5.6 c 0,1.8 -1.5,3.3 -3.3,3.3 -1.8,0 -3.3,-1.5 -3.3,-3.3 v -5.6 h 6.5 z"
id="path3890"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 200,123.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 4.9 h -14.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 0 c 0,0.9 0.7,1.6 1.6,1.6 h 14.7 v 5 c 0,0.9 0.7,1.6 1.6,1.6 0.9,0 1.6,-0.7 1.6,-1.6 v -6.6 0 -6.5 c 0,-0.9 -0.7,-1.6 -1.6,-1.6 z"
id="path3892"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 191.8,94.5 c -5.5,0 -10,4.5 -10,10 0,5.5 4.5,10 10,10 5.5,0 10,-4.5 10,-10 0,-5.5 -4.5,-10 -10,-10 z m 0,16.7 c -3.7,0 -6.7,-3 -6.7,-6.7 0,-3.7 3,-6.7 6.7,-6.7 3.7,0 6.7,3 6.7,6.7 0,3.7 -3,6.7 -6.7,6.7 z"
id="path3894"
inkscape:connector-curvature="0"
style="fill:#764d80" /></g><g
id="g3902"><path
class="st2"
d="m 201.1,157 c -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.4,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.4 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.3,0 0.7,-0.1 1.1,-0.4 0.3,-0.3 0.4,-0.6 0.4,-1.1 0,-0.4 -0.1,-0.8 -0.4,-1.1 z"
id="path3898"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 201.5,175.3 v -0.2 c 0,-0.4 -0.1,-0.8 -0.4,-1.1 -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.3,0 -0.7,0 -1.1,0.3 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 h 12.1 l -7.3,4.9 c -0.4,0.4 -0.6,0.8 -0.6,1.3 0,0.5 0.3,1 0.7,1.3 l 7.3,5 h -12.1 c -0.3,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.4,0 0.7,-0.1 1.1,-0.4 0.4,-0.3 0.4,-0.6 0.4,-1.1 v -0.2 c 0,-0.5 -0.1,-1.1 -0.7,-1.4 l -9.2,-6.1 9.2,-6.1 c 0.4,-0.3 0.7,-0.8 0.7,-1.4 z"
id="path3900"
inkscape:connector-curvature="0"
style="fill:#764d80" /></g><g
id="g3906"><path
class="st3"
d="m 190.7,146.1 c 0.3,0 0.6,0.1 0.9,0.4 0.2,0.2 0.4,0.5 0.4,0.9 0,0.3 -0.1,0.6 -0.4,0.9 -0.2,0.2 -0.5,0.4 -0.9,0.4 h -0.5 c -0.3,0 -0.6,-0.1 -0.9,-0.4 -0.2,-0.2 -0.4,-0.5 -0.4,-0.9 0,-0.4 0.1,-0.7 0.4,-0.9 0.2,-0.2 0.5,-0.4 0.9,-0.4 z"
id="path3904"
inkscape:connector-curvature="0"
style="fill:#764d80;stroke:#764d80;stroke-miterlimit:10" /></g></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 8.3 KiB

View file

@ -1,165 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 163.7 144.10001"
xml:space="preserve"
sodipodi:docname="riot-im-logo-2.svg"
width="163.7"
height="144.10001"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
id="metadata64"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs62" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview60"
showgrid="false"
inkscape:zoom="0.98333333"
inkscape:cx="81.9"
inkscape:cy="72"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style2">
.st0{fill:#F69E98;}
.st1{fill:#764D80;}
</style><g
id="Layer_3"
transform="translate(-38.1,-47.9)"><g
id="g26"><g
id="g24"><g
id="g12"><path
class="st0"
d="M 183.6,80.7 H 200 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.9 -0.7,-1.6 -1.6,-1.6 h -16.4 c -0.9,0 -1.6,0.7 -1.6,1.6 0,0.9 0.7,1.6 1.6,1.6 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 183.6,51.3 h 4.9 v 5 0 l -5.8,4 c -0.7,0.5 -0.9,1.5 -0.4,2.3 0.5,0.7 1.5,0.9 2.3,0.4 l 4.6,-3.2 c 1.1,2.2 3.3,3.6 5.9,3.6 3.6,0 6.6,-3 6.6,-6.6 v -7.2 0 c 0,-0.6 -0.3,-1.1 -0.7,-1.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.3 v 0 h -9.8 -6.5 c -0.9,0 -1.6,0.7 -1.6,1.6 -0.2,1.1 0.5,1.8 1.4,1.8 z m 14.7,5.6 c 0,1.8 -1.5,3.3 -3.3,3.3 -1.8,0 -3.3,-1.5 -3.3,-3.3 v -5.6 h 6.5 z"
id="path6"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 200,123.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 4.9 h -14.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 0 c 0,0.9 0.7,1.6 1.6,1.6 h 14.7 v 5 c 0,0.9 0.7,1.6 1.6,1.6 0.9,0 1.6,-0.7 1.6,-1.6 v -6.6 0 -6.5 c 0,-0.9 -0.7,-1.6 -1.6,-1.6 z"
id="path8"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 191.8,94.5 c -5.5,0 -10,4.5 -10,10 0,5.5 4.5,10 10,10 5.5,0 10,-4.5 10,-10 0,-5.5 -4.5,-10 -10,-10 z m 0,16.7 c -3.7,0 -6.7,-3 -6.7,-6.7 0,-3.7 3,-6.7 6.7,-6.7 3.7,0 6.7,3 6.7,6.7 0,3.7 -3,6.7 -6.7,6.7 z"
id="path10"
inkscape:connector-curvature="0"
style="fill:#f69e98" /></g><g
id="g18"><path
class="st0"
d="m 201.1,157 c -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.4,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.4 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.3,0 0.7,-0.1 1.1,-0.4 0.3,-0.3 0.4,-0.6 0.4,-1.1 0,-0.4 -0.1,-0.8 -0.4,-1.1 z"
id="path14"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 201.5,175.3 v -0.2 c 0,-0.4 -0.1,-0.8 -0.4,-1.1 -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.3,0 -0.7,0 -1.1,0.3 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 h 12.1 l -7.3,4.9 c -0.4,0.4 -0.6,0.8 -0.6,1.3 0,0.5 0.3,1 0.7,1.3 l 7.3,5 h -12.1 c -0.3,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.4,0 0.7,-0.1 1.1,-0.4 0.4,-0.3 0.4,-0.6 0.4,-1.1 v -0.2 c 0,-0.5 -0.1,-1.1 -0.7,-1.4 l -9.2,-6.1 9.2,-6.1 c 0.4,-0.3 0.7,-0.8 0.7,-1.4 z"
id="path16"
inkscape:connector-curvature="0"
style="fill:#f69e98" /></g><g
id="g22"><path
class="st0"
d="m 190.7,146.1 c 0.3,0 0.6,0.1 0.9,0.4 0.2,0.2 0.4,0.5 0.4,0.9 0,0.3 -0.1,0.6 -0.4,0.9 -0.2,0.2 -0.5,0.4 -0.9,0.4 h -0.5 c -0.3,0 -0.6,-0.1 -0.9,-0.4 -0.2,-0.2 -0.4,-0.5 -0.4,-0.9 0,-0.4 0.1,-0.7 0.4,-0.9 0.2,-0.2 0.5,-0.4 0.9,-0.4 z"
id="path20"
inkscape:connector-curvature="0"
style="fill:#f69e98" /></g></g></g></g><g
id="g57"
transform="translate(-38.1,-47.9)"><path
class="st1"
d="M 99.9,48 H 58.7 c -11.4,0 -20.6,9.2 -20.6,20.6 0,0 0,0 0,0 v 102.8 c 0,11.4 9.2,20.6 20.6,20.6 11.4,0 20.6,-9.2 20.6,-20.6 v -20.6 h 20.5 c 28.4,0 51.4,-23 51.4,-51.4 C 151.2,71 128.2,48 99.9,48 Z"
id="path29"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st0"
d="m 58.7,187.6 c -8.9,0 -16.2,-7.2 -16.2,-16.2 V 68.6 c 0,-8.9 7.1,-16.1 16,-16.2 h 41.3 c 26,0 47,21 47,47 0,26 -21,47 -47,47 H 74.9 v 25 c 0,9 -7.2,16.2 -16.2,16.2 z M 58.6,53.9 c -8,0.1 -14.5,6.6 -14.5,14.7 v 102.8 c 0,8.1 6.6,14.7 14.7,14.7 8.1,0 14.7,-6.6 14.7,-14.7 v -26.5 h 26.4 c 25.1,0 45.5,-20.4 45.5,-45.5 0,-25.1 -20.4,-45.5 -45.5,-45.5 0,0 -41.3,0 -41.3,0 z"
id="path31"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 58.7,182.4 c -6.1,0 -11,-4.9 -11,-11 V 68.6 c 0,-6 4.8,-10.8 10.8,-11 h 41.3 c 23.1,0 41.9,18.7 41.9,41.9 0,23.2 -18.7,41.8 -41.9,41.8 h -30 v 30.1 c 0,6.1 -4.9,11 -11.1,11 0.1,0 0.1,0 0,0 z M 58.5,59 c -5.2,0.1 -9.3,4.4 -9.3,9.6 v 102.8 c -0.2,5.3 4,9.7 9.2,9.8 5.2,0.1 9.7,-4 9.8,-9.2 0,-0.2 0,-0.4 0,-0.6 v -31.6 h 31.6 c 22.3,0 40.3,-18.1 40.3,-40.4 0,-22.3 -18.1,-40.3 -40.3,-40.3 z"
id="path33"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 58.7,177.3 c -3.2,0 -5.9,-2.6 -5.9,-5.9 V 68.6 c 0,-3.1 2.5,-5.7 5.6,-5.9 h 41.4 c 20.3,0 36.7,16.4 36.7,36.7 0,20.3 -16.4,36.7 -36.7,36.7 H 64.6 v 35.2 c 0,3.3 -2.6,6 -5.9,6 z M 58.5,64.2 c -2.3,0.2 -4.1,2.1 -4.1,4.4 v 102.8 c 0,2.4 2,4.4 4.4,4.4 2.4,0 4.4,-2 4.4,-4.4 v -36.8 h 36.7 c 19.4,0 35.2,-15.8 35.2,-35.2 0,-19.4 -15.8,-35.2 -35.2,-35.2 z"
id="path35"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="M 99.9,131 H 58 V 67.9 h 41.9 c 17.4,0 31.6,14.1 31.6,31.6 0,17.5 -14.2,31.5 -31.6,31.5 z M 59.5,129.5 H 99.9 C 116.5,129.5 130,116 130,99.4 130,82.8 116.5,69.3 99.9,69.3 H 59.5 Z"
id="path37"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="M 99.9,125.9 H 63.2 V 73 h 36.7 c 14.6,0.3 26.2,12.3 25.9,26.9 -0.3,14.3 -11.8,25.7 -25.9,26 z M 64.6,124.4 H 99.8 C 113.6,124.1 124.5,112.7 124.2,99 123.9,85.6 113.2,74.8 99.8,74.6 H 64.6 Z"
id="path39"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="M 99.9,120.7 H 68.3 V 78.2 h 31.6 c 11.8,0.3 21.1,10 20.8,21.7 -0.3,11.4 -9.5,20.6 -20.8,20.8 z M 69.8,119.2 H 99.9 C 110.8,119 119.5,109.9 119.2,99 119,88.4 110.4,79.9 99.9,79.7 H 69.8 Z"
id="path41"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="M 99.9,115.6 H 73.4 V 83.3 h 26.4 c 8.9,0 16.1,7.2 16.1,16.1 0,8.9 -7.1,16.2 -16,16.2 z m -25,-1.6 h 24.9 c 8.1,0 14.6,-6.6 14.6,-14.6 0,-8 -6.6,-14.6 -14.6,-14.6 v 0 H 74.9 Z"
id="path43"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="M 99.9,110.4 H 78.6 v -22 h 21.3 c 6.1,0 11,4.9 11,11 0,6.1 -5,11 -11,11 z m -19.8,-1.5 h 19.8 c 5.2,0 9.5,-4.3 9.5,-9.5 0,-5.2 -4.3,-9.5 -9.5,-9.5 H 80.1 Z"
id="path45"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="M 99.9,105.3 H 83.7 V 93.6 h 16.1 c 3.2,0 5.9,2.6 5.9,5.9 0,3.3 -2.6,5.8 -5.8,5.8 0,0 0,0 0,0 z m -14.7,-1.5 h 14.7 c 2.4,0 4.4,-2 4.4,-4.4 0,-2.4 -2,-4.4 -4.4,-4.4 H 85.2 Z"
id="path47"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 99.4,100.2 h -9.3 c -0.4,0 -0.8,-0.3 -0.8,-0.8 0,-0.5 0.3,-0.8 0.8,-0.8 h 9.3 c 0.4,0 0.8,0.3 0.8,0.8 0,0.5 -0.4,0.8 -0.8,0.8 z"
id="path49"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st0"
d="m 58.7,172.2 c -0.4,0 -0.8,-0.3 -0.8,-0.8 v -36 c 0,-0.4 0.3,-0.8 0.8,-0.8 0.4,0 0.8,0.3 0.8,0.8 v 36 c 0,0.4 -0.3,0.8 -0.8,0.8 z"
id="path51"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><circle
transform="matrix(0.8192,-0.5736,0.5736,0.8192,-28.7215,46.1209)"
class="st0"
cx="58.799999"
cy="68.599998"
id="ellipse53"
r="20.6"
style="fill:#f69e98" /><path
class="st0"
d="m 147.5,159.6 c 6.5,9.3 4.3,22.1 -5.1,28.6 -9.4,6.5 -22.1,4.3 -28.6,-5.1 L 83,139.1 c -6.5,-9.3 -4.2,-22.1 5.1,-28.6 9.3,-6.5 22.1,-4.2 28.6,5.1 z"
id="path55"
inkscape:connector-curvature="0"
style="fill:#f69e98" /></g></svg>

Before

Width:  |  Height:  |  Size: 9.3 KiB

View file

@ -1,173 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 163.89999 144.3"
xml:space="preserve"
sodipodi:docname="riot-im-logo-3.svg"
width="163.89999"
height="144.3"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
id="metadata68"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs66" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview64"
showgrid="false"
inkscape:zoom="0.98333333"
inkscape:cx="82.1"
inkscape:cy="72.2"
inkscape:window-x="1034"
inkscape:window-y="234"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style2">
.st0{fill:#FAC79E;}
.st1{fill:#E45E5D;}
.st2{fill:#F8A05F;}
</style><g
id="Layer_3"
transform="translate(-37.9,-47.9)"><g
id="g26"><g
id="g24"><g
id="g12"><path
class="st0"
d="M 183.6,80.7 H 200 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.9 -0.7,-1.6 -1.6,-1.6 h -16.4 c -0.9,0 -1.6,0.7 -1.6,1.6 0,0.9 0.7,1.6 1.6,1.6 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#fac79e" /><path
class="st0"
d="m 183.6,51.3 h 4.9 v 5 0 l -5.8,4 c -0.7,0.5 -0.9,1.5 -0.4,2.3 0.5,0.7 1.5,0.9 2.3,0.4 l 4.6,-3.2 c 1.1,2.2 3.3,3.6 5.9,3.6 3.6,0 6.6,-3 6.6,-6.6 v -7.2 0 c 0,-0.6 -0.3,-1.1 -0.7,-1.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.3 v 0 h -9.8 -6.5 c -0.9,0 -1.6,0.7 -1.6,1.6 -0.2,1.1 0.5,1.8 1.4,1.8 z m 14.7,5.6 c 0,1.8 -1.5,3.3 -3.3,3.3 -1.8,0 -3.3,-1.5 -3.3,-3.3 v -5.6 h 6.5 z"
id="path6"
inkscape:connector-curvature="0"
style="fill:#fac79e" /><path
class="st0"
d="m 200,123.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 4.9 h -14.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 0 c 0,0.9 0.7,1.6 1.6,1.6 h 14.7 v 5 c 0,0.9 0.7,1.6 1.6,1.6 0.9,0 1.6,-0.7 1.6,-1.6 v -6.6 0 -6.5 c 0,-0.9 -0.7,-1.6 -1.6,-1.6 z"
id="path8"
inkscape:connector-curvature="0"
style="fill:#fac79e" /><path
class="st0"
d="m 191.8,94.5 c -5.5,0 -10,4.5 -10,10 0,5.5 4.5,10 10,10 5.5,0 10,-4.5 10,-10 0,-5.5 -4.5,-10 -10,-10 z m 0,16.7 c -3.7,0 -6.7,-3 -6.7,-6.7 0,-3.7 3,-6.7 6.7,-6.7 3.7,0 6.7,3 6.7,6.7 0,3.7 -3,6.7 -6.7,6.7 z"
id="path10"
inkscape:connector-curvature="0"
style="fill:#fac79e" /></g><g
id="g18"><path
class="st0"
d="m 201.1,157 c -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.4,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.4 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.3,0 0.7,-0.1 1.1,-0.4 0.3,-0.3 0.4,-0.6 0.4,-1.1 0,-0.4 -0.1,-0.8 -0.4,-1.1 z"
id="path14"
inkscape:connector-curvature="0"
style="fill:#fac79e" /><path
class="st0"
d="m 201.5,175.3 v -0.2 c 0,-0.4 -0.1,-0.8 -0.4,-1.1 -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.3,0 -0.7,0 -1.1,0.3 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 h 12.1 l -7.3,4.9 c -0.4,0.4 -0.6,0.8 -0.6,1.3 0,0.5 0.3,1 0.7,1.3 l 7.3,5 h -12.1 c -0.3,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.4,0 0.7,-0.1 1.1,-0.4 0.4,-0.3 0.4,-0.6 0.4,-1.1 v -0.2 c 0,-0.5 -0.1,-1.1 -0.7,-1.4 l -9.2,-6.1 9.2,-6.1 c 0.4,-0.3 0.7,-0.8 0.7,-1.4 z"
id="path16"
inkscape:connector-curvature="0"
style="fill:#fac79e" /></g><g
id="g22"><path
class="st0"
d="m 190.7,146.1 c 0.3,0 0.6,0.1 0.9,0.4 0.2,0.2 0.4,0.5 0.4,0.9 0,0.3 -0.1,0.6 -0.4,0.9 -0.2,0.2 -0.5,0.4 -0.9,0.4 h -0.5 c -0.3,0 -0.6,-0.1 -0.9,-0.4 -0.2,-0.2 -0.4,-0.5 -0.4,-0.9 0,-0.4 0.1,-0.7 0.4,-0.9 0.2,-0.2 0.5,-0.4 0.9,-0.4 z"
id="path20"
inkscape:connector-curvature="0"
style="fill:#fac79e" /></g></g></g></g><g
id="g61"
transform="translate(-37.9,-47.9)"><path
class="st1"
d="M 99.6,48.2 H 58.5 c -11.4,0 -20.6,9.2 -20.6,20.6 0,0 0,0 0,0 v 102.8 c 0,11.4 9.2,20.6 20.6,20.6 11.4,0 20.6,-9.2 20.6,-20.6 V 151 h 20.6 c 28.4,0 51.4,-23 51.4,-51.4 0,-28.4 -23.1,-51.4 -51.5,-51.4 z"
id="path29"
inkscape:connector-curvature="0"
style="fill:#e45e5d" /><polygon
class="st2"
points="37.9,96.3 37.9,104.3 85,48.2 78.3,48.2 "
id="polygon31"
style="fill:#f8a05f" /><polygon
class="st2"
points="37.9,112.3 37.9,120.2 98.4,48.2 91.7,48.2 "
id="polygon33"
style="fill:#f8a05f" /><path
class="st2"
d="m 110.8,49.5 c -1.9,-0.4 -3.9,-0.8 -5.9,-1 L 38,128.3 v 8 z"
id="path35"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><polygon
class="st2"
points="37.9,80.3 37.9,88.3 71.6,48.2 64.8,48.2 "
id="polygon37"
style="fill:#f8a05f" /><path
class="st2"
d="m 121.2,53 c -1.6,-0.8 -3.3,-1.4 -5,-2 l -78.3,93.2 v 8 z"
id="path39"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 79.1,151 h 0.2 L 144,73.8 c -0.9,-1.5 -1.9,-3 -2.9,-4.5 L 43.5,185.6 c 1.2,1.3 2.5,2.4 4,3.3 l 31.6,-37.7 z"
id="path41"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="M 150.2,90.4 99.4,151 h 0.2 c 2.3,0 4.6,-0.2 6.9,-0.5 l 44.5,-53 c -0.2,-2.4 -0.4,-4.7 -0.8,-7.1 z"
id="path43"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 78.7,175.7 -12.6,15 c 6.4,-2.6 11.2,-8.2 12.6,-15 z"
id="path45"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 147.9,117.1 c 1.3,-3.6 2.2,-7.4 2.7,-11.2 l -35.9,42.8 c 3.7,-1.1 7.3,-2.7 10.6,-4.6 z"
id="path47"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 130.2,58.3 c -1.4,-1 -2.8,-2 -4.3,-2.9 l -88,104.8 v 8 z"
id="path49"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 137.8,65.2 c -1.2,-1.3 -2.4,-2.5 -3.6,-3.7 L 38.4,175.7 c 0.4,1.9 1.1,3.8 2,5.6 z"
id="path51"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 79.1,167.2 v -8 l -26.8,32 c 1.9,0.6 3.9,1 5.9,1 z"
id="path53"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><path
class="st2"
d="m 148.7,84.2 c -0.6,-1.9 -1.3,-3.7 -2.1,-5.5 L 85.9,151 h 6.7 z"
id="path55"
inkscape:connector-curvature="0"
style="fill:#f8a05f" /><circle
transform="matrix(0.8192,-0.5736,0.5736,0.8192,-28.8644,46.014)"
class="st0"
cx="58.5"
cy="68.800003"
id="ellipse57"
r="20.6"
style="fill:#fac79e" /><path
class="st0"
d="m 147.3,159.8 c 6.5,9.3 4.3,22.1 -5.1,28.6 -9.4,6.5 -22.1,4.3 -28.6,-5.1 l -30.8,-44 c -6.5,-9.3 -4.2,-22.1 5.1,-28.6 9.3,-6.5 22.1,-4.2 28.6,5.1 z"
id="path59"
inkscape:connector-curvature="0"
style="fill:#fac79e" /></g></svg>

Before

Width:  |  Height:  |  Size: 7.9 KiB

View file

@ -1,185 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 163.89999 144.10001"
xml:space="preserve"
sodipodi:docname="riot-im-logo-4.svg"
width="163.89999"
height="144.10001"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
id="metadata70"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs68" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview66"
showgrid="false"
inkscape:zoom="0.98333333"
inkscape:cx="82.1"
inkscape:cy="72"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style2">
.st0{fill:#C7BDCD;}
.st1{fill:#E45E5D;}
.st2{fill:#F69E98;}
</style><g
id="Layer_3"
transform="translate(-37.9,-47.9)"><g
id="g26"><g
id="g24"><g
id="g12"><path
class="st0"
d="M 183.6,80.7 H 200 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.9 -0.7,-1.6 -1.6,-1.6 h -16.4 c -0.9,0 -1.6,0.7 -1.6,1.6 0,0.9 0.7,1.6 1.6,1.6 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /><path
class="st0"
d="m 183.6,51.3 h 4.9 v 5 0 l -5.8,4 c -0.7,0.5 -0.9,1.5 -0.4,2.3 0.5,0.7 1.5,0.9 2.3,0.4 l 4.6,-3.2 c 1.1,2.2 3.3,3.6 5.9,3.6 3.6,0 6.6,-3 6.6,-6.6 v -7.2 0 c 0,-0.6 -0.3,-1.1 -0.7,-1.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.3 v 0 h -9.8 -6.5 c -0.9,0 -1.6,0.7 -1.6,1.6 -0.2,1.1 0.5,1.8 1.4,1.8 z m 14.7,5.6 c 0,1.8 -1.5,3.3 -3.3,3.3 -1.8,0 -3.3,-1.5 -3.3,-3.3 v -5.6 h 6.5 z"
id="path6"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /><path
class="st0"
d="m 200,123.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 4.9 h -14.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 0 c 0,0.9 0.7,1.6 1.6,1.6 h 14.7 v 5 c 0,0.9 0.7,1.6 1.6,1.6 0.9,0 1.6,-0.7 1.6,-1.6 v -6.6 0 -6.5 c 0,-0.9 -0.7,-1.6 -1.6,-1.6 z"
id="path8"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /><path
class="st0"
d="m 191.8,94.5 c -5.5,0 -10,4.5 -10,10 0,5.5 4.5,10 10,10 5.5,0 10,-4.5 10,-10 0,-5.5 -4.5,-10 -10,-10 z m 0,16.7 c -3.7,0 -6.7,-3 -6.7,-6.7 0,-3.7 3,-6.7 6.7,-6.7 3.7,0 6.7,3 6.7,6.7 0,3.7 -3,6.7 -6.7,6.7 z"
id="path10"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /></g><g
id="g18"><path
class="st0"
d="m 201.1,157 c -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.4,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.4 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.3,0 0.7,-0.1 1.1,-0.4 0.3,-0.3 0.4,-0.6 0.4,-1.1 0,-0.4 -0.1,-0.8 -0.4,-1.1 z"
id="path14"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /><path
class="st0"
d="m 201.5,175.3 v -0.2 c 0,-0.4 -0.1,-0.8 -0.4,-1.1 -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.3,0 -0.7,0 -1.1,0.3 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 h 12.1 l -7.3,4.9 c -0.4,0.4 -0.6,0.8 -0.6,1.3 0,0.5 0.3,1 0.7,1.3 l 7.3,5 h -12.1 c -0.3,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.4,0 0.7,-0.1 1.1,-0.4 0.4,-0.3 0.4,-0.6 0.4,-1.1 v -0.2 c 0,-0.5 -0.1,-1.1 -0.7,-1.4 l -9.2,-6.1 9.2,-6.1 c 0.4,-0.3 0.7,-0.8 0.7,-1.4 z"
id="path16"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /></g><g
id="g22"><path
class="st0"
d="m 190.7,146.1 c 0.3,0 0.6,0.1 0.9,0.4 0.2,0.2 0.4,0.5 0.4,0.9 0,0.3 -0.1,0.6 -0.4,0.9 -0.2,0.2 -0.5,0.4 -0.9,0.4 h -0.5 c -0.3,0 -0.6,-0.1 -0.9,-0.4 -0.2,-0.2 -0.4,-0.5 -0.4,-0.9 0,-0.4 0.1,-0.7 0.4,-0.9 0.2,-0.2 0.5,-0.4 0.9,-0.4 z"
id="path20"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /></g></g></g></g><g
id="g63"
transform="translate(-37.9,-47.9)"><path
class="st1"
d="M 99.6,48 H 58.5 c -11.4,0 -20.6,9.2 -20.6,20.6 0,0 0,0 0,0 v 102.8 c 0,11.4 9.2,20.6 20.6,20.6 11.4,0 20.6,-9.2 20.6,-20.6 V 150.8 H 99.6 C 128,150.8 151,127.8 151,99.4 151,71 128,48 99.6,48 Z"
id="path29"
inkscape:connector-curvature="0"
style="fill:#e45e5d" /><path
class="st2"
d="m 40.7,181.7 c 1.1,1.9 2.6,3.7 4.2,5.1 H 72 c 1.7,-1.5 3.1,-3.2 4.2,-5.1 z"
id="path31"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,140.6 v 5.1 h 84 c 3,-1.4 5.8,-3.2 8.4,-5.1 z"
id="path33"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><rect
x="37.900002"
y="150.8"
class="st2"
width="41.099998"
height="5.0999999"
id="rect35"
style="fill:#f69e98" /><rect
x="37.900002"
y="161.10001"
class="st2"
width="41.099998"
height="5.0999999"
id="rect37"
style="fill:#f69e98" /><path
class="st2"
d="m 38.6,63.4 h 97.6 c -1.8,-1.9 -3.8,-3.6 -5.9,-5.1 H 40.7 c -0.9,1.6 -1.6,3.3 -2.1,5.1 z"
id="path39"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,171.4 v 0 c 0,1.7 0.2,3.4 0.7,5.1 h 39.8 c 0.4,-1.7 0.7,-3.4 0.7,-5.1 0,0 -41.2,0 -41.2,0 z"
id="path41"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,104.6 h 112.8 c 0.2,-1.7 0.3,-3.4 0.3,-5.1 H 37.9 Z"
id="path43"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,130.3 v 5.1 h 98.3 c 1.6,-1.6 3.1,-3.3 4.4,-5.1 z"
id="path45"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,68.6 v 5.1 H 144 c -1,-1.8 -2.2,-3.5 -3.4,-5.1 z"
id="path47"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 58.7,48 h -0.2 c -5,0 -9.8,1.8 -13.6,5.1 h 77 C 114.9,49.7 107.3,48 99.6,48 Z"
id="path49"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="M 37.9,78.9 V 84 h 110.7 c -0.6,-1.7 -1.2,-3.5 -1.9,-5.1 z"
id="path51"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,120 v 5.1 H 144 c 1,-1.7 1.8,-3.4 2.6,-5.1 z"
id="path53"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,109.7 v 5.1 h 110.7 c 0.5,-1.7 1,-3.4 1.3,-5.1 z"
id="path55"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><path
class="st2"
d="m 37.9,89.3 v 5.1 h 112.8 c -0.2,-1.7 -0.4,-3.4 -0.8,-5.1 z"
id="path57"
inkscape:connector-curvature="0"
style="fill:#f69e98" /><circle
transform="matrix(0.8192,-0.5736,0.5736,0.8192,-28.7665,45.9782)"
class="st0"
cx="58.5"
cy="68.599998"
id="ellipse59"
r="20.6"
style="fill:#c7bdcd" /><path
class="st0"
d="m 147.3,159.6 c 6.5,9.3 4.3,22.1 -5.1,28.6 -9.4,6.5 -22.1,4.3 -28.6,-5.1 l -30.8,-44 c -6.5,-9.3 -4.2,-22.1 5.1,-28.6 9.3,-6.5 22.1,-4.2 28.6,5.1 z"
id="path61"
inkscape:connector-curvature="0"
style="fill:#c7bdcd" /></g></svg>

Before

Width:  |  Height:  |  Size: 8.1 KiB

View file

@ -1,110 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 164.01289 144.2"
xml:space="preserve"
sodipodi:docname="riot-im-logo-5.svg"
width="164.01289"
height="144.2"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs40" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview38"
showgrid="false"
inkscape:zoom="0.98333333"
inkscape:cx="82.212895"
inkscape:cy="72.1"
inkscape:window-x="1100"
inkscape:window-y="295"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style2">
.st0{fill:#AFDBC5;}
.st1{fill:#764D80;}
</style><g
id="Layer_3"
transform="translate(-37.787105,-47.9)"><g
id="g26"><g
id="g24"><g
id="g12"><path
class="st0"
d="M 183.6,80.7 H 200 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.9 -0.7,-1.6 -1.6,-1.6 h -16.4 c -0.9,0 -1.6,0.7 -1.6,1.6 0,0.9 0.7,1.6 1.6,1.6 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 183.6,51.3 h 4.9 v 5 0 l -5.8,4 c -0.7,0.5 -0.9,1.5 -0.4,2.3 0.5,0.7 1.5,0.9 2.3,0.4 l 4.6,-3.2 c 1.1,2.2 3.3,3.6 5.9,3.6 3.6,0 6.6,-3 6.6,-6.6 v -7.2 0 c 0,-0.6 -0.3,-1.1 -0.7,-1.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.3 v 0 h -9.8 -6.5 c -0.9,0 -1.6,0.7 -1.6,1.6 -0.2,1.1 0.5,1.8 1.4,1.8 z m 14.7,5.6 c 0,1.8 -1.5,3.3 -3.3,3.3 -1.8,0 -3.3,-1.5 -3.3,-3.3 v -5.6 h 6.5 z"
id="path6"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 200,123.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 4.9 h -14.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 0 c 0,0.9 0.7,1.6 1.6,1.6 h 14.7 v 5 c 0,0.9 0.7,1.6 1.6,1.6 0.9,0 1.6,-0.7 1.6,-1.6 v -6.6 0 -6.5 c 0,-0.9 -0.7,-1.6 -1.6,-1.6 z"
id="path8"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 191.8,94.5 c -5.5,0 -10,4.5 -10,10 0,5.5 4.5,10 10,10 5.5,0 10,-4.5 10,-10 0,-5.5 -4.5,-10 -10,-10 z m 0,16.7 c -3.7,0 -6.7,-3 -6.7,-6.7 0,-3.7 3,-6.7 6.7,-6.7 3.7,0 6.7,3 6.7,6.7 0,3.7 -3,6.7 -6.7,6.7 z"
id="path10"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /></g><g
id="g18"><path
class="st0"
d="m 201.1,157 c -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.4,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.4 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.3,0 0.7,-0.1 1.1,-0.4 0.3,-0.3 0.4,-0.6 0.4,-1.1 0,-0.4 -0.1,-0.8 -0.4,-1.1 z"
id="path14"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 201.5,175.3 v -0.2 c 0,-0.4 -0.1,-0.8 -0.4,-1.1 -0.3,-0.3 -0.6,-0.4 -1.1,-0.4 h -16.5 c -0.3,0 -0.7,0 -1.1,0.3 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 h 12.1 l -7.3,4.9 c -0.4,0.4 -0.6,0.8 -0.6,1.3 0,0.5 0.3,1 0.7,1.3 l 7.3,5 h -12.1 c -0.3,0 -0.7,0.1 -1.1,0.4 -0.3,0.3 -0.4,0.6 -0.4,1.1 0,0.5 0.1,0.7 0.4,1.1 0.3,0.4 0.6,0.4 1.1,0.4 H 200 c 0.4,0 0.7,-0.1 1.1,-0.4 0.4,-0.3 0.4,-0.6 0.4,-1.1 v -0.2 c 0,-0.5 -0.1,-1.1 -0.7,-1.4 l -9.2,-6.1 9.2,-6.1 c 0.4,-0.3 0.7,-0.8 0.7,-1.4 z"
id="path16"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /></g><g
id="g22"><path
class="st0"
d="m 190.7,146.1 c 0.3,0 0.6,0.1 0.9,0.4 0.2,0.2 0.4,0.5 0.4,0.9 0,0.3 -0.1,0.6 -0.4,0.9 -0.2,0.2 -0.5,0.4 -0.9,0.4 h -0.5 c -0.3,0 -0.6,-0.1 -0.9,-0.4 -0.2,-0.2 -0.4,-0.5 -0.4,-0.9 0,-0.4 0.1,-0.7 0.4,-0.9 0.2,-0.2 0.5,-0.4 0.9,-0.4 z"
id="path20"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /></g></g></g></g><g
id="g35"
transform="translate(-37.787105,-47.9)"><path
class="st1"
d="M 99.5,48.1 H 58.4 c -11.4,0 -20.6,9.2 -20.6,20.6 0,0 0,0 0,0 v 102.8 c 0,11.4 9.2,20.6 20.6,20.6 11.4,0 20.6,-9.2 20.6,-20.6 v -20.6 h 20.6 c 28.4,0 51.4,-23 51.4,-51.4 0,-28.4 -23.2,-51.4 -51.5,-51.4 z"
id="path29"
inkscape:connector-curvature="0"
style="fill:#764d80" /><circle
transform="matrix(0.8211,-0.5708,0.5708,0.8211,-28.7968,45.5905)"
class="st0"
cx="58.299999"
cy="68.699997"
id="ellipse31"
r="20.5"
style="fill:#afdbc5" /><path
class="st0"
d="m 147.2,159.6 c 6.5,9.3 4.3,22.1 -5.1,28.6 -9.4,6.5 -22.1,4.3 -28.6,-5.1 l -30.8,-44 c -6.5,-9.3 -4.2,-22.1 5.1,-28.6 9.3,-6.5 22.1,-4.2 28.6,5.1 z"
id="path33"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /></g></svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.8 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#764d80;}.cls-2{fill:#7dc8a2;}.cls-3{fill:#afdbc5;}</style></defs><title>Asset 4</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-1" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-1" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-1" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path class="cls-2" d="M62.33,0H21.22A20.56,20.56,0,0,0,.66,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H62.33A51.38,51.38,0,0,0,62.33,0Z"/><path class="cls-3" d="M21.22,138.81A15.45,15.45,0,0,1,5.79,123.37V20.57A15.45,15.45,0,0,1,21.09,5.14H62.33a46.26,46.26,0,0,1,0,92.51H36.65v25.71A15.45,15.45,0,0,1,21.22,138.81Z"/><path class="cls-2" d="M21.22,133.68a10.32,10.32,0,0,1-10.3-10.3V20.57A10.33,10.33,0,0,1,21,10.27H62.33a41.13,41.13,0,0,1,0,82.26H31.52v30.84A10.32,10.32,0,0,1,21.22,133.68Z"/><path class="cls-3" d="M21.22,128.55A5.18,5.18,0,0,1,16,123.37V20.57a5.2,5.2,0,0,1,5-5.17H62.33a36,36,0,0,1,0,72H26.39v36A5.18,5.18,0,0,1,21.22,128.55Z"/><path class="cls-2" d="M21.27,82.28H62.33a30.87,30.87,0,0,0,0-61.75H21.22Z"/><path class="cls-3" d="M26.39,77.15l0-51.49h36a25.75,25.75,0,0,1,0,51.49Z"/><path class="cls-2" d="M31.51,72l0-41.23H62.33a20.62,20.62,0,0,1,0,41.23Z"/><path class="cls-3" d="M36.64,66.9l0-31H62.33a15.49,15.49,0,0,1,0,31Z"/><path class="cls-2" d="M41.76,61.77l0-20.72H62.33a10.36,10.36,0,0,1,0,20.72Z"/><path class="cls-3" d="M46.89,56.64V46.18H62.33a5.23,5.23,0,0,1,0,10.47Z"/><circle class="cls-1" cx="20.56" cy="20.57" r="20.56" transform="translate(-8.08 15.51) rotate(-35)"/><path class="cls-1" d="M109.34,111.57a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.55,67.58Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.36 143.93"><defs><style type="text/css">.cls-1{fill:#764d80;}.cls-2{fill:#f69e98;}</style></defs><title>Asset 2</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><path class="cls-2" d="M20.56,139.54A16.19,16.19,0,0,1,4.39,123.37V20.57a16.21,16.21,0,0,1,16-16.17H61.67a47,47,0,0,1,0,94H36.73v25A16.19,16.19,0,0,1,20.56,139.54ZM20.39,5.9A14.7,14.7,0,0,0,5.89,20.57v102.8a14.67,14.67,0,0,0,29.34,0V96.9H61.67a45.49,45.49,0,0,0,0-91H20.39Z"/><path class="cls-2" d="M20.56,134.4a11,11,0,0,1-11-11V20.57a11.09,11.09,0,0,1,10.79-11H61.67a41.85,41.85,0,0,1,0,83.7H31.59v30.11A11,11,0,0,1,20.56,134.4ZM20.3,11A9.57,9.57,0,0,0,11,20.57v102.8a9.53,9.53,0,1,0,19.05,0V91.75H61.67a40.35,40.35,0,0,0,0-80.7H20.3Z"/><path class="cls-2" d="M20.56,129.25a5.89,5.89,0,0,1-5.88-5.88V20.57a5.94,5.94,0,0,1,5.61-5.88H61.67a36.71,36.71,0,0,1,0,73.42H26.44v35.25A5.89,5.89,0,0,1,20.56,129.25ZM20.31,16.19a4.42,4.42,0,0,0-4.13,4.38v102.8a4.38,4.38,0,0,0,8.77,0V86.61H61.67a35.21,35.21,0,0,0,0-70.42Z"/><path class="cls-2" d="M61.67,83H19.81V19.83H61.67a31.57,31.57,0,0,1,0,63.14Zm-40.36-1.5H61.67a30.07,30.07,0,0,0,0-60.14H21.32Z"/><path class="cls-2" d="M61.67,77.83H25V25H61.67a26.43,26.43,0,0,1,0,52.85Zm-35.22-1.5H61.67a24.93,24.93,0,0,0,0-49.85H26.46Z"/><path class="cls-2" d="M61.67,72.69H30.1V30.12H61.67a21.29,21.29,0,0,1,0,42.57ZM31.6,71.19H61.67a19.79,19.79,0,0,0,0-39.57H31.6Z"/><path class="cls-2" d="M61.67,67.55H35.24V35.26H61.67a16.14,16.14,0,0,1,0,32.29ZM36.74,66H61.67a14.64,14.64,0,0,0,0-29.29H36.74Z"/><path class="cls-2" d="M61.67,62.41H40.38v-22H61.67a11,11,0,0,1,0,22Zm-19.79-1.5H61.67a9.5,9.5,0,0,0,0-19H41.88Z"/><path class="cls-2" d="M61.67,57.26H45.52V45.54H61.67a5.86,5.86,0,0,1,0,11.72ZM47,55.76H61.67a4.36,4.36,0,0,0,0-8.72H47Z"/><path class="cls-2" d="M61.18,52.16H51.89a.75.75,0,1,1,0-1.5h9.29a.75.75,0,0,1,0,1.5Z"/><path class="cls-2" d="M20.56,124.12a.75.75,0,0,1-.75-.75v-36a.75.75,0,0,1,1.5,0v36A.75.75,0,0,1,20.56,124.12Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/><path class="cls-2" d="M145.91,51.12h25.61a2.57,2.57,0,0,0,0-5.14H145.91a2.57,2.57,0,1,0,0,5.14Z"/><path class="cls-2" d="M145.91,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,171.51,0H145.91a2.57,2.57,0,1,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M171.51,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23a2.57,2.57,0,0,0-2.57,2.57h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,171.51,118.28Z"/><path class="cls-2" d="M158.71,72.63a15.65,15.65,0,1,0,15.65,15.65A15.67,15.67,0,0,0,158.71,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,158.71,98.79Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 3 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#fac79e;}.cls-2{fill:#e45e5d;}.cls-3{fill:#f8a05f;}</style></defs><title>Asset 5</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-1" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-1" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-1" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path class="cls-2" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><polygon class="cls-3" points="47.03 0.01 40.32 0.01 0 48.06 0 56.05 47.03 0.01"/><polygon class="cls-3" points="60.45 0.01 53.74 0.01 0 64.05 0 72.04 60.45 0.01"/><path class="cls-3" d="M72.83,1.24a51,51,0,0,0-5.9-1L0,80v8Z"/><polygon class="cls-3" points="33.61 0.01 26.9 0.01 0 32.06 0 40.06 33.61 0.01"/><path class="cls-3" d="M83.27,4.78a51,51,0,0,0-5-2L0,96v8Z"/><path class="cls-3" d="M41.12,102.78h.18l64.78-77.2a51.55,51.55,0,0,0-2.94-4.49L5.55,137.38a20.62,20.62,0,0,0,3.95,3.29L41.12,103Z"/><path class="cls-3" d="M112.22,42.23l-50.8,60.54h.25a51.55,51.55,0,0,0,6.85-.47L113,49.3A51.32,51.32,0,0,0,112.22,42.23Z"/><path class="cls-3" d="M40.71,127.46l-12.59,15A20.58,20.58,0,0,0,40.71,127.46Z"/><path class="cls-3" d="M110,68.88a51,51,0,0,0,2.67-11.18L76.73,100.52a51.1,51.1,0,0,0,10.6-4.64Z"/><path class="cls-3" d="M92.22,10.1a51.58,51.58,0,0,0-4.3-2.87L0,112v8Z"/><path class="cls-3" d="M99.83,17q-1.73-1.92-3.64-3.66L.42,127.5a20.41,20.41,0,0,0,2,5.58Z"/><path class="cls-3" d="M41.12,119v-8l-26.82,32a20.53,20.53,0,0,0,5.9,1Z"/><path class="cls-3" d="M110.71,36a51,51,0,0,0-2.09-5.5L48,102.78h6.71Z"/><circle class="cls-1" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-1" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 175.64 143.93"><defs><style type="text/css">.cls-1{fill:#e45e5d;}.cls-2{fill:#c7bdcd;}.cls-3{fill:#f69e98;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><path class="cls-2" d="M147.19,51.12h25.61a2.57,2.57,0,1,0,0-5.14H147.19a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-2" d="M147.19,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.79,0H147.19a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M172.79,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23a2.57,2.57,0,0,0-2.57,2.57h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.79,118.28Z"/><path class="cls-2" d="M160,72.63a15.65,15.65,0,1,0,15.65,15.65A15.67,15.67,0,0,0,160,72.63Zm0,26.16A10.51,10.51,0,1,1,170.5,88.28,10.52,10.52,0,0,1,160,98.79Z"/><path class="cls-3" d="M2.77,133.64A20.62,20.62,0,0,0,7,138.77H34.14a20.62,20.62,0,0,0,4.21-5.13Z"/><path class="cls-3" d="M0,92.52v5.14H84a51.48,51.48,0,0,0,8.41-5.14Z"/><rect class="cls-3" y="102.8" width="41.12" height="5.13"/><rect class="cls-3" y="113.08" width="41.12" height="5.14"/><path class="cls-3" d="M.68,15.41H98.3a51.8,51.8,0,0,0-5.86-5.14H2.78A20.41,20.41,0,0,0,.68,15.41Z"/><path class="cls-3" d="M0,123.36H0a20.53,20.53,0,0,0,.67,5.12H40.45a20.53,20.53,0,0,0,.67-5.12H0Z"/><path class="cls-3" d="M0,56.53H112.8c.17-1.69.26-3.4.26-5.13H0Z"/><path class="cls-3" d="M0,82.24v5.14H98.32a51.79,51.79,0,0,0,4.43-5.14Z"/><path class="cls-3" d="M0,20.57V25.7H106.14a51.58,51.58,0,0,0-3.39-5.14Z"/><path class="cls-3" d="M20.81,0h-.25A20.46,20.46,0,0,0,7,5.14H84A51.07,51.07,0,0,0,61.67,0Z"/><path class="cls-3" d="M0,30.85V36H110.69a51,51,0,0,0-1.94-5.14Z"/><path class="cls-3" d="M0,72v5.13H106.14A51.24,51.24,0,0,0,108.75,72Z"/><path class="cls-3" d="M0,61.68v5.14H110.69A50.92,50.92,0,0,0,112,61.68Z"/><path class="cls-3" d="M0,41.22v5.14H112.8a51.15,51.15,0,0,0-.77-5.14Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,0,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#764d80;}.cls-2{fill:#afdbc5;}</style></defs><title>Asset 1</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="matrix(0.82, -0.57, 0.57, 0.82, -8.07, 15.53)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/><path class="cls-2" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-2" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,1,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-2" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#fff;}</style></defs><title>Asset 6</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path d="M62.33,0H21.22A20.56,20.56,0,0,0,.66,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H62.33A51.38,51.38,0,0,0,62.33,0Z"/><path class="cls-1" d="M21.22,138.81A15.45,15.45,0,0,1,5.79,123.37V20.57A15.45,15.45,0,0,1,21.09,5.14H62.33a46.26,46.26,0,0,1,0,92.51H36.65v25.71A15.45,15.45,0,0,1,21.22,138.81Z"/><path d="M21.22,133.68a10.32,10.32,0,0,1-10.3-10.3V20.57A10.33,10.33,0,0,1,21,10.27H62.33a41.13,41.13,0,0,1,0,82.26H31.52v30.84A10.32,10.32,0,0,1,21.22,133.68Z"/><path class="cls-1" d="M21.22,128.55A5.18,5.18,0,0,1,16,123.37V20.57a5.2,5.2,0,0,1,5-5.17H62.33a36,36,0,0,1,0,72H26.39v36A5.18,5.18,0,0,1,21.22,128.55Z"/><path d="M21.27,82.28H62.33a30.87,30.87,0,0,0,0-61.75H21.22Z"/><path class="cls-1" d="M26.39,77.15l0-51.49h36a25.75,25.75,0,0,1,0,51.49Z"/><path d="M31.51,72l0-41.23H62.33a20.62,20.62,0,0,1,0,41.23Z"/><path class="cls-1" d="M36.64,66.9l0-31H62.33a15.49,15.49,0,0,1,0,31Z"/><path d="M41.76,61.77l0-20.72H62.33a10.36,10.36,0,0,1,0,20.72Z"/><path class="cls-1" d="M46.89,56.64V46.18H62.33a5.23,5.23,0,0,1,0,10.47Z"/><circle cx="20.56" cy="20.57" r="20.56" transform="translate(-8.08 15.51) rotate(-35)"/><path d="M109.34,111.57a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.55,67.58Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2 KiB

View file

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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"
viewBox="0 0 400 400" style="enable-background:new 0 0 400 400;" xml:space="preserve">
<style type="text/css">
.st0{fill:#7DC8A2;}
.st1{fill:#AFDBC5;}
.st2{fill:#764D80;}
</style>
<g>
<path class="st0" d="M212.8,38.8h-91.2c-0.2,0-0.4,0-0.6,0c-25.3,0-45.9,20.5-45.9,45.9v229.5c0,25.3,20.5,45.9,45.9,45.9
s45.9-20.5,45.9-45.9v-45.9h45.9c63.2,0,114.7-51.5,114.7-114.7S276,38.8,212.8,38.8z"/>
<path class="st1" d="M121,348.6c-19,0-34.4-15.5-34.4-34.4V84.7c0-18.9,15.3-34.3,34.2-34.4c0.2,0,0.5,0,0.7,0h91.3
c56.9,0,103.3,46.3,103.3,103.3s-46.3,103.3-103.3,103.3h-57.3v57.4C155.4,333.2,140,348.6,121,348.6z"/>
<path class="st0" d="M121,337.2c-12.7,0-23-10.3-23-23V84.7c0-12.5,10.1-22.7,22.5-23c0.2,0,0.5,0,0.7,0l91.5,0
c50.6,0,91.8,41.2,91.8,91.8s-41.2,91.8-91.8,91.8H144v68.8C144,326.9,133.7,337.2,121,337.2z"/>
<path class="st1" d="M121,325.7c-6.4,0-11.6-5.2-11.6-11.6V84.7c0-6.2,5-11.3,11.1-11.5l0.5,0l91.8,0c44.3,0,80.4,36.1,80.4,80.4
s-36,80.4-80.4,80.4h-80.2v80.3C132.6,320.5,127.4,325.7,121,325.7z"/>
<path class="st0" d="M121.1,222.4h91.7c38,0,68.9-30.9,68.9-68.9s-30.9-68.9-68.9-68.9H121L121.1,222.4z"/>
<path class="st1" d="M132.5,211l-0.1-114.9h80.3c31.7,0,57.5,25.8,57.5,57.5S244.5,211,212.8,211H132.5z"/>
<path class="st0" d="M144,199.6l-0.1-92h68.9c25.4,0,46,20.6,46,46s-20.6,46-46,46H144z"/>
<path class="st1" d="M155.4,188.1l-0.1-69.1h57.4c19.1,0,34.6,15.5,34.6,34.6s-15.5,34.6-34.6,34.6H155.4z"/>
<path class="st0" d="M166.9,176.7l0-46.3h45.9c12.8,0,23.1,10.4,23.1,23.1s-10.4,23.1-23.1,23.1H166.9z"/>
<path class="st1" d="M178.3,165.2l0-23.4h34.5c6.4,0,11.7,5.2,11.7,11.7s-5.2,11.7-11.7,11.7H178.3z"/>
<g>
<ellipse transform="matrix(0.8192 -0.5736 0.5736 0.8192 -26.9642 83.8822)" class="st2" cx="119.5" cy="84.7" rx="45.9" ry="45.9"/>
<path class="st2" d="M317.7,287.8c14.5,20.8,9.5,49.4-11.3,63.9c-20.8,14.5-49.4,9.5-63.9-11.3l-68.7-98.2
c-14.5-20.8-9.5-49.4,11.3-63.9c20.8-14.5,49.4-9.5,63.9,11.3L317.7,287.8z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -1,169 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 163.57917 144.19999"
xml:space="preserve"
id="svg75"
sodipodi:docname="riot.im logo.svg"
width="163.57916"
height="144.2"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"><metadata
id="metadata81"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs79" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview77"
showgrid="false"
inkscape:zoom="0.28031832"
inkscape:cx="73.079153"
inkscape:cy="50.349988"
inkscape:window-x="1067"
inkscape:window-y="442"
inkscape:window-maximized="0"
inkscape:current-layer="svg75" /><style
type="text/css"
id="style2">
.st0{fill:#7DC8A2;}
.st1{fill:#AFDBC5;}
.st2{fill:#764D80;}
.st3{fill:#764D80;stroke:#764D80;stroke-miterlimit:10;}
</style><g
id="Grid"
transform="translate(-522.22083,-327.1)"><g
id="g4" /><g
id="g6" /><g
id="g8" /><g
id="g10" /><g
id="g12" /></g><g
id="Design"
transform="translate(-522.22083,-327.1)"><g
id="g17"><g
id="g15" /></g></g><g
id="Layer_3"
transform="translate(-522.22083,-327.1)"><g
id="g72"><g
id="g48"><g
id="g46"><path
class="st0"
d="m 584.6,327.3 h -40.9 c -0.1,0 -0.2,0 -0.3,0 -11.4,0 -20.6,9.2 -20.6,20.6 v 102.8 c 0,11.4 9.2,20.6 20.6,20.6 11.4,0 20.6,-9.2 20.6,-20.6 v -20.6 h 20.6 c 28.3,0 51.4,-23.1 51.4,-51.4 0,-28.3 -23.1,-51.4 -51.4,-51.4 z"
id="path20"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="m 543.5,466.1 c -8.5,0 -15.4,-6.9 -15.4,-15.4 V 347.8 c 0,-8.5 6.9,-15.4 15.3,-15.4 0.1,0 0.2,0 0.3,0 h 40.9 c 25.5,0 46.3,20.8 46.3,46.3 0,25.5 -20.8,46.3 -46.3,46.3 h -25.7 v 25.7 c 0,8.4 -6.9,15.4 -15.4,15.4 z"
id="path22"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 543.5,460.9 c -5.7,0 -10.3,-4.6 -10.3,-10.3 V 347.8 c 0,-5.6 4.5,-10.2 10.1,-10.3 0.1,0 0.2,0 0.3,0 h 41 c 22.7,0 41.1,18.5 41.1,41.1 0,22.6 -18.5,41.1 -41.1,41.1 h -30.8 v 30.8 c 0,5.8 -4.6,10.4 -10.3,10.4 z"
id="path24"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="m 543.5,455.8 c -2.9,0 -5.2,-2.3 -5.2,-5.2 V 347.8 c 0,-2.8 2.2,-5.1 5,-5.2 h 0.2 41.1 c 19.9,0 36,16.2 36,36 0,19.8 -16.1,36 -36,36 h -35.9 v 36 c 0,2.9 -2.3,5.2 -5.2,5.2 z"
id="path26"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 543.5,409.5 h 41.1 c 17,0 30.9,-13.8 30.9,-30.9 0,-17.1 -13.8,-30.9 -30.9,-30.9 h -41.1 z"
id="path28"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="m 548.7,404.4 v -51.5 h 36 c 14.2,0 25.7,11.5 25.7,25.7 0,14.2 -11.5,25.7 -25.7,25.7 h -36 z"
id="path30"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 553.8,399.3 v -41.2 h 30.8 c 11.4,0 20.6,9.2 20.6,20.6 0,11.4 -9.2,20.6 -20.6,20.6 z"
id="path32"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="m 558.9,394.2 v -31 h 25.7 c 8.5,0 15.5,6.9 15.5,15.5 0,8.6 -6.9,15.5 -15.5,15.5 z"
id="path34"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><path
class="st0"
d="m 564,389 v -20.7 h 20.6 c 5.7,0 10.4,4.6 10.4,10.4 0,5.8 -4.6,10.4 -10.4,10.4 H 564 Z"
id="path36"
inkscape:connector-curvature="0"
style="fill:#7dc8a2" /><path
class="st1"
d="m 569.2,383.9 v -10.5 h 15.4 c 2.9,0 5.2,2.3 5.2,5.2 0,2.9 -2.3,5.2 -5.2,5.2 h -15.4 z"
id="path38"
inkscape:connector-curvature="0"
style="fill:#afdbc5" /><g
id="g44"><circle
transform="matrix(0.8192,-0.5736,0.5736,0.8192,-101.3379,374.2691)"
class="st2"
cx="542.79999"
cy="347.79999"
id="ellipse40"
r="20.6"
style="fill:#764d80" /><path
class="st2"
d="m 631.6,438.8 c 6.5,9.3 4.3,22.1 -5,28.6 -9.3,6.5 -22.1,4.3 -28.6,-5 l -30.8,-44 c -6.5,-9.3 -4.3,-22.1 5,-28.6 9.3,-6.5 22.1,-4.3 28.6,5 z"
id="path42"
inkscape:connector-curvature="0"
style="fill:#764d80" /></g></g></g><g
id="g70"><g
id="g58"><path
class="st2"
d="M 667.6,359.9 H 684 c 0.9,0 1.6,-0.7 1.6,-1.6 0,-0.9 -0.7,-1.6 -1.6,-1.6 h -16.4 c -0.9,0 -1.6,0.7 -1.6,1.6 0,0.9 0.7,1.6 1.6,1.6 z"
id="path50"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 667.6,330.5 h 4.9 v 5 c 0,0 0,0 0,0 l -5.8,4 c -0.7,0.5 -0.9,1.5 -0.4,2.3 0.5,0.7 1.5,0.9 2.3,0.4 l 4.6,-3.2 c 1.1,2.2 3.3,3.6 5.9,3.6 3.6,0 6.6,-3 6.6,-6.6 v -7.2 c 0,0 0,0 0,0 0,-0.6 -0.3,-1.1 -0.7,-1.4 -0.3,-0.2 -0.6,-0.3 -0.9,-0.3 v 0 h -9.8 -6.5 c -0.9,0 -1.6,0.7 -1.6,1.6 -0.2,1.1 0.5,1.8 1.4,1.8 z m 14.7,5.6 c 0,1.8 -1.5,3.3 -3.3,3.3 -1.8,0 -3.3,-1.5 -3.3,-3.3 v -5.6 h 6.5 v 5.6 z"
id="path52"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 684,402.9 c -0.9,0 -1.6,0.7 -1.6,1.6 v 4.9 h -14.7 c -0.9,0 -1.6,0.7 -1.6,1.6 v 0 c 0,0.9 0.7,1.6 1.6,1.6 h 14.7 v 5 c 0,0.9 0.7,1.6 1.6,1.6 0.9,0 1.6,-0.7 1.6,-1.6 v -6.6 0 -6.5 c 0,-0.9 -0.7,-1.6 -1.6,-1.6 z"
id="path54"
inkscape:connector-curvature="0"
style="fill:#764d80" /><path
class="st2"
d="m 675.8,373.7 c -5.5,0 -10,4.5 -10,10 0,5.5 4.5,10 10,10 5.5,0 10,-4.5 10,-10 0,-5.5 -4.5,-10 -10,-10 z m 0,16.7 c -3.7,0 -6.7,-3 -6.7,-6.7 0,-3.7 3,-6.7 6.7,-6.7 3.7,0 6.7,3 6.7,6.7 0,3.7 -3,6.7 -6.7,6.7 z"
id="path56"
inkscape:connector-curvature="0"
style="fill:#764d80" /></g><g
id="g64"><path
class="st3"
d="M 667.5,436.3 H 684 c 0.3,0 0.5,0.1 0.7,0.3 0.2,0.2 0.3,0.4 0.3,0.7 0,0.3 -0.1,0.5 -0.3,0.7 -0.2,0.2 -0.5,0.3 -0.7,0.3 h -16.5 c -0.3,0 -0.5,-0.1 -0.7,-0.3 -0.2,-0.2 -0.3,-0.4 -0.3,-0.7 0,-0.3 0.1,-0.5 0.3,-0.7 0.2,-0.2 0.4,-0.3 0.7,-0.3 z"
id="path60"
inkscape:connector-curvature="0"
style="fill:#764d80;stroke:#764d80;stroke-miterlimit:10" /><path
class="st3"
d="M 667.5,453.3 H 684 c 0.3,0 0.5,0.1 0.7,0.3 0.2,0.2 0.3,0.4 0.3,0.7 v 0.2 c 0,0.4 -0.2,0.7 -0.5,1 l -9.8,6.5 9.8,6.5 c 0.4,0.2 0.5,0.5 0.5,1 v 0.2 c 0,0.3 -0.1,0.5 -0.3,0.7 -0.2,0.2 -0.4,0.3 -0.7,0.3 h -16.5 c -0.3,0 -0.5,-0.1 -0.7,-0.3 -0.2,-0.2 -0.3,-0.4 -0.3,-0.7 0,-0.3 0.1,-0.5 0.3,-0.7 0.2,-0.2 0.5,-0.3 0.7,-0.3 h 13.7 l -8.6,-5.9 c -0.3,-0.2 -0.5,-0.5 -0.5,-0.9 0,-0.3 0.2,-0.6 0.5,-0.9 l 8.6,-5.8 h -13.7 c -0.3,0 -0.5,-0.1 -0.7,-0.3 -0.2,-0.2 -0.3,-0.4 -0.3,-0.7 0,-0.3 0.1,-0.5 0.3,-0.7 0.2,-0.2 0.4,-0.2 0.7,-0.2 z"
id="path62"
inkscape:connector-curvature="0"
style="fill:#764d80;stroke:#764d80;stroke-miterlimit:10" /></g><g
id="g68"><path
class="st3"
d="m 674.7,425.3 c 0.3,0 0.6,0.1 0.9,0.4 0.2,0.2 0.4,0.5 0.4,0.9 0,0.3 -0.1,0.6 -0.4,0.9 -0.2,0.2 -0.5,0.4 -0.9,0.4 h -0.5 c -0.3,0 -0.6,-0.1 -0.9,-0.4 -0.2,-0.2 -0.4,-0.5 -0.4,-0.9 0,-0.4 0.1,-0.7 0.4,-0.9 0.2,-0.2 0.5,-0.4 0.9,-0.4 z"
id="path66"
inkscape:connector-curvature="0"
style="fill:#764d80;stroke:#764d80;stroke-miterlimit:10" /></g></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 8.7 KiB

View file

@ -88,7 +88,7 @@ limitations under the License.
// overrides of .mx_Login // overrides of .mx_Login
.mx_Login_box { .mx_AuthPage_modal {
width: 330px; width: 330px;
min-height: initial; min-height: initial;
padding-top: 40px; padding-top: 40px;
@ -100,13 +100,13 @@ limitations under the License.
font-size: 16px; font-size: 16px;
line-height: 25px; line-height: 25px;
background-color: $form-bg-color; background-color: $form-bg-color;
background-image: url(../../themes/status/img/dot.svg); background-image: url("$(status)/img/dot.svg");
box-shadow: 0px 5px 16px 0px rgba(25,12,46,0.16); box-shadow: 0px 5px 16px 0px rgba(25,12,46,0.16);
position: relative; position: relative;
text-align: center; text-align: center;
} }
.mx_Login_logo { .mx_AuthHeader_logo {
background-color: #fff; background-color: #fff;
width: 74px; width: 74px;
height: 74px; height: 74px;
@ -118,13 +118,13 @@ limitations under the License.
margin-left: -36px; margin-left: -36px;
} }
.mx_Login_logo img { .mx_AuthHeader_logo img {
width: 36px; width: 36px;
height: 36px; height: 36px;
padding: 19px; padding: 19px;
} }
.mx_Login_box h2 { .mx_AuthPage_modal h2 {
text-align: center; text-align: center;
color: $form-fg-color; color: $form-fg-color;
font-size: 25px; font-size: 25px;

View file

@ -0,0 +1,15 @@
@font-face {
font-family:PostGrotesk-Medium;
src:url('https://status.im/fonts/PostGrotesk-Medium.eot');
src:url('https://status.im/fonts/PostGrotesk-Medium.eot?#iefix') format("embedded-opentype"),url('https://status.im/fonts/PostGrotesk-Medium.woff') format("woff"),url('https://status.im/fonts/PostGrotesk-Medium.svg#PostGrotesk-Medium') format("svg");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family:PostGrotesk-Book;
src:url('https://status.im/fonts/PostGrotesk-Book.eot');
src:url('https://status.im/fonts/PostGrotesk-Book.eot?#iefix') format("embedded-opentype"),url('https://status.im/fonts/PostGrotesk-Book.woff') format("woff"),url('https://status.im/fonts/PostGrotesk-Book.svg#PostGrotesk-Book') format("svg");
font-weight: 400;
font-style: normal;
}

View file

@ -0,0 +1,5 @@
// Path from root SCSS file (such as `status.scss`) to `res` dir in `matrix-react-sdk`
$res: ../../../../node_modules/matrix-react-sdk/res;
// Path from root SCSS file (such as `status.scss`) to `status` dir in `riot-web`
$status: ..;

View file

@ -1,19 +1,3 @@
@font-face {
font-family:PostGrotesk-Medium;
src:url('https://status.im/fonts/PostGrotesk-Medium.eot');
src:url('https://status.im/fonts/PostGrotesk-Medium.eot?#iefix') format("embedded-opentype"),url('https://status.im/fonts/PostGrotesk-Medium.woff') format("woff"),url('https://status.im/fonts/PostGrotesk-Medium.svg#PostGrotesk-Medium') format("svg");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family:PostGrotesk-Book;
src:url('https://status.im/fonts/PostGrotesk-Book.eot');
src:url('https://status.im/fonts/PostGrotesk-Book.eot?#iefix') format("embedded-opentype"),url('https://status.im/fonts/PostGrotesk-Book.woff') format("woff"),url('https://status.im/fonts/PostGrotesk-Book.svg#PostGrotesk-Book') format("svg");
font-weight: 400;
font-style: normal;
}
// We deliberately prioritise Arial over Helvetica here due to diacritic problems (see _base.scss) // We deliberately prioritise Arial over Helvetica here due to diacritic problems (see _base.scss)
// N.B. that the status.im website uses: // N.B. that the status.im website uses:
// font-family:PostGrotesk-Book,-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif; // font-family:PostGrotesk-Book,-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
@ -68,6 +52,8 @@ $focus-bg-color: #dddddd;
// button UI (white-on-green in light skin) // button UI (white-on-green in light skin)
$accent-fg-color: #ffffff; $accent-fg-color: #ffffff;
$accent-color: #6CC1F6; $accent-color: #6CC1F6;
$accent-color-alt: $accent-color;
$accent-color-50pct: #6CC1F67F;
$accent-hover-color: #84cfff; $accent-hover-color: #84cfff;
$selection-fg-color: $primary-bg-color; $selection-fg-color: $primary-bg-color;
@ -117,7 +103,11 @@ $primary-hairline-color: #e5e5e5;
// used for the border of input text fields // used for the border of input text fields
$input-border-color: #c9cfd4; $input-border-color: #c9cfd4;
$input-darker-bg-color: #c1c9d6;
$input-darker-fg-color: #9fa9ba;
$button-bg-color: #7ac9a1;
$button-fg-color: white;
// apart from login forms, which have stronger border // apart from login forms, which have stronger border
$strong-input-border-color: #c7c7c7; $strong-input-border-color: #c7c7c7;
@ -128,6 +118,7 @@ $input-fg-color: rgba(74, 74, 74, 0.9);
// context menus // context menus
$menu-border-color: rgba(187, 187, 187, 0.5); $menu-border-color: rgba(187, 187, 187, 0.5);
$menu-bg-color: #f6f6f6; $menu-bg-color: #f6f6f6;
$menu-selected-color: #f5f8fa;
$avatar-initial-color: #ffffff; $avatar-initial-color: #ffffff;
$avatar-bg-color: transparent; $avatar-bg-color: transparent;
@ -162,6 +153,15 @@ $roomtile-name-color: #ffffff;
$roomtile-selected-bg-color: #465561; $roomtile-selected-bg-color: #465561;
$roomtile-focused-bg-color: #6d8597; $roomtile-focused-bg-color: #6d8597;
$username-variant1-color: #1e7ddc;
$username-variant2-color: #a756a8;
$username-variant3-color: #7ac9a1;
$username-variant4-color: #f2809d;
$username-variant5-color: #ffc666;
$username-variant6-color: #76ddd7;
$username-variant7-color: #45529b;
$username-variant8-color: #bfd251;
$roomsublist-background: rgba(0, 0, 0, 0.2); $roomsublist-background: rgba(0, 0, 0, 0.2);
$roomsublist-label-fg-color: #ffffff; $roomsublist-label-fg-color: #ffffff;
$roomsublist-label-bg-color: $secondary-accent-color; $roomsublist-label-bg-color: $secondary-accent-color;
@ -187,8 +187,8 @@ $event-redacted-border-color: #cccccc;
// event timestamp // event timestamp
$event-timestamp-color: #acacac; $event-timestamp-color: #acacac;
$edit-button-url: "../../img/icon_context_message.svg"; $edit-button-url: "$(res)/img/icon_context_message.svg";
$copy-button-url: "../../img/icon_copy_message.svg"; $copy-button-url: "$(res)/img/icon_copy_message.svg";
// e2e // e2e
$e2e-verified-color: #76cfa5; // N.B. *NOT* the same as $accent-color $e2e-verified-color: #76cfa5; // N.B. *NOT* the same as $accent-color

View file

@ -1,3 +1,5 @@
@import "_paths.scss";
@import "_fonts.scss";
@import "../../../../node_modules/matrix-react-sdk/res/themes/light/css/_base.scss"; @import "../../../../node_modules/matrix-react-sdk/res/themes/light/css/_base.scss";
@import "_status.scss"; @import "_status.scss";
@import "../../../../node_modules/matrix-react-sdk/res/css/_components.scss"; @import "../../../../node_modules/matrix-react-sdk/res/css/_components.scss";

View file

@ -53,15 +53,11 @@ const COPY_LIST = [
["res/home.html", "webapp"], ["res/home.html", "webapp"],
["res/home-status.html", "webapp"], ["res/home-status.html", "webapp"],
["res/home/**", "webapp/home"], ["res/home/**", "webapp/home"],
["res/vector-icons/**", "webapp/vector-icons"],
["node_modules/matrix-react-sdk/res/{fonts,img,themes,media}/**", "webapp"],
["res/themes/**", "webapp/themes"], ["res/themes/**", "webapp/themes"],
["res/vector-icons/**", "webapp/vector-icons"],
["node_modules/matrix-react-sdk/res/media/**", "webapp/media"],
["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"], ["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"],
["node_modules/emojione/assets/png/*", "webapp/emojione/png/"], ["node_modules/emojione/assets/png/*", "webapp/emojione/png/"],
// XXX: This is tied quite heavily to the matching olm.js so it really should be
// in the bundle dir with the js to avoid caching issues giving us wasm that
// doesn't match our js, but I cannot find any way to get webpack to do this.
["node_modules/olm/olm.wasm", "webapp", { directwatch: 1 }],
["node_modules/olm/olm_legacy.js", "webapp", { directwatch: 1 }], ["node_modules/olm/olm_legacy.js", "webapp", { directwatch: 1 }],
["./config.json", "webapp", { directwatch: 1 }], ["./config.json", "webapp", { directwatch: 1 }],
]; ];

View file

@ -9,45 +9,49 @@
set -e set -e
GIT_CLONE_ARGS=("$@") GIT_CLONE_ARGS=("$@")
[ -z "$defbranch" ] && defbranch="develop"
# Look in the many different CI env vars for which branch we're
# building
if [[ "$TRAVIS" == true ]]; then
curbranch="${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}"
else
# ghprbSourceBranch for jenkins github pull request builder
# GIT_BRANCH for other jenkins builds
curbranch="${ghprbSourceBranch:-$GIT_BRANCH}"
# Otherwise look at the actual branch we're on
if [ -z "$curbranch" ]
then
curbranch=`git rev-parse --abbrev-ref HEAD`
fi
fi
# Chop 'origin' off the start as jenkins ends up using
# branches on the origin, but this doesn't work if we
# specify the branch when cloning.
curbranch=${curbranch#origin/}
echo "Determined branch to be $curbranch"
# clone a specific branch of a github repo # clone a specific branch of a github repo
function clone() { function clone() {
org=$1 org=$1
repo=$2 repo=$2
branch=$3 branch=$3
# Chop 'origin' off the start as jenkins ends up using
# branches on the origin, but this doesn't work if we
# specify the branch when cloning.
branch=${branch#origin/}
if [ -n "$branch" ]
then
echo "Trying to use $org/$repo#$branch"
git clone https://github.com/$org/$repo.git $repo --branch $branch \ git clone https://github.com/$org/$repo.git $repo --branch $branch \
"${GIT_CLONE_ARGS[@]}" "${GIT_CLONE_ARGS[@]}"
return $?
fi
return 1
} }
function dodep() { function dodep() {
org=$1 org=$1
repo=$2 repo=$2
rm -rf $repo rm -rf $repo
clone $org $repo $curbranch || {
[ "$curbranch" != 'develop' ] && clone $org $repo develop # Try the PR author's branch in case it exists on the deps as well.
} || return $? # Try the target branch of the push or PR.
# Use the default branch as the last resort.
if [[ "$TRAVIS" == true ]]; then
clone $org $repo $TRAVIS_PULL_REQUEST_BRANCH ||
clone $org $repo $TRAVIS_BRANCH ||
clone $org $repo $defbranch ||
return $?
else
clone $org $repo $ghprbSourceBranch ||
clone $org $repo $GIT_BRANCH ||
clone $org $repo `git rev-parse --abbrev-ref HEAD` ||
clone $org $repo $defbranch ||
return $?
fi
echo "$repo set to branch "`git -C "$repo" rev-parse --abbrev-ref HEAD` echo "$repo set to branch "`git -C "$repo" rev-parse --abbrev-ref HEAD`

View file

@ -4,21 +4,23 @@ set -e
export NVM_DIR="$HOME/.nvm" export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm use 6 nvm use 10
set -x set -x
# check out corresponding branches of dependencies.
#
# clone the deps with depth 1: we know we will only ever need that one
# commit.
`dirname $0`/fetch-develop.deps.sh --depth 1
npm install npm install
# apparently npm 3.10.3 on node 6.4.0 doesn't upgrade #develop target with npm install unless explicitly asked. # apparently npm 3.10.3 on node 6.4.0 doesn't upgrade #develop target with npm install unless explicitly asked.
npm install olm npm install olm
# check out corresponding branches of dependencies.
#
# clone the deps with depth 1: we know we will only ever need that one
# commit.
# We need to do this after npm install otherwise modern node versions
# just reset it back.
`dirname $0`/fetch-develop.deps.sh --depth 1
# install olm. A naive 'npm i ./olm/olm-*.tgz' fails because it uses the url # install olm. A naive 'npm i ./olm/olm-*.tgz' fails because it uses the url
# from our package.json (or even matrix-js-sdk's) in preference. # from our package.json (or even matrix-js-sdk's) in preference.
# #

View file

@ -17,7 +17,6 @@ limitations under the License.
'use strict'; 'use strict';
import React from 'react';
import HomePage from 'matrix-react-sdk/lib/components/structures/HomePage'; import HomePage from 'matrix-react-sdk/lib/components/structures/HomePage';
import sanitizeHtml from 'sanitize-html'; import sanitizeHtml from 'sanitize-html';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';

View file

@ -1,5 +1,6 @@
/* /*
Copyright 2015, 2016 OpenMarket Ltd Copyright 2015, 2016 OpenMarket Ltd
Copyright 2019 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -16,14 +17,14 @@ limitations under the License.
'use strict'; 'use strict';
var React = require('react'); const React = require('react');
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import SettingsStore from 'matrix-react-sdk/lib/settings/SettingsStore'; import SettingsStore from 'matrix-react-sdk/lib/settings/SettingsStore';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'VectorLoginFooter', displayName: 'VectorAuthFooter',
statics: { statics: {
replaces: 'LoginFooter', replaces: 'AuthFooter',
}, },
render: function() { render: function() {
@ -32,12 +33,12 @@ module.exports = React.createClass({
if (SettingsStore.getValue("theme") === 'status') return <div />; if (SettingsStore.getValue("theme") === 'status') return <div />;
return ( return (
<div className="mx_Login_links"> <div className="mx_AuthFooter">
<a href="https://medium.com/@RiotChat">blog</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp; <a href="https://medium.com/@RiotChat" target="_blank" rel="noopener">blog</a>
<a href="https://twitter.com/@RiotChat">twitter</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp; <a href="https://twitter.com/@RiotChat" target="_blank" rel="noopener">twitter</a>
<a href="https://github.com/vector-im/riot-web">github</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp; <a href="https://github.com/vector-im/riot-web" target="_blank" rel="noopener">github</a>
<a href="https://matrix.org">{ _t('powered by Matrix') }</a> <a href="https://matrix.org" target="_blank" rel="noopener">{ _t('powered by Matrix') }</a>
</div> </div>
); );
} },
}); });

View file

@ -1,5 +1,6 @@
/* /*
Copyright 2015, 2016 OpenMarket Ltd Copyright 2015, 2016 OpenMarket Ltd
Copyright 2019 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -19,13 +20,12 @@ limitations under the License.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
const i = [1, 2, 3, 4, 5][Math.floor(Math.random() * 5)]; const LOGO_URI = "themes/riot/img/logos/riot-im-logo-black-text.svg";
const DEFAULT_LOGO_URI = "themes/riot/img/logos/riot-im-logo-" + i + ".svg";
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'VectorLoginHeader', displayName: 'VectorAuthHeaderLogo',
statics: { statics: {
replaces: 'LoginHeader', replaces: 'AuthHeaderLogo',
}, },
propTypes: { propTypes: {
icon: PropTypes.string, icon: PropTypes.string,
@ -33,11 +33,9 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_Login_header"> <div className="mx_AuthHeaderLogo">
<div className="mx_Login_logo"> <img src={LOGO_URI} alt="Riot" />
<img src={this.props.icon || DEFAULT_LOGO_URI} alt="Riot"/>
</div>
</div> </div>
); );
} },
}); });

View file

@ -0,0 +1,70 @@
/*
Copyright 2019 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';
const React = require('react');
import sdk from 'matrix-react-sdk/lib/index';
module.exports = React.createClass({
displayName: 'VectorAuthPage',
statics: {
replaces: 'AuthPage',
},
render: function() {
const AuthFooter = sdk.getComponent('auth.AuthFooter');
const pageStyle = {
background: 'center/cover fixed url(themes/riot/img/backgrounds/valley.jpg)',
};
const modalStyle = {
position: 'relative',
background: 'initial',
};
const blurStyle = {
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
filter: 'blur(10px)',
background: pageStyle.background,
};
const modalContentStyle = {
display: 'flex',
zIndex: 1,
background: 'rgba(255, 255, 255, 0.59)',
borderRadius: '4px',
};
return (
<div className="mx_AuthPage" style={pageStyle}>
<div className="mx_AuthPage_modal" style={modalStyle}>
<div className="mx_AuthPage_modalBlur" style={blurStyle}></div>
<div className="mx_AuthPage_modalContent" style={modalContentStyle}>
{ this.props.children }
</div>
</div>
<AuthFooter />
</div>
);
},
});

View file

@ -15,10 +15,13 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
var React = require("react"); const React = require("react");
var sanitizeHtml = require("sanitize-html");
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
/**
* This is identical to `CustomServerDialog` except for replacing "this app"
* with "Riot".
*/
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'VectorCustomServerDialog', displayName: 'VectorCustomServerDialog',
statics: { statics: {
@ -32,13 +35,17 @@ module.exports = React.createClass({
{ _t('Custom Server Options') } { _t('Custom Server Options') }
</div> </div>
<div className="mx_Dialog_content"> <div className="mx_Dialog_content">
<span dangerouslySetInnerHTML={{__html: sanitizeHtml(_t( <p>{_t(
"You can use the custom server options to sign into other Matrix "+ "You can use the custom server options to sign into other " +
"servers by specifying a different Home server URL.<br/>This allows "+ "Matrix servers by specifying a different homeserver URL. This " +
"you to use Riot with an existing Matrix account on a different home "+ "allows you to use Riot with an existing Matrix account on a " +
"server.<br/><br/>You can also set a custom identity server but you won't "+ "different homeserver.",
"be able to invite users by email address, or be invited by email address yourself.", )}</p>
))}} /> <p>{_t(
"You can also set a custom identity server, but you won't be " +
"able to invite users by email address, or be invited by email " +
"address yourself.",
)}</p>
</div> </div>
<div className="mx_Dialog_buttons"> <div className="mx_Dialog_buttons">
<button onClick={this.props.onFinished} autoFocus={true}> <button onClick={this.props.onFinished} autoFocus={true}>
@ -47,5 +54,5 @@ module.exports = React.createClass({
</div> </div>
</div> </div>
); );
} },
}); });

View file

@ -1,39 +1,21 @@
{ {
"Riot is not supported on mobile web. Install the app?": "Riot is not supported on mobile web. Install the app?",
"Riot Desktop on %(platformName)s": "Riot Desktop on %(platformName)s", "Riot Desktop on %(platformName)s": "Riot Desktop on %(platformName)s",
"Unknown device": "Unknown device", "Unknown device": "Unknown device",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s on %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s on %(osName)s",
"You need to be using HTTPS to place a screen-sharing call.": "You need to be using HTTPS to place a screen-sharing call.", "You need to be using HTTPS to place a screen-sharing call.": "You need to be using HTTPS to place a screen-sharing call.",
"Custom Server Options": "Custom Server Options",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.",
"Dismiss": "Dismiss",
"powered by Matrix": "powered by Matrix", "powered by Matrix": "powered by Matrix",
"Custom Server Options": "Custom Server Options",
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Riot with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Riot with an existing Matrix account on a different homeserver.",
"You can also set a custom identity server, but you won't be able to invite users by email address, or be invited by email address yourself.": "You can also set a custom identity server, but you won't be able to invite users by email address, or be invited by email address yourself.",
"Dismiss": "Dismiss",
"Welcome to Riot.im": "Welcome to Riot.im", "Welcome to Riot.im": "Welcome to Riot.im",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralised, encrypted chat &amp; collaboration powered by [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralised, encrypted chat &amp; collaboration powered by [matrix]",
"Search the room directory": "Search the room directory", "Sign In": "Sign In",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!", "Create Account": "Create Account",
"Need help?": "Need help?",
"Chat with Riot Bot": "Chat with Riot Bot", "Chat with Riot Bot": "Chat with Riot Bot",
"Get started with some tips from Riot Bot!": "Get started with some tips from Riot Bot!", "Explore rooms": "Explore rooms",
"General discussion about Matrix and Riot": "General discussion about Matrix and Riot", "Room Directory": "Room Directory",
"Discussion of all things Matrix!": "Discussion of all things Matrix!", "Search the room directory": "Search the room directory",
"Riot/Web &amp; Desktop chat": "Riot/Web &amp; Desktop chat", "Get started with some tips from Riot Bot!": "Get started with some tips from Riot Bot!"
"Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS &amp; matrix-ios-sdk chat",
"Riot/Android &amp; matrix-android-sdk chat": "Riot/Android &amp; matrix-android-sdk chat",
"Matrix technical discussions": "Matrix technical discussions",
"Running Matrix services": "Running Matrix services",
"Community-run support for Synapse": "Community-run support for Synapse",
"Admin support for Dendrite": "Admin support for Dendrite",
"Announcements about Synapse releases": "Announcements about Synapse releases",
"Support for those using and running matrix-appservice-irc": "Support for those using and running matrix-appservice-irc",
"Building services on Matrix": "Building services on Matrix",
"Support for those using the Matrix spec": "Support for those using the Matrix spec",
"Design and implementation of E2E in Matrix": "Design and implementation of E2E in Matrix",
"Implementing VR services with Matrix": "Implementing VR services with Matrix",
"Implementing VoIP services with Matrix": "Implementing VoIP services with Matrix",
"Discussion of the Identity Service API": "Discussion of the Identity Service API",
"Support for those using, running and writing other bridges": "Support for those using, running and writing other bridges",
"Contributing code to Matrix and Riot": "Contributing code to Matrix and Riot",
"Dev chat for the Riot/Web dev team": "Dev chat for the Riot/Web dev team",
"Dev chat for the Dendrite dev team": "Dev chat for the Dendrite dev team",
"Co-ordination for Riot translators": "Co-ordination for Riot translators"
} }

View file

@ -1 +1,39 @@
{} {
"Riot is not supported on mobile web. Install the app?": "रायट फ़ोन पर समर्थन नहीं हैं। एप्लिकेशन इनस्टॉल करना चाहेंगे ?",
"Riot Desktop on %(platformName)s": "%(platformName)s पर रायट डेस्कटॉप",
"Unknown device": "अज्ञात यन्त्र",
"%(appName)s via %(browserName)s on %(osName)s": "%(osName)s पर %(browserName)s के माध्यम से %(appName)s",
"You need to be using HTTPS to place a screen-sharing call.": "स्क्रीन साझा की कॉल करने के लिए आपको HTTPS का उपयोग करने की आवश्यकता है।",
"Custom Server Options": "कस्टम सर्वर विकल्प",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "आप एक अलग होम सर्वर यूआरएल निर्दिष्ट करके अन्य मैट्रिक्स सर्वरों में साइन इन करने के लिए कस्टम सर्वर विकल्प का उपयोग कर सकते हैं। <br/> यह आपको एक अलग होम सर्वर पर मौजूदा मैट्रिक्स खाते के साथ रायट का उपयोग करने की अनुमति देता है। <br/> <br/> आप अपना आइडेंटिटी सर्वर भी सेट कर सकते हैं लेकिन आप ईमेल पते से उपयोगकर्ताओं को आमंत्रित नहीं कर पाएंगे, या ईमेल पते से स्वयं आमंत्रित नहीं हों सकेंगे।",
"Dismiss": "खारिज",
"powered by Matrix": "मैट्रिक्स द्वारा संचालित",
"Welcome to Riot.im": "Riot.im में आपका स्वागत है",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "[मैट्रिक्स] द्वारा संचालित विकेंद्रीकृत, एन्क्रिप्टेड चैट और सहयोगिता",
"Search the room directory": "रूम डायरेक्टरी में खोजें",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "मौजूदा नेटवर्क से जुड़े मैट्रिक्स में बहुत से कमरे पहले से मौजूद हैं (स्लैक, आईआरसी, गिटर इत्यादि) या स्वतंत्र। डायरेक्टरी देखें!",
"Chat with Riot Bot": "रायट बॉट के साथ चैट करें",
"Get started with some tips from Riot Bot!": "रायट बॉट से कुछ सुझावों के साथ शुरू करें!",
"General discussion about Matrix and Riot": "मैट्रिक्स और रायट के बारे में सामान्य चर्चा",
"Discussion of all things Matrix!": "मैट्रिक्स की सभी चीजों की चर्चा!",
"Riot/Web &amp; Desktop chat": "रायट/वेब और डेस्कटॉप चैट",
"Riot/iOS &amp; matrix-ios-sdk chat": "रायट / iOS और matrix-ios-sdk चैट",
"Riot/Android &amp; matrix-android-sdk chat": "रायट / एंड्रॉइड और matrix-android-sdk चैट",
"Matrix technical discussions": "मैट्रिक्स तकनीकी चर्चाएं",
"Running Matrix services": "मैट्रिक्स सेवाएं चलाना",
"Community-run support for Synapse": "सामुदायिक चालित Synapse के लिए समर्थन",
"Admin support for Dendrite": "डेंडर्राइट के लिए व्यवस्थापक समर्थन",
"Announcements about Synapse releases": "Synapse रिलीज के बारे में घोषणाएं",
"Support for those using and running matrix-appservice-irc": "Matrix-appservice-irc का उपयोग और चलाने वाले लोगों के लिए समर्थन",
"Building services on Matrix": "मैट्रिक्स पर सेवाएं बनाना",
"Support for those using the Matrix spec": "मैट्रिक्स spec का उपयोग करने वालों के लिए समर्थन",
"Design and implementation of E2E in Matrix": "मैट्रिक्स में E2E के डिजाइन और कार्यान्वयन",
"Implementing VR services with Matrix": "मैट्रिक्स के साथ VR सेवाओं को लागू करना",
"Implementing VoIP services with Matrix": "मैट्रिक्स के साथ वीओआईपी सेवाओं को लागू करना",
"Discussion of the Identity Service API": "आइडेंटिटी सर्विस API की चर्चा",
"Support for those using, running and writing other bridges": "अन्य ब्रिज का उपयोग, चलाने और लिखने वालों के लिए समर्थन",
"Contributing code to Matrix and Riot": "मैट्रिक्स और रायट में कोड योगदान करना",
"Dev chat for the Riot/Web dev team": "रायट / वेब डेव टीम के लिए डेवलपर चैट",
"Dev chat for the Dendrite dev team": "डेन्ड्राइट देव टीम के लिए डेवलपर चैट",
"Co-ordination for Riot translators": "रायट अनुवादकों के लिए समन्वय"
}

39
src/i18n/strings/hr.json Normal file
View file

@ -0,0 +1,39 @@
{
"Riot is not supported on mobile web. Install the app?": "Riot nije podržan na mobilnom pregledniku. Instalirati aplikaciju?",
"Riot Desktop on %(platformName)s": "Riot Desktop na %(platformName)s",
"Unknown device": "Nepoznati uređaj",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s preko %(browserName)s na %(osName)s",
"You need to be using HTTPS to place a screen-sharing call.": "Morate koristiti HTTPS kako biste pokrenuli poziv s dijeljenjem ekrana.",
"Custom Server Options": "Prilagođene opcije poslužitelja",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Možete koristiti prilagođene opcije poslužitelja za prijavu na ostale Matrix poslužitelje, navodeći drugačiji URL za Kućni poslužitelj.<br/>Ovo vam omogućuje da koristite Riot s postojećim Matrix računom na različitom kućnom poslužitelju.<br/><br/>Također možete postaviti prilagođeni poslužitelj identiteta, ali u tom slučaju nećete moći pozivati korisnike preko njihove email adrese, niti sami biti pozvani preko vase email adrese.",
"Dismiss": "Odbaci",
"powered by Matrix": "powered by Matrix",
"Welcome to Riot.im": "Dobrodošli u Riot.im",
"Chat with Riot Bot": "Razgovor s Riot Botom",
"Get started with some tips from Riot Bot!": "Krenite s par savjeta od Riot Bota!",
"General discussion about Matrix and Riot": "Opća rasprava o Matrixu i Riotu",
"Discussion of all things Matrix!": "Rasprava o svemu vezanome za Matrix!",
"Riot/Web &amp; Desktop chat": "Riot/Web &amp; Desktop chat",
"Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS &amp; matrix-ios-sdk chat",
"Riot/Android &amp; matrix-android-sdk chat": "Riot/Android &amp; matrix-android-sdk chat",
"Matrix technical discussions": "Tehničke rasprave o Matrixu",
"Running Matrix services": "Pokretanje Matrix usluga",
"Community-run support for Synapse": "Podrška zajednice za Synapse",
"Admin support for Dendrite": "Administratorska podrška za Dendrite",
"Announcements about Synapse releases": "Obavijesti o izdanjima Synapsea",
"Support for those using and running matrix-appservice-irc": "Podrška onima koji koriste i pokreću matrix-appservice-irc",
"Building services on Matrix": "Razvoj usluga na Matrixu",
"Support for those using the Matrix spec": "Podrška onima koji koriste Matrix spec",
"Design and implementation of E2E in Matrix": "Dizajn i implementacija E2E u Matrixu",
"Implementing VR services with Matrix": "Implementiranje VR usluga s Matrixom",
"Implementing VoIP services with Matrix": "Implementiranje VoIP usluga s Matrixom",
"Discussion of the Identity Service API": "Rasprava vezana za Identity Service API",
"Support for those using, running and writing other bridges": "Podrška onima koji koriste, pokreću i pišu ostale mostove",
"Contributing code to Matrix and Riot": "Doprinos kodu Matrixa i Riota",
"Dev chat for the Riot/Web dev team": "Dev chat za Riot/Web dev tim",
"Dev chat for the Dendrite dev team": "Dev chat za Dendrite dev team",
"Co-ordination for Riot translators": "Koordinacija Riot prevoditelja",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralizirani, enkriptirani chat &amp; kolaboracija powered by [matrix]",
"Search the room directory": "Pretražite imenik soba",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Veliki broj soba već postoji na Matrixu, povezanih s postojećim mrežama (Slack, IRC, Gitter itd) ili nezavisnih. Zavirite u imenik!"
}

View file

@ -29,7 +29,7 @@
"Support for those using, running and writing other bridges": "Supporto per chi usa, amministra e scrive altri ponti (bridge)", "Support for those using, running and writing other bridges": "Supporto per chi usa, amministra e scrive altri ponti (bridge)",
"Contributing code to Matrix and Riot": "Contributi di codice per Matrix e Riot", "Contributing code to Matrix and Riot": "Contributi di codice per Matrix e Riot",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s tramite %(browserName)s su %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s tramite %(browserName)s su %(osName)s",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat criptate e decentralizzate &amp; collaborazione offerta da [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat criptate, decentralizzate e collaborazioni offerte da [matrix]",
"Discussion of all things Matrix!": "Discussione su tutto riguardo Matrix!", "Discussion of all things Matrix!": "Discussione su tutto riguardo Matrix!",
"Dev chat for the Riot/Web dev team": "Chat per gli sviluppatori di Riot/Web", "Dev chat for the Riot/Web dev team": "Chat per gli sviluppatori di Riot/Web",
"Dev chat for the Dendrite dev team": "Chat per gli sviluppatori di Dendrite", "Dev chat for the Dendrite dev team": "Chat per gli sviluppatori di Dendrite",

View file

@ -23,7 +23,7 @@
"Admin support for Dendrite": "Suporte de administração para o Dendrite", "Admin support for Dendrite": "Suporte de administração para o Dendrite",
"Announcements about Synapse releases": "Anúncios acerca de lançamentos do Synapse", "Announcements about Synapse releases": "Anúncios acerca de lançamentos do Synapse",
"Support for those using and running matrix-appservice-irc": "Suporte para aqueles a correr e a utilizar o matrix-appservice-irc", "Support for those using and running matrix-appservice-irc": "Suporte para aqueles a correr e a utilizar o matrix-appservice-irc",
"Building services on Matrix": "Construir serviços no Matrix", "Building services on Matrix": "Construindo serviços no Matrix",
"Support for those using the Matrix spec": "Suporte para os utilizadores da especificação do Matrix", "Support for those using the Matrix spec": "Suporte para os utilizadores da especificação do Matrix",
"Design and implementation of E2E in Matrix": "Design e implementação de encriptação ponto-a-ponto (E2E) no Matrix", "Design and implementation of E2E in Matrix": "Design e implementação de encriptação ponto-a-ponto (E2E) no Matrix",
"Implementing VR services with Matrix": "Implementar serviços de realidade virtual (VR) com o Matrix", "Implementing VR services with Matrix": "Implementar serviços de realidade virtual (VR) com o Matrix",
@ -33,5 +33,7 @@
"Contributing code to Matrix and Riot": "Contribuir código para o Matrix e para o Riot", "Contributing code to Matrix and Riot": "Contribuir código para o Matrix e para o Riot",
"Dev chat for the Riot/Web dev team": "Conversa de desenvolvimento para a equipa do Riot/Web", "Dev chat for the Riot/Web dev team": "Conversa de desenvolvimento para a equipa do Riot/Web",
"Dev chat for the Dendrite dev team": "Conversa de desenvolvimento para a equipa do Dendrite", "Dev chat for the Dendrite dev team": "Conversa de desenvolvimento para a equipa do Dendrite",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Já existem muitas salas no Matrix, ligadas a redes já existentes (Slack, IRC, Gitter, etc) ou independentes. Dê uma vista de olhos no diretório!" "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Já existem muitas salas no Matrix, ligadas a redes já existentes (Slack, IRC, Gitter, etc) ou independentes. Dê uma vista de olhos no diretório!",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Você pode usar as opções de servidor personalizado para entrar em outros servidores Matrix, especificando um diferente URL de servidor doméstico.<br/>Isto permite que você utilize Riot com uma conta Matrix existente em um servidor doméstico diferente.<br/><br/>Você também pode definir um servidor de identidade personalizado, porém não poderá convidar usuários por endereço de e-mail nem ser convidado por endereço de e-mail.",
"Co-ordination for Riot translators": "Coordenação para tradutores do Riot"
} }

View file

@ -1,7 +1,7 @@
{ {
"Custom Server Options": "Opções para Servidor Personalizado", "Custom Server Options": "Opções para Servidor Personalizado",
"Dismiss": "Descartar", "Dismiss": "Descartar",
"powered by Matrix": "rodando a partir do Matrix", "powered by Matrix": "oferecido por Matrix",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s em %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s em %(osName)s",
"Riot Desktop on %(platformName)s": "Riot para computadores desktop em %(platformName)s", "Riot Desktop on %(platformName)s": "Riot para computadores desktop em %(platformName)s",
"Riot is not supported on mobile web. Install the app?": "Riot versão web não é suportado a partir de celular. Quer instalar o app para celular?", "Riot is not supported on mobile web. Install the app?": "Riot versão web não é suportado a partir de celular. Quer instalar o app para celular?",
@ -33,7 +33,7 @@
"Dev chat for the Riot/Web dev team": "Chat de desenvolvimento para o time devel do Riot/Web", "Dev chat for the Riot/Web dev team": "Chat de desenvolvimento para o time devel do Riot/Web",
"Dev chat for the Dendrite dev team": "Chat de desenvolvimento para o time devel do Dendrite", "Dev chat for the Dendrite dev team": "Chat de desenvolvimento para o time devel do Dendrite",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Muitas salas já existem no Matrix, algumas independentes, e outras relacionadas a redes existentes (tais como Slack, IRC, Gitter, entre outras). Dê uma olhada na lista de salas públicas!", "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Muitas salas já existem no Matrix, algumas independentes, e outras relacionadas a redes existentes (tais como Slack, IRC, Gitter, entre outras). Dê uma olhada na lista de salas públicas!",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo impulsionado por [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo oferecido por [matrix]",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Você pode usar as opções customizadas de servidor para conectar-se a outros servidores Matrix ao especificar uma outra URL de Servidor de Base (homeserver).<br/> Isso permite que você use o Riot com uma conta Matrix existente em outro servidor de base.<br/><br/>Você também pode definir um servidor de identidade customizado, mas neste caso você não poderá convidar outras pesoas por endereço de email, ou ser convidada/o pelo seu endereço de email.", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Você pode usar as opções customizadas de servidor para conectar-se a outros servidores Matrix ao especificar uma outra URL de Servidor de Base (homeserver).<br/> Isso permite que você use o Riot com uma conta Matrix existente em outro servidor de base.<br/><br/>Você também pode definir um servidor de identidade customizado, mas neste caso você não poderá convidar outras pesoas por endereço de email, ou ser convidada/o pelo seu endereço de email.",
"Co-ordination for Riot translators": "Coordenação para tradutores Riot" "Co-ordination for Riot translators": "Coordenação para tradutores Riot"
} }

20
src/i18n/strings/vi.json Normal file
View file

@ -0,0 +1,20 @@
{
"Riot is not supported on mobile web. Install the app?": "Riot không được hỗ trợ trên mobile web. Hãy cài app?",
"Riot Desktop on %(platformName)s": "Riot Desktop trên %(platformName)s",
"Unknown device": "Thiết bị không được nhận biết",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s với %(browserName)s trên %(osName)s",
"You need to be using HTTPS to place a screen-sharing call.": "Bạn phải sử dụng HTTPS để dùng chức năng chia sẻ màn hình.",
"Custom Server Options": "Các lựa chọn máy chủ",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Bạn có thể sử dụng các máy chủ khác để đăng nhập vào Matrix bằng cách khai báo đường dẫn Home server.<br/> Cách này cho phép bạn sử dụng tài khoản hiện tại trên một Home server khác.<br/><br/>Bạn cũng có thể chọn một Server định danh nhưng bạn không thể mời người dùng khác qua email.",
"Dismiss": "Bỏ qua",
"powered by Matrix": "tài trợ bởi Matrix",
"Welcome to Riot.im": "Chào mừng tới Riot.im",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Chat phân tán, mã hóa &amp; giao tiếp được tài trợ bởi [matrix]",
"Search the room directory": "Tìm trong danh sách phòng",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Rất nhiều phòng đã có sẵn trong Matrix, liên kết với các hệ thống mạng xã hội khác (Slack, IRC, Gitter,...) hoặc hoạt động độc lập. Hãy kiểm tra!",
"Chat with Riot Bot": "Chat với Riot Bot",
"Get started with some tips from Riot Bot!": "Bắt đầu với các hướng dẫn từ Riot Bot!",
"General discussion about Matrix and Riot": "Thảo luận chung về Matrix và Riot",
"Discussion of all things Matrix!": "Thào luận về mọi vấn đề liên quan đến Matrix!",
"Riot/Web &amp; Desktop chat": "Riot/Web &amp; Desktop chat"
}

View file

@ -34,31 +34,13 @@
} %> } %>
</head> </head>
<body style="height: 100%;"> <body style="height: 100%;">
<section id="matrixchat" style="height: 100%;"></section> <section id="matrixchat" style="height: 100%; overflow: auto;"></section>
<noscript>Sorry, Riot requires JavaScript to be enabled.</noscript> <!-- TODO: Translate this? --> <noscript>Sorry, Riot requires JavaScript to be enabled.</noscript> <!-- TODO: Translate this? -->
<% for (var i=0; i < htmlWebpackPlugin.files.js.length; i++) {
if (_.endsWith(htmlWebpackPlugin.files.js[i], 'olm.js')) {
var array = htmlWebpackPlugin.files.js;
htmlWebpackPlugin.files.js.unshift(htmlWebpackPlugin.files.js[i]);
htmlWebpackPlugin.files.js.splice(i, 1);
}
}
for (var i=0; i < htmlWebpackPlugin.files.js.length; i++) {
// Not a particularly graceful way of not putting the indexeddb worker script
// into the main page
if (_.endsWith(htmlWebpackPlugin.files.js[i], 'indexeddb-worker.js')) {
%>
<script> <script>
window.vector_indexeddb_worker_script = '<%= htmlWebpackPlugin.files.js[i] %>'; window.vector_indexeddb_worker_script = '<%= htmlWebpackPlugin.files.chunks['indexeddb-worker'].entry %>';
</script> </script>
<% <script src="<%= htmlWebpackPlugin.files.chunks['bundle'].entry %>"></script>
continue; <img src="<%= require('matrix-react-sdk/res/img/warning.svg') %>" width="24" height="23" style="visibility: hidden; position: absolute; top: 0px; left: 0px;"/>
}
%>
<script src="<%= htmlWebpackPlugin.files.js[i] %>"></script>
<% } %>
<img src="img/warning.svg" width="24" height="23" style="visibility: hidden; position: absolute; top: 0px; left: 0px;"/>
<audio id="messageAudio"> <audio id="messageAudio">
<source src="media/message.ogg" type="audio/ogg" /> <source src="media/message.ogg" type="audio/ogg" />
<source src="media/message.mp3" type="audio/mpeg" /> <source src="media/message.mp3" type="audio/mpeg" />

View file

@ -24,6 +24,10 @@ require('gfm.css/gfm.css');
require('highlight.js/styles/github.css'); require('highlight.js/styles/github.css');
require('draft-js/dist/Draft.css'); require('draft-js/dist/Draft.css');
import olmWasmPath from 'olm/olm.wasm';
import './rageshakesetup';
import React from 'react'; import React from 'react';
// add React and ReactPerf to the global namespace, to make them easier to // add React and ReactPerf to the global namespace, to make them easier to
// access via the console // access via the console
@ -32,7 +36,7 @@ if (process.env.NODE_ENV !== 'production') {
global.Perf = require('react-addons-perf'); global.Perf = require('react-addons-perf');
} }
import RunModernizrTests from './modernizr'; // this side-effects a global import './modernizr';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg'; import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
@ -41,23 +45,21 @@ import VectorConferenceHandler from 'matrix-react-sdk/lib/VectorConferenceHandle
import Promise from 'bluebird'; import Promise from 'bluebird';
import request from 'browser-request'; import request from 'browser-request';
import * as languageHandler from 'matrix-react-sdk/lib/languageHandler'; import * as languageHandler from 'matrix-react-sdk/lib/languageHandler';
// Also import _t directly so we can call it just `_t` as this is what gen-i18n.js expects
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import url from 'url'; import url from 'url';
import {parseQs, parseQsFromFragment} from './url_utils'; import {parseQs, parseQsFromFragment} from './url_utils';
import Platform from './platform';
import ElectronPlatform from './platform/ElectronPlatform';
import WebPlatform from './platform/WebPlatform';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg'; import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import SettingsStore, {SettingLevel} from "matrix-react-sdk/lib/settings/SettingsStore"; import SettingsStore from "matrix-react-sdk/lib/settings/SettingsStore";
import Tinter from 'matrix-react-sdk/lib/Tinter'; import Tinter from 'matrix-react-sdk/lib/Tinter';
import SdkConfig from "matrix-react-sdk/lib/SdkConfig"; import SdkConfig from "matrix-react-sdk/lib/SdkConfig";
import Olm from 'olm'; import Olm from 'olm';
import rageshake from "matrix-react-sdk/lib/rageshake/rageshake";
import CallHandler from 'matrix-react-sdk/lib/CallHandler'; import CallHandler from 'matrix-react-sdk/lib/CallHandler';
import {getVectorConfig} from './getconfig'; import {getVectorConfig} from './getconfig';
@ -68,33 +70,17 @@ let lastLocationHashSet = null;
// and need to migrate, but they spam the console with warnings. // and need to migrate, but they spam the console with warnings.
Promise.config({warnings: false}); Promise.config({warnings: false});
function initRageshake() {
rageshake.init().then(() => {
console.log("Initialised rageshake: See https://bugs.chromium.org/p/chromium/issues/detail?id=583193 to fix line numbers on Chrome.");
window.addEventListener('beforeunload', (e) => {
console.log('riot-web closing');
// try to flush the logs to indexeddb
rageshake.flush();
});
rageshake.cleanup();
}, (err) => {
console.error("Failed to initialise rageshake: " + err);
});
}
function checkBrowserFeatures(featureList) { function checkBrowserFeatures(featureList) {
if (!window.Modernizr) { if (!window.Modernizr) {
console.error("Cannot check features - Modernizr global is missing."); console.error("Cannot check features - Modernizr global is missing.");
return false; return false;
} }
var featureComplete = true; let featureComplete = true;
for (var i = 0; i < featureList.length; i++) { for (let i = 0; i < featureList.length; i++) {
if (window.Modernizr[featureList[i]] === undefined) { if (window.Modernizr[featureList[i]] === undefined) {
console.error( console.error(
"Looked for feature '%s' but Modernizr has no results for this. " + "Looked for feature '%s' but Modernizr has no results for this. " +
"Has it been configured correctly?", featureList[i] "Has it been configured correctly?", featureList[i],
); );
return false; return false;
} }
@ -115,7 +101,7 @@ function getScreenFromLocation(location) {
return { return {
screen: fragparts.location.substring(1), screen: fragparts.location.substring(1),
params: fragparts.params, params: fragparts.params,
} };
} }
// Here, we do some crude URL analysis to allow // Here, we do some crude URL analysis to allow
@ -140,10 +126,10 @@ function onHashChange(ev) {
// so a web page can update the URL bar appropriately. // so a web page can update the URL bar appropriately.
function onNewScreen(screen) { function onNewScreen(screen) {
console.log("newscreen "+screen); console.log("newscreen "+screen);
var hash = '#/' + screen; const hash = '#/' + screen;
lastLocationHashSet = hash; lastLocationHashSet = hash;
window.location.hash = hash; window.location.hash = hash;
}; }
// We use this to work out what URL the SDK should // We use this to work out what URL the SDK should
// pass through when registering to allow the user to // pass through when registering to allow the user to
@ -156,7 +142,7 @@ function onNewScreen(screen) {
// so in that instance, hardcode to use riot.im/app for now instead. // so in that instance, hardcode to use riot.im/app for now instead.
function makeRegistrationUrl(params) { function makeRegistrationUrl(params) {
let url; let url;
if (window.location.protocol === "file:") { if (window.location.protocol === "vector:") {
url = 'https://riot.im/app/#/register'; url = 'https://riot.im/app/#/register';
} else { } else {
url = ( url = (
@ -180,7 +166,7 @@ function makeRegistrationUrl(params) {
return url; return url;
} }
function getConfig(configJsonFilename) { export function getConfig(configJsonFilename) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
request( request(
{ method: "GET", url: configJsonFilename }, { method: "GET", url: configJsonFilename },
@ -216,16 +202,22 @@ function onTokenLoginCompleted() {
// if we did a token login, we're now left with the token, hs and is // if we did a token login, we're now left with the token, hs and is
// url as query params in the url; a little nasty but let's redirect to // url as query params in the url; a little nasty but let's redirect to
// clear them. // clear them.
var parsedUrl = url.parse(window.location.href); const parsedUrl = url.parse(window.location.href);
parsedUrl.search = ""; parsedUrl.search = "";
var formatted = url.format(parsedUrl); const formatted = url.format(parsedUrl);
console.log("Redirecting to " + formatted + " to drop loginToken " + console.log("Redirecting to " + formatted + " to drop loginToken " +
"from queryparams"); "from queryparams");
window.location.href = formatted; window.location.href = formatted;
} }
async function loadApp() { async function loadApp() {
initRageshake(); if (window.vector_indexeddb_worker_script === undefined) {
// If this is missing, something has probably gone wrong with
// the bundling. The js-sdk will just fall back to accessing
// indexeddb directly with no worker script, but we want to
// make sure the indexeddb script is present, so fail hard.
throw new Error("Missing indexeddb worker script!");
}
MatrixClientPeg.setIndexedDbWorkerScript(window.vector_indexeddb_worker_script); MatrixClientPeg.setIndexedDbWorkerScript(window.vector_indexeddb_worker_script);
CallHandler.setConferenceHandler(VectorConferenceHandler); CallHandler.setConferenceHandler(VectorConferenceHandler);
@ -238,8 +230,23 @@ async function loadApp() {
const fragparts = parseQsFromFragment(window.location); const fragparts = parseQsFromFragment(window.location);
const params = parseQs(window.location); const params = parseQs(window.location);
// set the platform for react sdk (our Platform object automatically picks the right one) // set the platform for react sdk
PlatformPeg.set(new Platform()); if (window.ipcRenderer) {
console.log("Using Electron platform");
const plaf = new ElectronPlatform();
PlatformPeg.set(plaf);
// Electron only: see if we need to do a one-time data
// migration
if (window.localStorage.getItem('mx_user_id') === null) {
console.log("Migrating session from old origin...");
await plaf.migrateFromOldOrigin();
console.log("Origin migration complete");
}
} else {
console.log("Using Web platform");
PlatformPeg.set(new WebPlatform());
}
// Load the config file. First try to load up a domain-specific config of the // Load the config file. First try to load up a domain-specific config of the
// form "config.$domain.json" and if that fails, fall back to config.json. // form "config.$domain.json" and if that fails, fall back to config.json.
@ -273,9 +280,8 @@ async function loadApp() {
} }
// as quickly as we possibly can, set a default theme... // as quickly as we possibly can, set a default theme...
const styleElements = Object.create(null);
let a; let a;
const theme = SettingsStore.getValue("theme"); const theme = "dharma";//SettingsStore.getValue("theme");
for (let i = 0; (a = document.getElementsByTagName("link")[i]); i++) { for (let i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
const href = a.getAttribute("href"); const href = a.getAttribute("href");
if (!href) continue; if (!href) continue;
@ -349,19 +355,19 @@ async function loadApp() {
initialScreenAfterLogin={getScreenFromLocation(window.location)} initialScreenAfterLogin={getScreenFromLocation(window.location)}
defaultDeviceDisplayName={platform.getDefaultDeviceDisplayName()} defaultDeviceDisplayName={platform.getDefaultDeviceDisplayName()}
/>, />,
document.getElementById('matrixchat') document.getElementById('matrixchat'),
); );
} else { } else {
console.error("Browser is missing required features."); console.error("Browser is missing required features.");
// take to a different landing page to AWOOOOOGA at the user // take to a different landing page to AWOOOOOGA at the user
var CompatibilityPage = sdk.getComponent("structures.CompatibilityPage"); const CompatibilityPage = sdk.getComponent("structures.CompatibilityPage");
window.matrixChat = ReactDOM.render( window.matrixChat = ReactDOM.render(
<CompatibilityPage onAccept={function() { <CompatibilityPage onAccept={function() {
if (window.localStorage) window.localStorage.setItem('mx_accepts_unsupported_browser', true); if (window.localStorage) window.localStorage.setItem('mx_accepts_unsupported_browser', true);
console.log("User accepts the compatibility risks."); console.log("User accepts the compatibility risks.");
loadApp(); loadApp();
}} />, }} />,
document.getElementById('matrixchat') document.getElementById('matrixchat'),
); );
} }
} }
@ -375,18 +381,19 @@ function loadOlm() {
* *
* We also need to tell the Olm js to look for its wasm file at the same * We also need to tell the Olm js to look for its wasm file at the same
* level as index.html. It really should be in the same place as the js, * level as index.html. It really should be in the same place as the js,
* ie. in the bundle directory, to avoid caching issues, but as far as I * ie. in the bundle directory, but as far as I can tell this is
* can tell this is completely impossible with webpack. * completely impossible with webpack. We do, however, use a hashed
* filename to avoid caching issues.
*/ */
return Olm.init({ return Olm.init({
locateFile: () => 'olm.wasm', locateFile: () => olmWasmPath,
}).then(() => { }).then(() => {
console.log("Using WebAssembly Olm"); console.log("Using WebAssembly Olm");
}).catch((e) => { }).catch((e) => {
console.log("Failed to load Olm: trying legacy version"); console.log("Failed to load Olm: trying legacy version");
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const s = document.createElement('script'); const s = document.createElement('script');
s.src = 'olm_legacy.js'; s.src = 'olm_legacy.js'; // XXX: This should be cache-busted too
s.onload = resolve; s.onload = resolve;
s.onerror = reject; s.onerror = reject;
document.body.appendChild(s); document.body.appendChild(s);

View file

@ -18,4 +18,4 @@ import {IndexedDBStoreWorker} from 'matrix-js-sdk/lib/indexeddb-worker.js';
const remoteWorker = new IndexedDBStoreWorker(postMessage); const remoteWorker = new IndexedDBStoreWorker(postMessage);
onmessage = remoteWorker.onMessage; global.onmessage = remoteWorker.onMessage;

View file

@ -364,9 +364,9 @@ body {
</g> </g>
</svg> </svg>
<p>Launch the app, and enable <strong>Use custom server options (advanced)</strong>.</p> <p>Launch the app, and enable <strong>Use custom server options (advanced)</strong>.</p>
<p class="mx_Spacer">In the Home Server field, enter:</p> <p class="mx_Spacer">In the homeserver field, enter:</p>
<p><strong id="hs_url"></strong></p> <p><strong id="hs_url"></strong></p>
<p class="mx_Spacer"><em>Note: You shouldn&apos;t need to modify the Identity Server field, which by default is set to https://vector.im.</em></p> <p class="mx_Spacer"><em>Note: You shouldn&apos;t need to modify the identity server field, which by default is set to https://vector.im.</em></p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -3,6 +3,7 @@
/* /*
Copyright 2016 Aviral Dasgupta Copyright 2016 Aviral Dasgupta
Copyright 2016 OpenMarket Ltd Copyright 2016 OpenMarket Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -21,9 +22,10 @@ import VectorBasePlatform, {updateCheckStatusEnum} from './VectorBasePlatform';
import dis from 'matrix-react-sdk/lib/dispatcher'; import dis from 'matrix-react-sdk/lib/dispatcher';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import Promise from 'bluebird'; import Promise from 'bluebird';
import {remote, ipcRenderer, desktopCapturer} from 'electron';
import rageshake from 'matrix-react-sdk/lib/rageshake/rageshake'; import rageshake from 'matrix-react-sdk/lib/rageshake/rageshake';
const ipcRenderer = window.ipcRenderer;
remote.autoUpdater.on('update-downloaded', onUpdateDownloaded); remote.autoUpdater.on('update-downloaded', onUpdateDownloaded);
var globalKeybindings = {}; var globalKeybindings = {};
@ -44,23 +46,21 @@ function onUpdateDownloaded(ev: Event, releaseNotes: string, ver: string, date:
} }
function platformFriendlyName(): string { function platformFriendlyName(): string {
console.log(window.process); // used to use window.process but the same info is available here
switch (window.process.platform) { if (navigator.userAgent.includes('Macintosh')) {
case 'darwin':
return 'macOS'; return 'macOS';
case 'freebsd': } else if (navigator.userAgent.includes('FreeBSD')) {
return 'FreeBSD'; return 'FreeBSD';
case 'openbsd': } else if (navigator.userAgent.includes('OpenBSD')) {
return 'OpenBSD'; return 'OpenBSD';
case 'sunos': } else if (navigator.userAgent.includes('SunOS')) {
return 'SunOS'; return 'SunOS';
case 'win32': } else if (navigator.userAgent.includes('Windows')) {
return 'Windows'; return 'Windows';
default: } else if (navigator.userAgent.includes('Linux')) {
// Sorry, Linux users: you get lumped into here, return 'Linux';
// but only because Linux's capitalisation is } else {
// normal. We do care about you. return 'Unknown';
return window.process.platform[0].toUpperCase() + window.process.platform.slice(1);
} }
} }
@ -87,9 +87,11 @@ function getUpdateCheckStatus(status) {
export default class ElectronPlatform extends VectorBasePlatform { export default class ElectronPlatform extends VectorBasePlatform {
constructor() { constructor() {
super(); super();
dis.register(_onAction);
this.updatable = Boolean(remote.autoUpdater.getFeedURL());
this._pendingIpcCalls = {};
this._nextIpcCallId = 0;
dis.register(_onAction);
/* /*
IPC Call `check_updates` returns: IPC Call `check_updates` returns:
true if there is an update available true if there is an update available
@ -105,6 +107,15 @@ export default class ElectronPlatform extends VectorBasePlatform {
this.showUpdateCheck = false; this.showUpdateCheck = false;
}); });
// try to flush the rageshake logs to indexeddb before quit.
ipcRenderer.on('before-quit', function() {
console.log('riot-desktop closing');
rageshake.flush();
});
ipcRenderer.on('ipcReply', this._onIpcReply.bind(this));
ipcRenderer.on('update-downloaded', this.onUpdateDownloaded.bind(this));
this.startUpdateCheck = this.startUpdateCheck.bind(this); this.startUpdateCheck = this.startUpdateCheck.bind(this);
this.stopUpdateCheck = this.stopUpdateCheck.bind(this); this.stopUpdateCheck = this.stopUpdateCheck.bind(this);
@ -128,6 +139,15 @@ export default class ElectronPlatform extends VectorBasePlatform {
}); });
} }
async onUpdateDownloaded(ev, updateInfo) {
dis.dispatch({
action: 'new_version',
currentVersion: await this.getAppVersion(),
newVersion: updateInfo,
releaseNotes: updateInfo.releaseNotes,
});
}
getHumanReadableName(): string { getHumanReadableName(): string {
return 'Electron Platform'; // no translation required: only used for analytics return 'Electron Platform'; // no translation required: only used for analytics
} }
@ -154,7 +174,7 @@ export default class ElectronPlatform extends VectorBasePlatform {
// maybe we should pass basic styling (italics, bold, underline) through from MD // maybe we should pass basic styling (italics, bold, underline) through from MD
// we only have to strip out < and > as the spec doesn't include anything about things like &amp; // we only have to strip out < and > as the spec doesn't include anything about things like &amp;
// so we shouldn't assume that all implementations will treat those properly. Very basic tag parsing is done. // so we shouldn't assume that all implementations will treat those properly. Very basic tag parsing is done.
if (window.process.platform === 'linux') { if (navigator.userAgent.includes('Linux')) {
msg = msg.replace(/</g, '&lt;').replace(/>/g, '&gt;'); msg = msg.replace(/</g, '&lt;').replace(/>/g, '&gt;');
} }
@ -168,17 +188,13 @@ export default class ElectronPlatform extends VectorBasePlatform {
}, },
); );
notification.onclick = function() { notification.onclick = () => {
dis.dispatch({ dis.dispatch({
action: 'view_room', action: 'view_room',
room_id: room.roomId, room_id: room.roomId,
}); });
global.focus(); global.focus();
const win = remote.getCurrentWindow(); this._ipcCall('focusWindow');
if (win.isMinimized()) win.restore();
else if (!win.isVisible()) win.show();
else win.focus();
}; };
return notification; return notification;
@ -192,8 +208,25 @@ export default class ElectronPlatform extends VectorBasePlatform {
notif.close(); notif.close();
} }
getAppVersion(): Promise<string> { async getAppVersion(): Promise<string> {
return Promise.resolve(remote.app.getVersion()); return await this._ipcCall('getAppVersion');
}
supportsAutoLaunch() {
return true;
}
async getAutoLaunchEnabled() {
return await this._ipcCall('getAutoLaunchEnabled');
}
async setAutoLaunchEnabled(enabled) {
return await this._ipcCall('setAutoLaunchEnabled', enabled);
}
async canSelfUpdate(): boolean {
const feedUrl = await this._ipcCall('getUpdateFeedUrl');
return Boolean(feedUrl);
} }
startUpdateCheck() { startUpdateCheck() {
@ -238,52 +271,47 @@ export default class ElectronPlatform extends VectorBasePlatform {
return null; return null;
} }
isElectron(): boolean { return true; }
requestNotificationPermission(): Promise<string> { requestNotificationPermission(): Promise<string> {
return Promise.resolve('granted'); return Promise.resolve('granted');
} }
reload() { reload() {
remote.getCurrentWebContents().reload(); // we used to remote to the main process to get it to
// reload the webcontents, but in practice this is unnecessary:
// the normal way works fine.
window.location.reload(false);
} }
/* BEGIN copied and slightly-modified code async migrateFromOldOrigin() {
* setupScreenSharingForIframe function from: return this._ipcCall('origin_migrate');
* https://github.com/jitsi/jitsi-meet-electron-utils }
* Copied directly here to avoid the need for a native electron module for
* 'just a bit of JavaScript' async _ipcCall(name, ...args) {
* NOTE: Apache v2.0 licensed const ipcCallId = ++this._nextIpcCallId;
*/ return new Promise((resolve, reject) => {
setupScreenSharingForIframe(iframe: Object) { this._pendingIpcCalls[ipcCallId] = {resolve, reject};
iframe.contentWindow.JitsiMeetElectron = { window.ipcRenderer.send('ipcCall', {id: ipcCallId, name, args});
/** // Maybe add a timeout to these? Probably not necessary.
* Get sources available for screensharing. The callback is invoked });
* with an array of DesktopCapturerSources. }
*
* @param {Function} callback - The success callback. _onIpcReply(ev, payload) {
* @param {Function} errorCallback - The callback for errors. if (payload.id === undefined) {
* @param {Object} options - Configuration for getting sources. console.warn("Ignoring IPC reply with no ID");
* @param {Array} options.types - Specify the desktop source types
* to get, with valid sources being "window" and "screen".
* @param {Object} options.thumbnailSize - Specify how big the
* preview images for the sources should be. The valid keys are
* height and width, e.g. { height: number, width: number}. By
* default electron will return images with height and width of
* 150px.
*/
obtainDesktopStreams(callback, errorCallback, options = {}) {
desktopCapturer.getSources(options,
(error, sources) => {
if (error) {
errorCallback(error);
return; return;
} }
callback(sources); if (this._pendingIpcCalls[payload.id] === undefined) {
}); console.warn("Unknown IPC payload ID: " + payload.id);
}, return;
}; }
const callbacks = this._pendingIpcCalls[payload.id];
delete this._pendingIpcCalls[payload.id];
if (payload.error) {
callbacks.reject(payload.error);
} else {
callbacks.resolve(payload.reply);
}
} }
/* END of copied and slightly-modified code */
} }

View file

@ -3,6 +3,7 @@
/* /*
Copyright 2016 Aviral Dasgupta Copyright 2016 Aviral Dasgupta
Copyright 2016 OpenMarket Ltd Copyright 2016 OpenMarket Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -45,7 +46,6 @@ export default class VectorBasePlatform extends BasePlatform {
this.favicon = new Favico({animation: 'none'}); this.favicon = new Favico({animation: 'none'});
this.showUpdateCheck = false; this.showUpdateCheck = false;
this._updateFavicon(); this._updateFavicon();
this.updatable = true;
this.startUpdateCheck = this.startUpdateCheck.bind(this); this.startUpdateCheck = this.startUpdateCheck.bind(this);
this.stopUpdateCheck = this.stopUpdateCheck.bind(this); this.stopUpdateCheck = this.stopUpdateCheck.bind(this);
@ -60,8 +60,8 @@ export default class VectorBasePlatform extends BasePlatform {
// This needs to be in in a try block as it will throw // This needs to be in in a try block as it will throw
// if there are more than 100 badge count changes in // if there are more than 100 badge count changes in
// its internal queue // its internal queue
let bgColor = "#d00", let bgColor = "#d00";
notif = this.notificationCount; let notif = this.notificationCount;
if (this.errorDidOccur) { if (this.errorDidOccur) {
notif = notif || "×"; notif = notif || "×";
@ -88,6 +88,19 @@ export default class VectorBasePlatform extends BasePlatform {
this._updateFavicon(); this._updateFavicon();
} }
supportsAutoLaunch() {
return false;
}
// XXX: Surely this should be a setting like any other?
async getAutoLaunchEnabled() {
return false;
}
async setAutoLaunchEnabled(enabled) {
throw new Error("Unimplemented");
}
/** /**
* Begin update polling, if applicable * Begin update polling, if applicable
*/ */
@ -97,8 +110,8 @@ export default class VectorBasePlatform extends BasePlatform {
/** /**
* Whether we can call checkForUpdate on this platform build * Whether we can call checkForUpdate on this platform build
*/ */
canSelfUpdate(): boolean { async canSelfUpdate(): boolean {
return this.updatable; return false;
} }
startUpdateCheck() { startUpdateCheck() {
@ -114,7 +127,7 @@ export default class VectorBasePlatform extends BasePlatform {
dis.dispatch({ dis.dispatch({
action: 'check_updates', action: 'check_updates',
value: false, value: false,
}) });
} }
getUpdateCheckStatusEnum() { getUpdateCheckStatusEnum() {
@ -136,4 +149,12 @@ export default class VectorBasePlatform extends BasePlatform {
getDefaultDeviceDisplayName(): string { getDefaultDeviceDisplayName(): string {
return _t("Unknown device"); return _t("Unknown device");
} }
/**
* Migrate account data from a previous origin
* Used only for the electron app
*/
async migrateFromOldOrigin() {
return false;
}
} }

View file

@ -26,7 +26,7 @@ import Promise from 'bluebird';
import url from 'url'; import url from 'url';
import UAParser from 'ua-parser-js'; import UAParser from 'ua-parser-js';
var POKE_RATE_MS = 10 * 60 * 1000; // 10 min const POKE_RATE_MS = 10 * 60 * 1000; // 10 min
export default class WebPlatform extends VectorBasePlatform { export default class WebPlatform extends VectorBasePlatform {
constructor() { constructor() {
@ -142,6 +142,10 @@ export default class WebPlatform extends VectorBasePlatform {
setInterval(this.pollForUpdate.bind(this), POKE_RATE_MS); setInterval(this.pollForUpdate.bind(this), POKE_RATE_MS);
} }
async canSelfUpdate(): boolean {
return true;
}
pollForUpdate() { pollForUpdate() {
return this._getVersion().then((ver) => { return this._getVersion().then((ver) => {
if (this.runningVersion === null) { if (this.runningVersion === null) {

View file

@ -0,0 +1,64 @@
/*
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.
*/
/*
* Separate file that sets up rageshake logging when imported.
* This is necessary so that rageshake logging is set up before
* anything else. Webpack puts all import statements at the top
* of the file before any code, so imports will always be
* evaluated first. Other imports can cause other code to be
* evaluated (eg. the loglevel library in js-sdk, which if set
* up before rageshake causes some js-sdk logging to be missing
* from the rageshake.)
*/
import rageshake from "matrix-react-sdk/lib/rageshake/rageshake";
import SdkConfig from "matrix-react-sdk/lib/SdkConfig";
function initRageshake() {
rageshake.init().then(() => {
console.log("Initialised rageshake.");
console.log("To fix line numbers in Chrome: " +
"Meatball menu → Settings → Blackboxing → Add /rageshake\\.js$");
window.addEventListener('beforeunload', (e) => {
console.log('riot-web closing');
// try to flush the logs to indexeddb
rageshake.flush();
});
rageshake.cleanup();
}, (err) => {
console.error("Failed to initialise rageshake: " + err);
});
}
initRageshake();
global.mxSendRageshake = function(text, withLogs) {
if (withLogs === undefined) withLogs = true;
require(['matrix-react-sdk/lib/rageshake/submit-rageshake'], (s) => {
s(SdkConfig.get().bug_report_endpoint_url, {
userText: text,
sendLogs: withLogs,
progressCallback: console.log.bind(console),
}).then(() => {
console.log("Bug report sent!");
}, (err) => {
console.error(err);
});
});
};

View file

@ -23,16 +23,16 @@ import qs from 'querystring';
export function parseQsFromFragment(location) { export function parseQsFromFragment(location) {
// if we have a fragment, it will start with '#', which we need to drop. // if we have a fragment, it will start with '#', which we need to drop.
// (if we don't, this will return ''). // (if we don't, this will return '').
var fragment = location.hash.substring(1); const fragment = location.hash.substring(1);
// our fragment may contain a query-param-like section. we need to fish // our fragment may contain a query-param-like section. we need to fish
// this out *before* URI-decoding because the params may contain ? and & // this out *before* URI-decoding because the params may contain ? and &
// characters which are only URI-encoded once. // characters which are only URI-encoded once.
var hashparts = fragment.split('?'); const hashparts = fragment.split('?');
var result = { const result = {
location: decodeURIComponent(hashparts[0]), location: decodeURIComponent(hashparts[0]),
params: {} params: {},
}; };
if (hashparts.length > 1) { if (hashparts.length > 1) {

View file

@ -6,8 +6,8 @@
// ideally these unit tests could be run under nodejs rather than in a browser // ideally these unit tests could be run under nodejs rather than in a browser
// via karma, but having two separate test frameworks in the same project // via karma, but having two separate test frameworks in the same project
// seems confusing // seems confusing
var unit_tests = require.context('./unit-tests', true, /\.js$/); const unit_tests = require.context('./unit-tests', true, /\.js$/);
unit_tests.keys().forEach(unit_tests); unit_tests.keys().forEach(unit_tests);
var app_tests = require.context('./app-tests', true, /\.jsx?$/); const app_tests = require.context('./app-tests', true, /\.jsx?$/);
app_tests.keys().forEach(app_tests); app_tests.keys().forEach(app_tests);

View file

@ -17,40 +17,40 @@ limitations under the License.
/* joining.js: tests for the various paths when joining a room */ /* joining.js: tests for the various paths when joining a room */
import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg'; import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
import Platform from '../../src/vector/platform'; import WebPlatform from '../../src/vector/platform/WebPlatform';
require('skin-sdk'); require('skin-sdk');
var jssdk = require('matrix-js-sdk'); const jssdk = require('matrix-js-sdk');
var sdk = require('matrix-react-sdk'); const sdk = require('matrix-react-sdk');
var peg = require('matrix-react-sdk/lib/MatrixClientPeg'); const peg = require('matrix-react-sdk/lib/MatrixClientPeg');
var dis = require('matrix-react-sdk/lib/dispatcher'); const dis = require('matrix-react-sdk/lib/dispatcher');
var PageTypes = require('matrix-react-sdk/lib/PageTypes'); const PageTypes = require('matrix-react-sdk/lib/PageTypes');
var MatrixChat = sdk.getComponent('structures.MatrixChat'); const MatrixChat = sdk.getComponent('structures.MatrixChat');
var RoomDirectory = sdk.getComponent('structures.RoomDirectory'); const RoomDirectory = sdk.getComponent('structures.RoomDirectory');
var RoomPreviewBar = sdk.getComponent('rooms.RoomPreviewBar'); const RoomPreviewBar = sdk.getComponent('rooms.RoomPreviewBar');
var RoomView = sdk.getComponent('structures.RoomView'); const RoomView = sdk.getComponent('structures.RoomView');
var React = require('react'); const React = require('react');
var ReactDOM = require('react-dom'); const ReactDOM = require('react-dom');
var ReactTestUtils = require('react-addons-test-utils'); const ReactTestUtils = require('react-addons-test-utils');
var expect = require('expect'); const expect = require('expect');
import Promise from 'bluebird'; import Promise from 'bluebird';
var test_utils = require('../test-utils'); const test_utils = require('../test-utils');
var MockHttpBackend = require('matrix-mock-request'); const MockHttpBackend = require('matrix-mock-request');
var HS_URL='http://localhost'; const HS_URL='http://localhost';
var IS_URL='http://localhost'; const IS_URL='http://localhost';
var USER_ID='@me:localhost'; const USER_ID='@me:localhost';
var ACCESS_TOKEN='access_token'; const ACCESS_TOKEN='access_token';
describe('joining a room', function() { describe('joining a room', function() {
describe('over federation', function() { describe('over federation', function() {
var parentDiv; let parentDiv;
var httpBackend; let httpBackend;
var matrixChat; let matrixChat;
beforeEach(function() { beforeEach(function() {
test_utils.beforeEach(this); test_utils.beforeEach(this);
@ -71,9 +71,15 @@ describe('joining a room', function () {
} }
}); });
it('should not get stuck at a spinner', function() { // TODO: Re-enable test
var ROOM_ALIAS = '#alias:localhost'; // The test is currently disabled because the room directory now resides in a dialog,
var ROOM_ID = '!id:localhost'; // which is not accessible from the MatrixChat component anymore. Convincing react that
// the dialog does exist and is under a different tree is incredibly difficult though,
// so for now the test has been disabled. We should revisit this test when someone has
// the time to kill to figure this out. Problem area is highlighted within the test.
xit('should not get stuck at a spinner', function() {
const ROOM_ALIAS = '#alias:localhost';
const ROOM_ID = '!id:localhost';
httpBackend.when('GET', '/pushrules').respond(200, {}); httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' }); httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
@ -88,9 +94,9 @@ describe('joining a room', function () {
localStorage.setItem("mx_access_token", ACCESS_TOKEN ); localStorage.setItem("mx_access_token", ACCESS_TOKEN );
localStorage.setItem("mx_user_id", USER_ID); localStorage.setItem("mx_user_id", USER_ID);
PlatformPeg.set(new Platform()); PlatformPeg.set(new WebPlatform());
var mc = ( const mc = (
<MatrixChat config={{}} <MatrixChat config={{}}
makeRegistrationUrl={()=>{throw new Error("unimplemented");}} makeRegistrationUrl={()=>{throw new Error("unimplemented");}}
initialScreenAfterLogin={{ initialScreenAfterLogin={{
@ -100,7 +106,7 @@ describe('joining a room', function () {
); );
matrixChat = ReactDOM.render(mc, parentDiv); matrixChat = ReactDOM.render(mc, parentDiv);
var roomView; let roomView;
// wait for /sync to happen. This may take some time, as the client // wait for /sync to happen. This may take some time, as the client
// has to initialise indexeddb. // has to initialise indexeddb.
@ -118,11 +124,22 @@ describe('joining a room', function () {
}).then(() => { }).then(() => {
console.log(`${Date.now()} App made requests for directory view; switching to a room.`); console.log(`${Date.now()} App made requests for directory view; switching to a room.`);
var roomDir = ReactTestUtils.findRenderedComponentWithType( // TODO: Make this look in the right spot for the directory dialog.
matrixChat, RoomDirectory); // See the comment block at the top of the test for a bit more information. The short
// story here is that the RoomDirectory does not exist under matrixChat anymore, or even
// the parentDiv we have access to. Asking React to find the RoomDirectory as a child of
// the document results in it complaining that you didn't give it a component tree to
// search in. When you do get a reference to the component tree based off the document
// root and ask it to search, it races and can't find the component in time. To top it
// all off, MatrixReactTestUtils can't find the element in time either even with a very
// high number of attempts. Assuming we can get a reference to the RoomDirectory in a
// dialog, the rest of the test should be fine.
const roomDir = ReactTestUtils.findRenderedComponentWithType(
matrixChat, RoomDirectory,
);
// enter an alias in the input, and simulate enter // enter an alias in the input, and simulate enter
var input = ReactTestUtils.findRenderedDOMComponentWithTag( const input = ReactTestUtils.findRenderedDOMComponentWithTag(
roomDir, 'input'); roomDir, 'input');
input.value = ROOM_ALIAS; input.value = ROOM_ALIAS;
ReactTestUtils.Simulate.change(input); ReactTestUtils.Simulate.change(input);

View file

@ -17,7 +17,7 @@ limitations under the License.
/* loading.js: test the myriad paths we have for loading the application */ /* loading.js: test the myriad paths we have for loading the application */
import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg'; import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
import Platform from '../../src/vector/platform'; import WebPlatform from '../../src/vector/platform/WebPlatform';
import 'skin-sdk'; import 'skin-sdk';
@ -40,8 +40,19 @@ import * as test_utils from '../test-utils';
import MockHttpBackend from 'matrix-mock-request'; import MockHttpBackend from 'matrix-mock-request';
import {parseQs, parseQsFromFragment} from '../../src/vector/url_utils'; import {parseQs, parseQsFromFragment} from '../../src/vector/url_utils';
var DEFAULT_HS_URL='http://my_server'; const DEFAULT_HS_URL='http://my_server';
var DEFAULT_IS_URL='http://my_is'; const DEFAULT_IS_URL='http://my_is';
expect.extend({
toStartWith(prefix) {
expect.assert(
this.actual.startsWith(prefix),
'expected %s to start with %s',
this.actual, prefix,
);
return this;
}
});
describe('loading:', function() { describe('loading:', function() {
let parentDiv; let parentDiv;
@ -112,12 +123,12 @@ describe('loading:', function () {
toString: function() { return this.search + this.hash; }, toString: function() { return this.search + this.hash; },
}; };
let tokenLoginCompleteDefer = Promise.defer(); const tokenLoginCompleteDefer = Promise.defer();
tokenLoginCompletePromise = tokenLoginCompleteDefer.promise; tokenLoginCompletePromise = tokenLoginCompleteDefer.promise;
function onNewScreen(screen) { function onNewScreen(screen) {
console.log(Date.now() + " newscreen "+screen); console.log(Date.now() + " newscreen "+screen);
var hash = '#/' + screen; const hash = '#/' + screen;
windowLocation.hash = hash; windowLocation.hash = hash;
console.log(Date.now() + " browser URI now "+ windowLocation); console.log(Date.now() + " browser URI now "+ windowLocation);
} }
@ -129,7 +140,7 @@ describe('loading:', function () {
return { return {
screen: fragparts.location.substring(1), screen: fragparts.location.substring(1),
params: fragparts.params, params: fragparts.params,
} };
} }
const MatrixChat = sdk.getComponent('structures.MatrixChat'); const MatrixChat = sdk.getComponent('structures.MatrixChat');
@ -140,9 +151,9 @@ describe('loading:', function () {
default_is_url: DEFAULT_IS_URL, default_is_url: DEFAULT_IS_URL,
}, opts.config || {}); }, opts.config || {});
PlatformPeg.set(new Platform()); PlatformPeg.set(new WebPlatform());
var params = parseQs(windowLocation); const params = parseQs(windowLocation);
matrixChat = ReactDOM.render( matrixChat = ReactDOM.render(
<MatrixChat <MatrixChat
onNewScreen={onNewScreen} onNewScreen={onNewScreen}
@ -153,7 +164,7 @@ describe('loading:', function () {
onTokenLoginCompleted={() => tokenLoginCompleteDefer.resolve()} onTokenLoginCompleted={() => tokenLoginCompleteDefer.resolve()}
initialScreenAfterLogin={getScreenFromLocation(windowLocation)} initialScreenAfterLogin={getScreenFromLocation(windowLocation)}
makeRegistrationUrl={() => {throw new Error('Not implemented');}} makeRegistrationUrl={() => {throw new Error('Not implemented');}}
/>, parentDiv />, parentDiv,
); );
} }
@ -243,7 +254,7 @@ describe('loading:', function () {
return awaitLoginComponent(matrixChat).then(() => { return awaitLoginComponent(matrixChat).then(() => {
// we expect a single <Login> component // we expect a single <Login> component
ReactTestUtils.findRenderedComponentWithType( ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login')); matrixChat, sdk.getComponent('structures.auth.Login'));
// the only outstanding request should be a GET /login // the only outstanding request should be a GET /login
// (in particular there should be no /register request for // (in particular there should be no /register request for
@ -257,7 +268,6 @@ describe('loading:', function () {
} }
return completeLogin(matrixChat); return completeLogin(matrixChat);
}).then(() => { }).then(() => {
// once the sync completes, we should have a room view // once the sync completes, we should have a room view
ReactTestUtils.findRenderedComponentWithType( ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.HomePage')); matrixChat, sdk.getComponent('structures.HomePage'));
@ -333,40 +343,6 @@ describe('loading:', function () {
}).done(done, done); }).done(done, done);
}); });
it("logs in correctly with a Riot Team Server", function() {
sdk.setFetch(httpBackend.fetchFn); // XXX: ought to restore this!
httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
loadApp({
config: {
teamServerConfig: {
teamServerURL: 'http://my_team_server',
},
},
});
return Promise.delay(1).then(() => {
// we expect a loading spinner while we log into the RTS
assertAtLoadingSpinner(matrixChat);
httpBackend.when('GET', 'my_team_server/login').respond(200, {
team_token: 'nom',
});
return httpBackend.flush();
}).then(() => {
return awaitSyncingSpinner(matrixChat)
}).then(() => {
// we got a sync spinner - let the sync complete
return expectAndAwaitSync();
}).then(() => {
// once the sync completes, we should have a home page
ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.HomePage'));
});
});
describe('/#/login link:', function() { describe('/#/login link:', function() {
beforeEach(function() { beforeEach(function() {
loadApp({ loadApp({
@ -380,7 +356,7 @@ describe('loading:', function () {
it('shows a login view', function() { it('shows a login view', function() {
// we expect a single <Login> component // we expect a single <Login> component
ReactTestUtils.findRenderedComponentWithType( ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login') matrixChat, sdk.getComponent('structures.auth.Login'),
); );
// the only outstanding request should be a GET /login // the only outstanding request should be a GET /login
@ -438,10 +414,7 @@ describe('loading:', function () {
}).done(done, done); }).done(done, done);
}); });
it('uses the last known homeserver to register with', function (done) { it('uses the default homeserver to register with', function(done) {
localStorage.setItem("mx_hs_url", "https://homeserver" );
localStorage.setItem("mx_is_url", "https://idserver" );
loadApp(); loadApp();
Promise.delay(1).then(() => { Promise.delay(1).then(() => {
@ -450,7 +423,7 @@ describe('loading:', function () {
assertAtLoadingSpinner(matrixChat); assertAtLoadingSpinner(matrixChat);
httpBackend.when('POST', '/register').check(function(req) { httpBackend.when('POST', '/register').check(function(req) {
expect(req.path).toMatch(new RegExp("^https://homeserver/")); expect(req.path).toStartWith(DEFAULT_HS_URL);
expect(req.queryParams.kind).toEqual('guest'); expect(req.queryParams.kind).toEqual('guest');
}).respond(200, { }).respond(200, {
user_id: "@guest:localhost", user_id: "@guest:localhost",
@ -463,21 +436,21 @@ describe('loading:', function () {
}).then(() => { }).then(() => {
return expectAndAwaitSync(); return expectAndAwaitSync();
}).then((req) => { }).then((req) => {
expect(req.path).toMatch(new RegExp("^https://homeserver/")); expect(req.path).toStartWith(DEFAULT_HS_URL);
// once the sync completes, we should have a home page // once the sync completes, we should have a home page
httpBackend.verifyNoOutstandingExpectation(); httpBackend.verifyNoOutstandingExpectation();
ReactTestUtils.findRenderedComponentWithType( ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.HomePage')); matrixChat, sdk.getComponent('structures.HomePage'));
expect(windowLocation.hash).toEqual("#/home"); expect(windowLocation.hash).toEqual("#/home");
expect(MatrixClientPeg.get().baseUrl).toEqual("https://homeserver"); expect(MatrixClientPeg.get().baseUrl).toEqual(DEFAULT_HS_URL);
expect(MatrixClientPeg.get().idBaseUrl).toEqual("https://idserver"); expect(MatrixClientPeg.get().idBaseUrl).toEqual(DEFAULT_IS_URL);
}).done(done, done); }).done(done, done);
}); });
it('shows a room view if we followed a room link', function(done) { it('shows a room view if we followed a room link', function(done) {
loadApp({ loadApp({
uriFragment: "#/room/!room:id" uriFragment: "#/room/!room:id",
}); });
Promise.delay(1).then(() => { Promise.delay(1).then(() => {
// at this point, we're trying to do a guest registration; // at this point, we're trying to do a guest registration;
@ -547,7 +520,7 @@ describe('loading:', function () {
// we expect a single <Login> component // we expect a single <Login> component
ReactTestUtils.findRenderedComponentWithType( ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login') matrixChat, sdk.getComponent('structures.auth.Login'),
); );
}); });
@ -555,7 +528,7 @@ describe('loading:', function () {
// ILAG renders this obsolete. I think. // ILAG renders this obsolete. I think.
it('should allow us to return to the app', function() { it('should allow us to return to the app', function() {
const login = ReactTestUtils.findRenderedComponentWithType( const login = ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login') matrixChat, sdk.getComponent('structures.auth.Login')
); );
const linkText = 'Return to app'; const linkText = 'Return to app';
@ -623,7 +596,7 @@ describe('loading:', function () {
function completeLogin(matrixChat) { function completeLogin(matrixChat) {
// we expect a single <Login> component // we expect a single <Login> component
const login = ReactTestUtils.findRenderedComponentWithType( const login = ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login')); matrixChat, sdk.getComponent('structures.auth.Login'));
httpBackend.when('POST', '/login').check(function(req) { httpBackend.when('POST', '/login').check(function(req) {
expect(req.data.type).toEqual('m.login.password'); expect(req.data.type).toEqual('m.login.password');
@ -658,7 +631,7 @@ describe('loading:', function () {
// assert that we are on the loading page // assert that we are on the loading page
function assertAtLoadingSpinner(matrixChat) { function assertAtLoadingSpinner(matrixChat) {
var domComponent = ReactDOM.findDOMNode(matrixChat); const domComponent = ReactDOM.findDOMNode(matrixChat);
expect(domComponent.className).toEqual("mx_MatrixChat_splash"); expect(domComponent.className).toEqual("mx_MatrixChat_splash");
// just the spinner // just the spinner
@ -697,12 +670,12 @@ function awaitSyncingSpinner(matrixChat, retryLimit, retryCount) {
} }
function assertAtSyncingSpinner(matrixChat) { function assertAtSyncingSpinner(matrixChat) {
var domComponent = ReactDOM.findDOMNode(matrixChat); const domComponent = ReactDOM.findDOMNode(matrixChat);
expect(domComponent.className).toEqual("mx_MatrixChat_splash"); expect(domComponent.className).toEqual("mx_MatrixChat_splash");
ReactTestUtils.findRenderedComponentWithType( ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('elements.Spinner')); matrixChat, sdk.getComponent('elements.Spinner'));
var logoutLink = ReactTestUtils.findRenderedDOMComponentWithTag( const logoutLink = ReactTestUtils.findRenderedDOMComponentWithTag(
matrixChat, 'a'); matrixChat, 'a');
expect(logoutLink.text).toEqual("Logout"); expect(logoutLink.text).toEqual("Logout");
} }
@ -736,6 +709,6 @@ function awaitRoomView(matrixChat, retryLimit, retryCount) {
function awaitLoginComponent(matrixChat, attempts) { function awaitLoginComponent(matrixChat, attempts) {
return MatrixReactTestUtils.waitForRenderedComponentWithType( return MatrixReactTestUtils.waitForRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login'), attempts, matrixChat, sdk.getComponent('structures.auth.Login'), attempts,
); );
} }

View file

@ -4,5 +4,5 @@
* Skins the react-sdk with the vector components * Skins the react-sdk with the vector components
*/ */
var sdk = require('matrix-react-sdk'); const sdk = require('matrix-react-sdk');
sdk.loadSkin(require('../src/component-index')); sdk.loadSkin(require('../src/component-index'));

View file

@ -8,7 +8,7 @@ import Promise from 'bluebird';
* @param {Mocha.Context} context The test context * @param {Mocha.Context} context The test context
*/ */
export function beforeEach(context) { export function beforeEach(context) {
var desc = context.currentTest.fullTitle(); const desc = context.currentTest.fullTitle();
console.log(); console.log();
console.log(desc); console.log(desc);
console.log(new Array(1 + desc.length).join("=")); console.log(new Array(1 + desc.length).join("="));
@ -22,7 +22,7 @@ export function beforeEach(context) {
* returns true if the current environment supports webrtc * returns true if the current environment supports webrtc
*/ */
export function browserSupportsWebRTC() { export function browserSupportsWebRTC() {
var n = global.window.navigator; const n = global.window.navigator;
return n.getUserMedia || n.webkitGetUserMedia || return n.getUserMedia || n.webkitGetUserMedia ||
n.mozGetUserMedia; n.mozGetUserMedia;
} }

View file

@ -4,7 +4,7 @@ const ExtractTextPlugin = require('extract-text-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin');
let og_image_url = process.env.RIOT_OG_IMAGE_URL; let og_image_url = process.env.RIOT_OG_IMAGE_URL;
if (!og_image_url) og_image_url = 'https://riot.im/app/themes/riot/img/logos/riot-im-logo-1.png'; if (!og_image_url) og_image_url = 'https://riot.im/app/themes/riot/img/logos/riot-im-logo-black-text.png';
module.exports = { module.exports = {
entry: { entry: {
@ -16,34 +16,42 @@ module.exports = {
"mobileguide": "./src/vector/mobile_guide/index.js", "mobileguide": "./src/vector/mobile_guide/index.js",
// CSS themes // CSS themes
"theme-light": "./node_modules/matrix-react-sdk/res/themes/light/css/light.scss", //"theme-light": "./node_modules/matrix-react-sdk/res/themes/light/css/light.scss",
"theme-dark": "./node_modules/matrix-react-sdk/res/themes/dark/css/dark.scss", //"theme-dark": "./node_modules/matrix-react-sdk/res/themes/dark/css/dark.scss",
"theme-status": "./res/themes/status/css/status.scss", "theme-dharma": "./node_modules/matrix-react-sdk/res/themes/dharma/css/dharma.scss",
//"theme-status": "./res/themes/status/css/status.scss",
}, },
module: { module: {
rules: [ rules: [
{ enforce: 'pre', test: /\.js$/, use: "source-map-loader", exclude: /node_modules/, }, { enforce: 'pre', test: /\.js$/, use: "source-map-loader", exclude: /node_modules/, },
{ test: /\.js$/, use: "babel-loader", include: path.resolve(__dirname, 'src') }, { test: /\.js$/, use: "babel-loader", include: path.resolve(__dirname, 'src') },
{
test: /\.wasm$/,
loader: "file-loader",
type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725
options: {
name: '[name].[hash:7].[ext]',
outputPath: '.',
},
},
{ {
test: /\.scss$/, test: /\.scss$/,
// 1. postcss-loader turns the SCSS into normal CSS. // 1. postcss-loader turns the SCSS into normal CSS.
// 2. raw-loader turns the CSS into a javascript module // 2. css-loader turns the CSS into a JS module whose default
// whose default export is a string containing the CSS. // export is a string containing the CSS, while also adding
// (raw-loader is similar to css-loader, but the latter // the images and fonts from CSS as Webpack inputs.
// would also drag in the imgs and fonts that our CSS refers to
// as webpack inputs.)
// 3. ExtractTextPlugin turns that string into a separate asset. // 3. ExtractTextPlugin turns that string into a separate asset.
use: ExtractTextPlugin.extract({ use: ExtractTextPlugin.extract({
use: [ use: [
"raw-loader", "css-loader",
{ {
loader: 'postcss-loader', loader: 'postcss-loader',
options: { options: {
config: { config: {
path: './postcss.config.js' path: './postcss.config.js',
} },
} },
} },
], ],
}), }),
}, },
@ -51,10 +59,40 @@ module.exports = {
// this works similarly to the scss case, without postcss. // this works similarly to the scss case, without postcss.
test: /\.css$/, test: /\.css$/,
use: ExtractTextPlugin.extract({ use: ExtractTextPlugin.extract({
use: "raw-loader" use: "css-loader",
}), }),
}, },
{
test: /\.(gif|png|svg|ttf)$/,
// Use a content-based hash in the name so that we can set a long cache
// lifetime for assets while still delivering changes quickly.
oneOf: [
{
// Images referenced in CSS files
issuer: /\.(scss|css)$/,
loader: 'file-loader',
options: {
name: '[name].[hash:7].[ext]',
outputPath: getImgOutputPath,
publicPath: function(url, resourcePath) {
// CSS image usages end up in the `bundles/[hash]` output
// directory, so we adjust the final path to navigate up
// twice.
const outputPath = getImgOutputPath(url, resourcePath);
return toPublicPath(path.join("../..", outputPath));
},
},
},
{
// Images referenced in HTML and JS files
loader: 'file-loader',
options: {
name: '[name].[hash:7].[ext]',
outputPath: getImgOutputPath,
},
},
],
},
], ],
noParse: [ noParse: [
// for cross platform compatibility use [\\\/] as the path separator // for cross platform compatibility use [\\\/] as the path separator
@ -74,14 +112,13 @@ module.exports = {
output: { output: {
path: path.join(__dirname, "webapp"), path: path.join(__dirname, "webapp"),
// the generated js (and CSS, from the ExtractTextPlugin) are put in a // The generated JS (and CSS, from the ExtractTextPlugin) are put in a
// unique subdirectory for the build. There will only be one such // unique subdirectory for the build. There will only be one such
// 'bundle' directory in the generated tarball; however, hosting // 'bundle' directory in the generated tarball; however, hosting
// servers can collect 'bundles' from multiple versions into one // servers can collect 'bundles' from multiple versions into one
// directory and symlink it into place - this allows users who loaded // directory and symlink it into place - this allows users who loaded
// an older version of the application to continue to access webpack // an older version of the application to continue to access webpack
// chunks even after the app is redeployed. // chunks even after the app is redeployed.
//
filename: "bundles/[hash]/[name].js", filename: "bundles/[hash]/[name].js",
chunkFilename: "bundles/[hash]/[name].js", chunkFilename: "bundles/[hash]/[name].js",
devtoolModuleFilenameTemplate: function(info) { devtoolModuleFilenameTemplate: function(info) {
@ -108,11 +145,6 @@ module.exports = {
"matrix-js-sdk": path.resolve('./node_modules/matrix-js-sdk'), "matrix-js-sdk": path.resolve('./node_modules/matrix-js-sdk'),
}, },
}, },
externals: {
// Don't try to bundle electron: leave it as a commonjs dependency
// (the 'commonjs' here means it will output a 'require')
"electron": "commonjs electron",
},
plugins: [ plugins: [
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': { 'process.env': {
@ -162,3 +194,27 @@ module.exports = {
inline: false, inline: false,
}, },
}; };
/**
* Merge assets found via CSS and imports into a single tree, while also preserving
* directories under `res`.
*
* @param {string} url The adjusted name of the file, such as `warning.1234567.svg`.
* @param {string} resourcePath The absolute path to the source file with unmodified name.
* @return {string} The returned paths will look like `img/warning.1234567.svg`.
*/
function getImgOutputPath(url, resourcePath) {
const prefix = /^.*[/\\]res[/\\]/;
const outputDir = path.dirname(resourcePath).replace(prefix, "");
return path.join(outputDir, path.basename(url));
}
/**
* Convert path to public path format, which always uses forward slashes, since it will
* be placed directly into things like CSS files.
*
* @param {string} path Some path to a file.
*/
function toPublicPath(path) {
return path.replace(/\\/g, '/');
}