Merge branch 'develop' of github.com:vector-im/riot-web into anoa/jitsi_ptt
55
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal 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 -->
|
32
.github/ISSUE_TEMPLATE/redesign_issue.md
vendored
Normal 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! -->
|
25
.travis.yml
|
@ -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
|
||||||
|
|
92
CHANGELOG.md
|
@ -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)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
@ -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
|
|
@ -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": {
|
||||||
|
|
|
@ -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
|
||||||
|
|
62
electron_app/src/originMigrator.js
Normal 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,
|
||||||
|
};
|
|
@ -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,
|
||||||
|
});
|
|
@ -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) {
|
||||||
|
|
19
origin_migrator/dest/browser-matrix.min.js
vendored
Normal file
6
origin_migrator/dest/dest.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<script src="browser-matrix.min.js"></script>
|
||||||
|
<script src="dest.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
125
origin_migrator/dest/dest.js
Normal 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);
|
||||||
|
|
7
origin_migrator/source.html
Normal 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
|
@ -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
24
package.json
|
@ -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",
|
||||||
|
|
|
@ -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"
|
||||||
|
|
420
res/home.html
|
@ -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 & 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 & 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 & 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 & 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 & 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>
|
||||||
|
|
17
res/home/images/icon-create-account.svg
Normal 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 |
16
res/home/images/icon-help.svg
Normal 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 |
19
res/home/images/icon-room-directory.svg
Normal 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 |
16
res/home/images/icon-sign-in.svg
Normal 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 |
24
res/home/images/icons-directory.svg
Normal 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 |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 8.9 KiB |
BIN
res/themes/riot/img/backgrounds/valley.jpg
Normal file
After Width: | Height: | Size: 530 KiB |
Before Width: | Height: | Size: 14 KiB |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
BIN
res/themes/riot/img/logos/riot-im-logo-black-text.png
Normal file
After Width: | Height: | Size: 21 KiB |
17
res/themes/riot/img/logos/riot-im-logo-black-text.svg
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
res/themes/riot/img/logos/riot-im-logo.png
Normal file
After Width: | Height: | Size: 21 KiB |
17
res/themes/riot/img/logos/riot-im-logo.svg
Normal file
After Width: | Height: | Size: 8.8 KiB |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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;
|
||||||
|
|
15
res/themes/status/css/_fonts.scss
Normal 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;
|
||||||
|
}
|
5
res/themes/status/css/_paths.scss
Normal 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: ..;
|
|
@ -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
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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 }],
|
||||||
];
|
];
|
||||||
|
|
|
@ -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`
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
#
|
#
|
||||||
|
|
|
@ -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';
|
||||||
|
|
|
@ -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> ·
|
<a href="https://medium.com/@RiotChat" target="_blank" rel="noopener">blog</a>
|
||||||
<a href="https://twitter.com/@RiotChat">twitter</a> ·
|
<a href="https://twitter.com/@RiotChat" target="_blank" rel="noopener">twitter</a>
|
||||||
<a href="https://github.com/vector-im/riot-web">github</a> ·
|
<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>
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
});
|
});
|
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
});
|
});
|
70
src/components/views/auth/VectorAuthPage.js
Normal 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>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
});
|
});
|
|
@ -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 & collaboration powered by [matrix]": "Decentralised, encrypted chat & collaboration powered by [matrix]",
|
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Decentralised, encrypted chat & 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 & Desktop chat": "Riot/Web & Desktop chat",
|
"Get started with some tips from Riot Bot!": "Get started with some tips from Riot Bot!"
|
||||||
"Riot/iOS & matrix-ios-sdk chat": "Riot/iOS & matrix-ios-sdk chat",
|
|
||||||
"Riot/Android & matrix-android-sdk chat": "Riot/Android & 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"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 & 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 & Desktop chat": "रायट/वेब और डेस्कटॉप चैट",
|
||||||
|
"Riot/iOS & matrix-ios-sdk chat": "रायट / iOS और matrix-ios-sdk चैट",
|
||||||
|
"Riot/Android & 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
|
@ -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 & Desktop chat": "Riot/Web & Desktop chat",
|
||||||
|
"Riot/iOS & matrix-ios-sdk chat": "Riot/iOS & matrix-ios-sdk chat",
|
||||||
|
"Riot/Android & matrix-android-sdk chat": "Riot/Android & 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 & collaboration powered by [matrix]": "Decentralizirani, enkriptirani chat & 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!"
|
||||||
|
}
|
|
@ -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 & collaboration powered by [matrix]": "Chat criptate e decentralizzate & collaborazione offerta da [matrix]",
|
"Decentralised, encrypted chat & 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",
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 & collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo impulsionado por [matrix]",
|
"Decentralised, encrypted chat & 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
|
@ -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 & collaboration powered by [matrix]": "Chat phân tán, mã hóa & 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 & Desktop chat": "Riot/Web & Desktop chat"
|
||||||
|
}
|
|
@ -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" />
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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'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'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>
|
||||||
|
|
|
@ -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 &
|
// we only have to strip out < and > as the spec doesn't include anything about things like &
|
||||||
// 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, '<').replace(/>/g, '>');
|
msg = msg.replace(/</g, '<').replace(/>/g, '>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
64
src/vector/rageshakesetup.js
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, '/');
|
||||||
|
}
|
||||||
|
|