Merge pull request #13329 from vector-im/t3chguy/app_load4
App load tweaks, improve error pages
This commit is contained in:
commit
33406d1709
19 changed files with 1330 additions and 78 deletions
2
src/@types/global.d.ts
vendored
2
src/@types/global.d.ts
vendored
|
@ -15,7 +15,7 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import "matrix-react-sdk/src/@types/global"; // load matrix-react-sdk's type extensions first
|
||||
import {Renderer} from "react-dom";
|
||||
import type {Renderer} from "react-dom";
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
|
|
105
src/async-components/structures/CompatibilityView.tsx
Normal file
105
src/async-components/structures/CompatibilityView.tsx
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
Copyright 2020 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.
|
||||
*/
|
||||
|
||||
import * as React from "react";
|
||||
import { _t } from "matrix-react-sdk/src/languageHandler";
|
||||
|
||||
// directly import the style here as this layer does not support rethemedex at this time so no matrix-react-sdk
|
||||
// scss variables will be accessible.
|
||||
import "../../../res/css/structures/ErrorView.scss";
|
||||
|
||||
interface IProps {
|
||||
onAccept(): void;
|
||||
}
|
||||
|
||||
const CompatibilityView: React.FC<IProps> = ({ onAccept }) => {
|
||||
return <div className="mx_ErrorView">
|
||||
<div className="mx_ErrorView_container">
|
||||
<div className="mx_HomePage_header">
|
||||
<span className="mx_HomePage_logo">
|
||||
<img height="42" src="themes/riot/img/logos/riot-logo.svg" alt="Riot" />
|
||||
</span>
|
||||
<h1>{ _t("Unsupported browser") }</h1>
|
||||
</div>
|
||||
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step1_heading">{ _t("Your browser can't run Riot") }</h2>
|
||||
<p>
|
||||
{ _t(
|
||||
"Riot uses advanced browser features which aren't supported by your current browser.",
|
||||
) }
|
||||
</p>
|
||||
<p>
|
||||
{ _t(
|
||||
'Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ' +
|
||||
'or <safariLink>Safari</safariLink> for the best experience.',
|
||||
{},
|
||||
{
|
||||
'chromeLink': (sub) => <a href="https://www.google.com/chrome">{sub}</a>,
|
||||
'firefoxLink': (sub) => <a href="https://firefox.com">{sub}</a>,
|
||||
'safariLink': (sub) => <a href="https://apple.com/safari">{sub}</a>,
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{ _t(
|
||||
"You can continue using your current browser, but some or all features may not work " +
|
||||
"and the look and feel of the application may be incorrect.",
|
||||
) }
|
||||
</p>
|
||||
<button onClick={onAccept}>
|
||||
{ _t("I understand the risks and wish to continue") }
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step2_heading">Use Riot on mobile</h2>
|
||||
<p><strong>iOS</strong> (iPhone or iPad)</p>
|
||||
<a href="https://itunes.apple.com/app/riot-im/id1083446067?mt=8" target="_blank"
|
||||
className="mx_ClearDecoration">
|
||||
<img height="48" src="themes/riot/img/download/apple.svg" alt="Apple App Store" />
|
||||
</a>
|
||||
<p className="mx_Spacer"><strong>Android</strong></p>
|
||||
<a href="https://play.google.com/store/apps/details?id=im.vector.app" target="_blank"
|
||||
className="mx_ClearDecoration">
|
||||
<img height="48" src="themes/riot/img/download/google.svg" alt="Google Play Store" />
|
||||
</a>
|
||||
<a href="https://f-droid.org/repository/browse/?fdid=im.vector.alpha" target="_blank"
|
||||
className="mx_ClearDecoration">
|
||||
<img height="48" src="themes/riot/img/download/fdroid.svg" alt="F-Droid" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mx_HomePage_row mx_Center mx_Spacer">
|
||||
<p className="mx_Spacer">
|
||||
<a href="https://riot.im" target="_blank" className="mx_FooterLink">
|
||||
{ _t("Go to Riot.im") }
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>;
|
||||
};
|
||||
|
||||
export default CompatibilityView;
|
61
src/async-components/structures/ErrorView.tsx
Normal file
61
src/async-components/structures/ErrorView.tsx
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
Copyright 2020 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.
|
||||
*/
|
||||
|
||||
import * as React from "react";
|
||||
import { _t } from "matrix-react-sdk/src/languageHandler";
|
||||
|
||||
// directly import the style here as this layer does not support rethemedex at this time so no matrix-react-sdk
|
||||
// scss variables will be accessible.
|
||||
import "../../../res/css/structures/ErrorView.scss";
|
||||
|
||||
interface IProps {
|
||||
// both of these should already be internationalised
|
||||
title: string;
|
||||
messages?: string[];
|
||||
}
|
||||
|
||||
const ErrorView: React.FC<IProps> = ({title, messages}) => {
|
||||
return <div className="mx_ErrorView">
|
||||
<div className="mx_ErrorView_container">
|
||||
<div className="mx_HomePage_header">
|
||||
<span className="mx_HomePage_logo">
|
||||
<img height="42" src="themes/riot/img/logos/riot-logo.svg" alt="Riot" />
|
||||
</span>
|
||||
<h1>{ _t("Failed to start") }</h1>
|
||||
</div>
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step1_heading">{ title }</h2>
|
||||
{messages && messages.map(msg => <p key={msg}>
|
||||
{ msg }
|
||||
</p>)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mx_HomePage_row mx_Center mx_Spacer">
|
||||
<p className="mx_Spacer">
|
||||
<a href="https://riot.im" target="_blank" className="mx_FooterLink">
|
||||
{ _t("Go to Riot.im") }
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>;
|
||||
};
|
||||
|
||||
export default ErrorView;
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
Copyright 2020 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.
|
||||
*/
|
||||
|
||||
import * as React from "react";
|
||||
import * as PropTypes from "prop-types";
|
||||
|
||||
import { _t } from "matrix-react-sdk/src/languageHandler";
|
||||
|
||||
interface IProps {
|
||||
title: string;
|
||||
messages?: string[];
|
||||
}
|
||||
|
||||
const ErrorView: React.FC<IProps> = ({title, messages}) => {
|
||||
return <div className="mx_GenericErrorPage">
|
||||
<div className="mx_GenericErrorPage_box">
|
||||
<h1>{title}</h1>
|
||||
<div>
|
||||
{messages && messages.map(msg => <p key={msg}>
|
||||
{ _t(msg) }
|
||||
</p>)}
|
||||
</div>
|
||||
</div>
|
||||
</div>;
|
||||
};
|
||||
|
||||
ErrorView.propTypes = {
|
||||
title: PropTypes.string.isRequired,
|
||||
messages: PropTypes.arrayOf(PropTypes.string.isRequired),
|
||||
};
|
||||
|
||||
export default ErrorView;
|
||||
|
|
@ -19,6 +19,14 @@
|
|||
"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.",
|
||||
"Dismiss": "Dismiss",
|
||||
"Unsupported browser": "Unsupported browser",
|
||||
"Your browser can't run Riot": "Your browser can't run Riot",
|
||||
"Riot uses advanced browser features which aren't supported by your current browser.": "Riot uses advanced browser features which aren't supported by your current browser.",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.",
|
||||
"You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.": "You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.",
|
||||
"I understand the risks and wish to continue": "I understand the risks and wish to continue",
|
||||
"Go to Riot.im": "Go to Riot.im",
|
||||
"Failed to start": "Failed to start",
|
||||
"Welcome to Riot.im": "Welcome to Riot.im",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Decentralised, encrypted chat & collaboration powered by [matrix]",
|
||||
"Sign In": "Sign In",
|
||||
|
|
|
@ -19,9 +19,9 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
// add React and ReactPerf to the global namespace, to make them easier to
|
||||
// access via the console
|
||||
global.React = React;
|
||||
// add React and ReactPerf to the global namespace, to make them easier to access via the console
|
||||
// this incidentally means we can forget our React imports in JSX files without penalty.
|
||||
window.React = React;
|
||||
|
||||
import * as sdk from 'matrix-react-sdk';
|
||||
import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg';
|
||||
|
@ -30,6 +30,7 @@ import {_td, newTranslatableError} from 'matrix-react-sdk/src/languageHandler';
|
|||
import AutoDiscoveryUtils from 'matrix-react-sdk/src/utils/AutoDiscoveryUtils';
|
||||
import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery";
|
||||
import * as Lifecycle from "matrix-react-sdk/src/Lifecycle";
|
||||
import type MatrixChatType from "matrix-react-sdk/src/components/structures/MatrixChat";
|
||||
|
||||
import url from 'url';
|
||||
|
||||
|
@ -40,11 +41,11 @@ import SdkConfig from "matrix-react-sdk/src/SdkConfig";
|
|||
|
||||
import CallHandler from 'matrix-react-sdk/src/CallHandler';
|
||||
|
||||
let lastLocationHashSet = null;
|
||||
let lastLocationHashSet: string = null;
|
||||
|
||||
// Parse the given window.location and return parameters that can be used when calling
|
||||
// MatrixChat.showScreen(screen, params)
|
||||
function getScreenFromLocation(location) {
|
||||
function getScreenFromLocation(location: Location) {
|
||||
const fragparts = parseQsFromFragment(location);
|
||||
return {
|
||||
screen: fragparts.location.substring(1),
|
||||
|
@ -54,15 +55,15 @@ function getScreenFromLocation(location) {
|
|||
|
||||
// Here, we do some crude URL analysis to allow
|
||||
// deep-linking.
|
||||
function routeUrl(location) {
|
||||
function routeUrl(location: Location) {
|
||||
if (!window.matrixChat) return;
|
||||
|
||||
console.log("Routing URL ", location.href);
|
||||
const s = getScreenFromLocation(location);
|
||||
window.matrixChat.showScreen(s.screen, s.params);
|
||||
(window.matrixChat as MatrixChatType).showScreen(s.screen, s.params);
|
||||
}
|
||||
|
||||
function onHashChange(ev) {
|
||||
function onHashChange(ev: HashChangeEvent) {
|
||||
if (decodeURIComponent(window.location.hash) === lastLocationHashSet) {
|
||||
// we just set this: no need to route it!
|
||||
return;
|
||||
|
@ -72,8 +73,8 @@ function onHashChange(ev) {
|
|||
|
||||
// This will be called whenever the SDK changes screens,
|
||||
// so a web page can update the URL bar appropriately.
|
||||
function onNewScreen(screen) {
|
||||
console.log("newscreen "+screen);
|
||||
function onNewScreen(screen: string) {
|
||||
console.log("newscreen " + screen);
|
||||
const hash = '#/' + screen;
|
||||
lastLocationHashSet = hash;
|
||||
window.location.hash = hash;
|
||||
|
@ -88,7 +89,7 @@ function onNewScreen(screen) {
|
|||
// If we're in electron, we should never pass through a file:// URL otherwise
|
||||
// the identity server will try to 302 the browser to it, which breaks horribly.
|
||||
// so in that instance, hardcode to use riot.im/app for now instead.
|
||||
function makeRegistrationUrl(params) {
|
||||
function makeRegistrationUrl(params: object) {
|
||||
let url;
|
||||
if (window.location.protocol === "vector:") {
|
||||
url = 'https://riot.im/app/#/register';
|
||||
|
@ -121,8 +122,7 @@ function onTokenLoginCompleted() {
|
|||
const parsedUrl = url.parse(window.location.href);
|
||||
parsedUrl.search = "";
|
||||
const formatted = url.format(parsedUrl);
|
||||
console.log("Redirecting to " + formatted + " to drop loginToken " +
|
||||
"from queryparams");
|
||||
console.log(`Redirecting to ${formatted} to drop loginToken from queryparams`);
|
||||
window.location.href = formatted;
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@
|
|||
<% }
|
||||
} %>
|
||||
</head>
|
||||
<body style="height: 100%;" data-vector-indexeddb-worker-script="<%= htmlWebpackPlugin.files.chunks['indexeddb-worker'].entry %>">
|
||||
<body style="height: 100%; margin: 0;" data-vector-indexeddb-worker-script="<%= htmlWebpackPlugin.files.chunks['indexeddb-worker'].entry %>">
|
||||
<noscript>Sorry, Riot requires JavaScript to be enabled.</noscript> <!-- TODO: Translate this? -->
|
||||
<section id="matrixchat" style="height: 100%; overflow: auto;"></section>
|
||||
<script src="<%= htmlWebpackPlugin.files.chunks['bundle'].entry %>"></script>
|
||||
|
|
|
@ -78,10 +78,7 @@ function checkBrowserFeatures() {
|
|||
return featureComplete;
|
||||
}
|
||||
|
||||
let acceptBrowser = checkBrowserFeatures();
|
||||
if (!acceptBrowser && window.localStorage) {
|
||||
acceptBrowser = Boolean(window.localStorage.getItem("mx_accepts_unsupported_browser"));
|
||||
}
|
||||
const supportedBrowser = checkBrowserFeatures();
|
||||
|
||||
// React depends on Map & Set which we check for using modernizr's es6collections
|
||||
// if modernizr fails we may not have a functional react to show the error message.
|
||||
|
@ -148,6 +145,11 @@ async function start() {
|
|||
// await things settling so that any errors we have to render have features like i18n running
|
||||
await settled(loadSkinPromise, loadThemePromise, loadLanguagePromise);
|
||||
|
||||
let acceptBrowser = supportedBrowser;
|
||||
if (!acceptBrowser && window.localStorage) {
|
||||
acceptBrowser = Boolean(window.localStorage.getItem("mx_accepts_unsupported_browser"));
|
||||
}
|
||||
|
||||
// ##########################
|
||||
// error handling begins here
|
||||
// ##########################
|
||||
|
@ -199,9 +201,23 @@ async function start() {
|
|||
]);
|
||||
}
|
||||
}
|
||||
|
||||
start().catch(err => {
|
||||
console.error(err);
|
||||
if (!acceptBrowser) {
|
||||
// TODO redirect to static incompatible browser page
|
||||
}
|
||||
// show the static error in an iframe to not lose any context / console data
|
||||
// with some basic styling to make the iframe full page
|
||||
delete document.body.style.height;
|
||||
const iframe = document.createElement("iframe");
|
||||
// @ts-ignore - typescript seems to only like the IE syntax for iframe sandboxing
|
||||
iframe["sandbox"] = "";
|
||||
iframe.src = supportedBrowser ? "static/unable-to-load.html" : "static/incompatible-browser.html";
|
||||
iframe.style.width = "100%";
|
||||
iframe.style.height = "100%";
|
||||
iframe.style.position = "absolute";
|
||||
iframe.style.top = "0";
|
||||
iframe.style.left = "0";
|
||||
iframe.style.right = "0";
|
||||
iframe.style.bottom = "0";
|
||||
iframe.style.border = "0";
|
||||
document.getElementById("matrixchat").appendChild(iframe);
|
||||
});
|
||||
|
|
|
@ -148,18 +148,16 @@ export async function loadApp(fragParams: {}) {
|
|||
export async function showError(title: string, messages?: string[]) {
|
||||
const ErrorView = (await import(
|
||||
/* webpackChunkName: "error-view" */
|
||||
/* webpackPreload: true */
|
||||
"../components/structures/ErrorView")).default;
|
||||
"../async-components/structures/ErrorView")).default;
|
||||
window.matrixChat = ReactDOM.render(<ErrorView title={title} messages={messages} />,
|
||||
document.getElementById('matrixchat'));
|
||||
}
|
||||
|
||||
export async function showIncompatibleBrowser(onAccept) {
|
||||
const CompatibilityPage = (await import(
|
||||
/* webpackChunkName: "compatibility-page" */
|
||||
/* webpackPreload: true */
|
||||
"matrix-react-sdk/src/components/structures/CompatibilityPage")).default;
|
||||
window.matrixChat = ReactDOM.render(<CompatibilityPage onAccept={onAccept} />,
|
||||
const CompatibilityView = (await import(
|
||||
/* webpackChunkName: "compatibility-view" */
|
||||
"../async-components/structures/CompatibilityView")).default;
|
||||
window.matrixChat = ReactDOM.render(<CompatibilityView onAccept={onAccept} />,
|
||||
document.getElementById('matrixchat'));
|
||||
}
|
||||
|
||||
|
|
492
src/vector/static/incompatible-browser.html
Normal file
492
src/vector/static/incompatible-browser.html
Normal file
File diff suppressed because one or more lines are too long
199
src/vector/static/unable-to-load.html
Normal file
199
src/vector/static/unable-to-load.html
Normal file
|
@ -0,0 +1,199 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<head>
|
||||
<style type="text/css">
|
||||
|
||||
/* By default, hide the custom IS stuff - enabled in JS */
|
||||
#custom_is, #is_url {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
background: #c5e0f7;
|
||||
background: -moz-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
|
||||
background: -webkit-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
|
||||
background: linear-gradient(to bottom, #c5e0f7 0%, #ffffff 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c5e0f7', endColorstr='#ffffff', GradientType=0);
|
||||
max-width: 680px;
|
||||
margin: auto;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
}
|
||||
|
||||
.mx_Button {
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
font-size: 18px;
|
||||
margin-left: 4px;
|
||||
margin-right: 4px;
|
||||
min-width: 80px;
|
||||
background-color: #03B381;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
padding: 12px 22px;
|
||||
word-break: break-word;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.mx_Center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.mx_ClearDecoration {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.mx_HomePage_header {
|
||||
color: #2E2F32;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.mx_HomePage h3 {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.mx_HomePage_header {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.mx_HomePage_col {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.mx_HomePage_row {
|
||||
flex: 1 1 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.mx_HomePage_logo {
|
||||
margin-right: 20px;
|
||||
margin-top: -10px;
|
||||
}
|
||||
|
||||
.mx_HomePage_container {
|
||||
display: block ! important;
|
||||
margin: 10px 20px;
|
||||
}
|
||||
|
||||
.mx_HomePage_errorContainer {
|
||||
display: none; /* shown in JS if needed */
|
||||
margin: 20px;
|
||||
border: 1px solid red;
|
||||
background-color: #ffb9b9;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.mx_HomePage_container h1,
|
||||
.mx_HomePage_container h2,
|
||||
.mx_HomePage_container h3,
|
||||
.mx_HomePage_container h4 {
|
||||
font-weight: 600;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.mx_Spacer {
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.mx_FooterLink {
|
||||
color: #368BD6;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.mx_Subtext {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.mx_SubtextTop {
|
||||
margin-top: 32px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1120px) {
|
||||
body {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.mx_Button {
|
||||
font-size: 18px;
|
||||
padding: 14px 28px;
|
||||
}
|
||||
|
||||
.mx_HomePage_header {
|
||||
justify-content: left;
|
||||
}
|
||||
|
||||
.mx_Spacer {
|
||||
margin-top: 24px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<meta name="apple-itunes-app" content="app-id=id1083446067">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="mx_HomePage_errorContainer">
|
||||
<!-- populated by JS if needed -->
|
||||
</div>
|
||||
|
||||
<div class="mx_HomePage_container">
|
||||
<div class="mx_HomePage_header">
|
||||
<span class="mx_HomePage_logo">
|
||||
<svg width="34px" height="42px" viewBox="0 0 34 42" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="blue" transform="translate(1.000000, 1.000000)">
|
||||
<path
|
||||
d="M11.6756011,11.3799998 L11.6756011,17.149751 L17.5348252,17.1437188 C17.6092313,17.1437188 17.6771226,17.1417081 17.744671,17.1373516 C19.2852547,17.0358104 20.4894678,15.7727453 20.4894678,14.2620269 C20.4894678,12.6725555 19.1669592,11.3799998 17.5406542,11.3799998 L11.6756011,11.3799998 Z M5.88083947,39.8778856 C2.68069092,39.8778856 0.0860778277,37.342372 0.0860778277,34.2143673 L0.0860778277,23.4205057 C0.0651618241,23.2247959 0.0538388139,23.025735 0.0538388139,22.8243282 C0.0535037238,22.6192351 0.0644760535,22.416823 0.0860778277,22.2170918 L0.0860778277,5.71648153 C0.0860778277,2.58847681 2.68069092,0.0526281121 5.88083947,0.0526281121 L17.5406542,0.0526281121 C25.5573126,0.0526281121 32.079334,6.42693471 32.079334,14.2620269 C32.079334,21.7113966 26.1261594,27.9382507 18.5264495,28.4382489 C18.2034515,28.4600316 17.8705099,28.4710906 17.5406542,28.4710906 L11.6756011,28.4767876 L11.6756011,34.2143673 C11.6756011,37.342372 9.08133089,39.8778856 5.88083947,39.8778856 L5.88083947,39.8778856 Z"
|
||||
id="Fill-1" fill="#A2DDEF"></path>
|
||||
<path
|
||||
d="M11.6756011,11.3799998 L11.6756011,17.149751 L17.5348252,17.1437188 C17.6092313,17.1437188 17.6771226,17.1417081 17.744671,17.1373516 C19.2852547,17.0358104 20.4894678,15.7727453 20.4894678,14.2620269 C20.4894678,12.6725555 19.1669592,11.3799998 17.5406542,11.3799998 L11.6756011,11.3799998 Z M5.88083947,39.8778856 C2.68069092,39.8778856 0.0860778277,37.342372 0.0860778277,34.2143673 L0.0860778277,23.4205057 C0.0651618241,23.2247959 0.0538388139,23.025735 0.0538388139,22.8243282 C0.0535037238,22.6192351 0.0644760535,22.416823 0.0860778277,22.2170918 L0.0860778277,5.71648153 C0.0860778277,2.58847681 2.68069092,0.0526281121 5.88083947,0.0526281121 L17.5406542,0.0526281121 C25.5573126,0.0526281121 32.079334,6.42693471 32.079334,14.2620269 C32.079334,21.7113966 26.1261594,27.9382507 18.5264495,28.4382489 C18.2034515,28.4600316 17.8705099,28.4710906 17.5406542,28.4710906 L11.6756011,28.4767876 L11.6756011,34.2143673 C11.6756011,37.342372 9.08133089,39.8778856 5.88083947,39.8778856 Z"
|
||||
id="Stroke-3" stroke="#368BD6" stroke-width="1.02344117"></path>
|
||||
<path
|
||||
d="M5.88087375,34.2142667 L5.88087375,5.716381 L17.5406885,5.716381 C22.3695423,5.716381 26.2842638,9.54243948 26.2842638,14.2619264 C26.2842638,18.7857035 22.6877398,22.488438 18.1373089,22.7876997 C17.939807,22.8007693 17.7412764,22.8074717 17.5406885,22.8074717 L5.84864254,22.8188658"
|
||||
id="Stroke-5" stroke="#368BD6" stroke-width="1.02344117" stroke-linecap="round"></path>
|
||||
<path
|
||||
d="M22.882533,19.5375774 L31.0723484,30.9604582 C32.909185,33.5221111 32.2731328,37.0539347 29.6524604,38.8484992 C28.640263,39.5418613 27.480282,39.8746349 26.3319591,39.8746349 C24.505752,39.8746349 22.709033,39.0334852 21.5812832,37.4607697 L13.3914677,26.0378889 C11.5549741,23.476236 12.1910263,19.9444124 14.8116987,18.1498479 C17.432371,16.3539429 21.0460393,16.9759245 22.882533,19.5375774 Z M10.6558259,2.46823596 C11.5442417,3.70717248 11.8854126,5.21051822 11.6165905,6.69945383 C11.3474256,8.1893948 10.5004989,9.48731234 9.23182325,10.3549365 C6.61252242,12.1461499 2.98925341,11.5224926 1.15515992,8.96452603 C0.266744094,7.72558951 -0.0744267831,6.22257889 0.194738181,4.73297304 C0.463560259,3.24336719 1.31048696,1.94511453 2.57950547,1.07782546 C5.19880631,-0.713387872 8.82173243,-0.08973062 10.6558259,2.46823596 Z"
|
||||
id="Combined-Shape" fill="#368BD6"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</span>
|
||||
<h1>Unable to load</h1>
|
||||
</div>
|
||||
<div class="mx_HomePage_col">
|
||||
<div class="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step1_heading">Riot can't load</h2>
|
||||
<p>Something went wrong and riot was unable to load.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mx_HomePage_row mx_Center mx_Spacer">
|
||||
<p class="mx_Spacer">
|
||||
<a href="https://riot.im" target="_blank" class="mx_FooterLink">
|
||||
Go to Riot.im
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
Loading…
Add table
Add a link
Reference in a new issue