diff --git a/index.html b/index.html
index 2eefeee2..7242f309 100644
--- a/index.html
+++ b/index.html
@@ -4,21 +4,17 @@
-
Cinny
-
-
+ Ratatoskr
+
+
-
+
-
-
-
+
+
-
-
+
+
diff --git a/public/favicon.ico b/public/favicon.ico
index 91671306..cfce9943 100644
Binary files a/public/favicon.ico and b/public/favicon.ico differ
diff --git a/public/manifest.json b/public/manifest.json
index acdcd004..81fd714c 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,7 +1,7 @@
{
- "name": "Cinny",
- "short_name": "Cinny",
- "description": "Yet another matrix client",
+ "name": "Ratatoskr",
+ "short_name": "Ratatoskr",
+ "description": "GameCult's Matrix client",
"dir": "auto",
"lang": "en-US",
"display": "standalone",
diff --git a/public/res/android/android-chrome-144x144.png b/public/res/android/android-chrome-144x144.png
index 8c8c2668..d76ed356 100644
Binary files a/public/res/android/android-chrome-144x144.png and b/public/res/android/android-chrome-144x144.png differ
diff --git a/public/res/android/android-chrome-192x192.png b/public/res/android/android-chrome-192x192.png
index 6d53edb5..7689b6d0 100644
Binary files a/public/res/android/android-chrome-192x192.png and b/public/res/android/android-chrome-192x192.png differ
diff --git a/public/res/android/android-chrome-256x256.png b/public/res/android/android-chrome-256x256.png
index 57378b41..2f61f46b 100644
Binary files a/public/res/android/android-chrome-256x256.png and b/public/res/android/android-chrome-256x256.png differ
diff --git a/public/res/android/android-chrome-36x36.png b/public/res/android/android-chrome-36x36.png
index 507c4439..91b26af2 100644
Binary files a/public/res/android/android-chrome-36x36.png and b/public/res/android/android-chrome-36x36.png differ
diff --git a/public/res/android/android-chrome-384x384.png b/public/res/android/android-chrome-384x384.png
index 92fd32c7..ab06a074 100644
Binary files a/public/res/android/android-chrome-384x384.png and b/public/res/android/android-chrome-384x384.png differ
diff --git a/public/res/android/android-chrome-48x48.png b/public/res/android/android-chrome-48x48.png
index 489cfd32..f8fafcd9 100644
Binary files a/public/res/android/android-chrome-48x48.png and b/public/res/android/android-chrome-48x48.png differ
diff --git a/public/res/android/android-chrome-512x512.png b/public/res/android/android-chrome-512x512.png
index d312b532..2c584f3d 100644
Binary files a/public/res/android/android-chrome-512x512.png and b/public/res/android/android-chrome-512x512.png differ
diff --git a/public/res/android/android-chrome-72x72.png b/public/res/android/android-chrome-72x72.png
index 8e04930c..32d5d516 100644
Binary files a/public/res/android/android-chrome-72x72.png and b/public/res/android/android-chrome-72x72.png differ
diff --git a/public/res/android/android-chrome-96x96.png b/public/res/android/android-chrome-96x96.png
index 44981d96..5da68e4b 100644
Binary files a/public/res/android/android-chrome-96x96.png and b/public/res/android/android-chrome-96x96.png differ
diff --git a/public/res/apple/apple-touch-icon-114x114.png b/public/res/apple/apple-touch-icon-114x114.png
index 418f8833..1ff43a12 100644
Binary files a/public/res/apple/apple-touch-icon-114x114.png and b/public/res/apple/apple-touch-icon-114x114.png differ
diff --git a/public/res/apple/apple-touch-icon-120x120.png b/public/res/apple/apple-touch-icon-120x120.png
index 1d570eba..d10efb31 100644
Binary files a/public/res/apple/apple-touch-icon-120x120.png and b/public/res/apple/apple-touch-icon-120x120.png differ
diff --git a/public/res/apple/apple-touch-icon-144x144.png b/public/res/apple/apple-touch-icon-144x144.png
index b6a731eb..d76ed356 100644
Binary files a/public/res/apple/apple-touch-icon-144x144.png and b/public/res/apple/apple-touch-icon-144x144.png differ
diff --git a/public/res/apple/apple-touch-icon-152x152.png b/public/res/apple/apple-touch-icon-152x152.png
index 968ae2f0..76590ddf 100644
Binary files a/public/res/apple/apple-touch-icon-152x152.png and b/public/res/apple/apple-touch-icon-152x152.png differ
diff --git a/public/res/apple/apple-touch-icon-167x167.png b/public/res/apple/apple-touch-icon-167x167.png
index a41d0d10..3f26f91b 100644
Binary files a/public/res/apple/apple-touch-icon-167x167.png and b/public/res/apple/apple-touch-icon-167x167.png differ
diff --git a/public/res/apple/apple-touch-icon-180x180.png b/public/res/apple/apple-touch-icon-180x180.png
index a651cd1c..ed498370 100644
Binary files a/public/res/apple/apple-touch-icon-180x180.png and b/public/res/apple/apple-touch-icon-180x180.png differ
diff --git a/public/res/apple/apple-touch-icon-57x57.png b/public/res/apple/apple-touch-icon-57x57.png
index f5ff2ea5..2e2081f5 100644
Binary files a/public/res/apple/apple-touch-icon-57x57.png and b/public/res/apple/apple-touch-icon-57x57.png differ
diff --git a/public/res/apple/apple-touch-icon-60x60.png b/public/res/apple/apple-touch-icon-60x60.png
index 47fafb07..87c8fc2b 100644
Binary files a/public/res/apple/apple-touch-icon-60x60.png and b/public/res/apple/apple-touch-icon-60x60.png differ
diff --git a/public/res/apple/apple-touch-icon-72x72.png b/public/res/apple/apple-touch-icon-72x72.png
index 6e5b13c4..32d5d516 100644
Binary files a/public/res/apple/apple-touch-icon-72x72.png and b/public/res/apple/apple-touch-icon-72x72.png differ
diff --git a/public/res/apple/apple-touch-icon-76x76.png b/public/res/apple/apple-touch-icon-76x76.png
index 7799a6fd..1164b72d 100644
Binary files a/public/res/apple/apple-touch-icon-76x76.png and b/public/res/apple/apple-touch-icon-76x76.png differ
diff --git a/public/res/svg/cinny-highlight.svg b/public/res/svg/cinny-highlight.svg
deleted file mode 100644
index d59b42a1..00000000
--- a/public/res/svg/cinny-highlight.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/public/res/svg/cinny-unread.svg b/public/res/svg/cinny-unread.svg
deleted file mode 100644
index be301375..00000000
--- a/public/res/svg/cinny-unread.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/public/res/svg/cinny.svg b/public/res/svg/cinny.svg
deleted file mode 100644
index 8701d67b..00000000
--- a/public/res/svg/cinny.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/res/svg/ratatoskr-highlight.svg b/public/res/svg/ratatoskr-highlight.svg
new file mode 100644
index 00000000..661442d4
--- /dev/null
+++ b/public/res/svg/ratatoskr-highlight.svg
@@ -0,0 +1,17 @@
+
diff --git a/public/res/svg/ratatoskr-unread.svg b/public/res/svg/ratatoskr-unread.svg
new file mode 100644
index 00000000..69a08c95
--- /dev/null
+++ b/public/res/svg/ratatoskr-unread.svg
@@ -0,0 +1,17 @@
+
diff --git a/public/res/svg/ratatoskr.svg b/public/res/svg/ratatoskr.svg
new file mode 100644
index 00000000..3ca98122
--- /dev/null
+++ b/public/res/svg/ratatoskr.svg
@@ -0,0 +1,15 @@
+
diff --git a/scripts/gen-brand.mjs b/scripts/gen-brand.mjs
new file mode 100644
index 00000000..fa44bfde
--- /dev/null
+++ b/scripts/gen-brand.mjs
@@ -0,0 +1,202 @@
+// Draws the Ratatoskr squirrel once, as shapes, and writes the SVG logos plus the
+// favicon and app-icon PNGs from the same shapes (no image tools needed).
+// Run: node scripts/gen-brand.mjs
+import { deflateSync } from 'node:zlib';
+import { mkdirSync, writeFileSync } from 'node:fs';
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const root = join(dirname(fileURLToPath(import.meta.url)), '..');
+const BG = '#1c1b22';
+
+// Squirrel facing right on a 64x64 grid. Later shapes draw over earlier ones.
+const squirrel = [
+ { t: 'ellipse', cx: 19, cy: 33, rx: 13, ry: 22, rot: -15, fill: '#d9742b' },
+ { t: 'ellipse', cx: 21, cy: 33, rx: 7, ry: 15, rot: -15, fill: '#f0a45d' },
+ { t: 'ellipse', cx: 36, cy: 43, rx: 11, ry: 14, rot: 0, fill: '#e0833a' },
+ { t: 'ellipse', cx: 40, cy: 46, rx: 6, ry: 9, rot: 0, fill: '#f6dcb8' },
+ {
+ t: 'poly',
+ pts: [
+ [35, 19],
+ [36, 7],
+ [43, 15],
+ ],
+ fill: '#c9672a',
+ },
+ {
+ t: 'poly',
+ pts: [
+ [44, 15],
+ [50, 7],
+ [52, 19],
+ ],
+ fill: '#c9672a',
+ },
+ { t: 'circle', cx: 43, cy: 25, r: 10, fill: '#e0833a' },
+ { t: 'ellipse', cx: 47, cy: 29, rx: 5, ry: 3.5, rot: 0, fill: '#f6dcb8' },
+ { t: 'circle', cx: 46.5, cy: 23.5, r: 1.8, fill: '#1a1a1a' },
+ { t: 'circle', cx: 47, cy: 23, r: 0.6, fill: '#ffffff' },
+ { t: 'circle', cx: 52, cy: 27.5, r: 1.5, fill: '#1a1a1a' },
+ { t: 'ellipse', cx: 33, cy: 56, rx: 5, ry: 2.5, rot: 0, fill: '#c9672a' },
+ { t: 'ellipse', cx: 44, cy: 56, rx: 4.5, ry: 2.5, rot: 0, fill: '#c9672a' },
+];
+const badge = (fill) => [
+ { t: 'circle', cx: 52, cy: 52, r: 11, fill: '#ffffff' },
+ { t: 'circle', cx: 52, cy: 52, r: 8, fill },
+];
+const background = [{ t: 'rect', x: 0, y: 0, w: 64, h: 64, fill: BG }];
+
+const f = (n) => +n.toFixed(2);
+const svgOf = (shapes) =>
+ shapes
+ .map((s) => {
+ if (s.t === 'circle')
+ return ``;
+ if (s.t === 'rect') return ``;
+ if (s.t === 'poly')
+ return ``;
+ return ``;
+ })
+ .join('\n');
+const writeSvg = (name, shapes) =>
+ writeFileSync(
+ join(root, 'public/res/svg', name),
+ `\n`
+ );
+
+const hex = (h) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16));
+const inside = (s, x, y) => {
+ if (s.t === 'rect') return x >= s.x && x < s.x + s.w && y >= s.y && y < s.y + s.h;
+ if (s.t === 'circle') return (x - s.cx) ** 2 + (y - s.cy) ** 2 <= s.r ** 2;
+ if (s.t === 'ellipse') {
+ const a = (-s.rot * Math.PI) / 180;
+ const dx = x - s.cx;
+ const dy = y - s.cy;
+ const u = dx * Math.cos(a) - dy * Math.sin(a);
+ const v = dx * Math.sin(a) + dy * Math.cos(a);
+ return (u / s.rx) ** 2 + (v / s.ry) ** 2 <= 1;
+ }
+ let c = false;
+ for (let i = 0, j = s.pts.length - 1; i < s.pts.length; j = i++) {
+ const [xi, yi] = s.pts[i];
+ const [xj, yj] = s.pts[j];
+ if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) c = !c;
+ }
+ return c;
+};
+
+const crcTable = Array.from({ length: 256 }, (_, n) => {
+ let c = n;
+ for (let k = 0; k < 8; k += 1) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
+ return c >>> 0;
+});
+const crc = (b) => {
+ let c = 0xffffffff;
+ for (const x of b) c = crcTable[(c ^ x) & 255] ^ (c >>> 8);
+ return (c ^ 0xffffffff) >>> 0;
+};
+const chunk = (type, data) => {
+ const out = Buffer.alloc(12 + data.length);
+ out.writeUInt32BE(data.length, 0);
+ out.write(type, 4, 'ascii');
+ data.copy(out, 8);
+ out.writeUInt32BE(crc(out.subarray(4, 8 + data.length)), 8 + data.length);
+ return out;
+};
+
+// Rasterise with 4x4 supersampling; `scale` shrinks the drawing about the centre.
+const png = (shapes, size, scale = 1) => {
+ const rgba = Buffer.alloc(size * size * 4);
+ const SS = 4;
+ const colours = shapes.map((s) => hex(s.fill));
+ for (let py = 0; py < size; py += 1) {
+ for (let px = 0; px < size; px += 1) {
+ let r = 0;
+ let g = 0;
+ let b = 0;
+ let a = 0;
+ for (let sy = 0; sy < SS; sy += 1) {
+ for (let sx = 0; sx < SS; sx += 1) {
+ const gx = ((px + (sx + 0.5) / SS) / size) * 64;
+ const gy = ((py + (sy + 0.5) / SS) / size) * 64;
+ // the background rect covers the whole canvas and ignores `scale`
+ let hit = -1;
+ shapes.forEach((s, i) => {
+ const x = s.t === 'rect' ? gx : (gx - 32) / scale + 32;
+ const y = s.t === 'rect' ? gy : (gy - 32) / scale + 32;
+ if (inside(s, x, y)) hit = i;
+ });
+ if (hit >= 0) {
+ [r, g, b] = [r + colours[hit][0], g + colours[hit][1], b + colours[hit][2]];
+ a += 1;
+ }
+ }
+ }
+ const o = (py * size + px) * 4;
+ if (a > 0) {
+ rgba[o] = Math.round(r / a);
+ rgba[o + 1] = Math.round(g / a);
+ rgba[o + 2] = Math.round(b / a);
+ }
+ rgba[o + 3] = Math.round((a / (SS * SS)) * 255);
+ }
+ }
+ const raw = Buffer.alloc(size * (size * 4 + 1));
+ for (let y = 0; y < size; y += 1) {
+ raw[y * (size * 4 + 1)] = 0;
+ rgba.copy(raw, y * (size * 4 + 1) + 1, y * size * 4, (y + 1) * size * 4);
+ }
+ const ihdr = Buffer.alloc(13);
+ ihdr.writeUInt32BE(size, 0);
+ ihdr.writeUInt32BE(size, 4);
+ ihdr.set([8, 6, 0, 0, 0], 8);
+ return Buffer.concat([
+ Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]),
+ chunk('IHDR', ihdr),
+ chunk('IDAT', deflateSync(raw)),
+ chunk('IEND', Buffer.alloc(0)),
+ ]);
+};
+
+// ICO container holding PNG images.
+const ico = (images) => {
+ const head = Buffer.alloc(6 + images.length * 16);
+ head.writeUInt16LE(1, 2);
+ head.writeUInt16LE(images.length, 4);
+ let offset = head.length;
+ images.forEach(({ size, data }, i) => {
+ const e = 6 + i * 16;
+ head[e] = size;
+ head[e + 1] = size;
+ head.writeUInt16LE(1, e + 4);
+ head.writeUInt16LE(32, e + 6);
+ head.writeUInt32LE(data.length, e + 8);
+ head.writeUInt32LE(offset, e + 12);
+ offset += data.length;
+ });
+ return Buffer.concat([head, ...images.map((i) => i.data)]);
+};
+
+writeSvg('ratatoskr.svg', squirrel);
+writeSvg('ratatoskr-unread.svg', [...squirrel, ...badge('#989898')]);
+writeSvg('ratatoskr-highlight.svg', [...squirrel, ...badge('#45B83B')]);
+
+const icon = [...background, ...squirrel];
+const put = (dir, name, size) => {
+ mkdirSync(join(root, 'public/res', dir), { recursive: true });
+ writeFileSync(join(root, 'public/res', dir, name), png(icon, size, 0.82));
+};
+[36, 48, 72, 96, 144, 192, 256, 384, 512].forEach((s) =>
+ put('android', `android-chrome-${s}x${s}.png`, s)
+);
+[57, 60, 72, 76, 114, 120, 144, 152, 167, 180].forEach((s) =>
+ put('apple', `apple-touch-icon-${s}x${s}.png`, s)
+);
+writeFileSync(
+ join(root, 'public/favicon.ico'),
+ ico([16, 32, 48].map((size) => ({ size, data: png(icon, size, 0.9) })))
+);
+console.log('wrote svg logos, favicon.ico, android and apple icons');
diff --git a/src/app/components/splash-screen/SplashScreen.tsx b/src/app/components/splash-screen/SplashScreen.tsx
index 27adadba..8e8f05b6 100644
--- a/src/app/components/splash-screen/SplashScreen.tsx
+++ b/src/app/components/splash-screen/SplashScreen.tsx
@@ -21,7 +21,7 @@ export function SplashScreen({ children }: SplashScreenProps) {
justifyContent="Center"
>
- Cinny
+ Ratatoskr
diff --git a/src/app/features/settings/about/About.tsx b/src/app/features/settings/about/About.tsx
index d3dcde96..6b304965 100644
--- a/src/app/features/settings/about/About.tsx
+++ b/src/app/features/settings/about/About.tsx
@@ -4,7 +4,7 @@ import { Page, PageContent, PageHeader } from '../../../components/page';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../styles.css';
import { SettingTile } from '../../../components/setting-tile';
-import CinnySVG from '../../../../../public/res/svg/cinny.svg';
+import RatatoskrSVG from '../../../../../public/res/svg/ratatoskr.svg';
import { clearCacheAndReload } from '../../../../client/initMatrix';
import { useMatrixClient } from '../../../hooks/useMatrixClient';
@@ -38,23 +38,23 @@ export function About({ requestClose }: AboutProps) {
- Cinny
+ Ratatoskr
v4.12.8
- Yet another matrix client.
+ GameCult's Matrix client.
- }
- >
- Support
-
+
+ Based on{' '}
+
+ Cinny
+ {' '}
+ 4.12.8 by Ajay Bura and contributors. Ratatoskr is free software under the GNU
+ Affero General Public License v3; its source is at the Source Code link above.
+
diff --git a/src/app/features/settings/devices/LocalBackup.tsx b/src/app/features/settings/devices/LocalBackup.tsx
index 00128c8f..4fcdacdb 100644
--- a/src/app/features/settings/devices/LocalBackup.tsx
+++ b/src/app/features/settings/devices/LocalBackup.tsx
@@ -28,7 +28,7 @@ function ExportKeys() {
const blob = new Blob([encKeys], {
type: 'text/plain;charset=us-ascii',
});
- FileSaver.saveAs(blob, 'cinny-keys.txt');
+ FileSaver.saveAs(blob, 'ratatoskr-keys.txt');
},
[mx]
)
diff --git a/src/app/features/settings/notifications/SystemNotification.tsx b/src/app/features/settings/notifications/SystemNotification.tsx
index e0df06df..38115980 100644
--- a/src/app/features/settings/notifications/SystemNotification.tsx
+++ b/src/app/features/settings/notifications/SystemNotification.tsx
@@ -27,7 +27,7 @@ function EmailNotification() {
device_display_name: email,
lang: 'en',
data: {
- brand: 'Cinny',
+ brand: 'Ratatoskr',
},
append: true,
});
diff --git a/src/app/pages/auth/AuthFooter.tsx b/src/app/pages/auth/AuthFooter.tsx
index b0b94319..2b888f55 100644
--- a/src/app/pages/auth/AuthFooter.tsx
+++ b/src/app/pages/auth/AuthFooter.tsx
@@ -5,20 +5,26 @@ import * as css from './styles.css';
export function AuthFooter() {
return (
-
+
About
- v4.12.8
+ Source
-
- Twitter
+
+ Based on Cinny
Powered by Matrix
diff --git a/src/app/pages/auth/AuthLayout.tsx b/src/app/pages/auth/AuthLayout.tsx
index 3943f42d..c53e5a65 100644
--- a/src/app/pages/auth/AuthLayout.tsx
+++ b/src/app/pages/auth/AuthLayout.tsx
@@ -20,7 +20,7 @@ import {
} from '../../hooks/useClientConfig';
import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback';
import { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH } from '../paths';
-import CinnySVG from '../../../../public/res/svg/cinny.svg';
+import RatatoskrSVG from '../../../../public/res/svg/ratatoskr.svg';
import { ServerPicker } from './ServerPicker';
import { AutoDiscoveryAction, autoDiscovery } from '../../cs-api';
import { SpecVersionsLoader } from '../../components/SpecVersionsLoader';
@@ -134,8 +134,8 @@ export function AuthLayout() {
-
- Cinny
+
+ Ratatoskr
diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx
index 62f46dd2..3c8641d9 100644
--- a/src/app/pages/auth/login/PasswordLoginForm.tsx
+++ b/src/app/pages/auth/login/PasswordLoginForm.tsx
@@ -133,7 +133,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog
user: username,
},
password,
- initial_device_display_name: 'Cinny Web',
+ initial_device_display_name: 'Ratatoskr Web',
});
};
@@ -151,7 +151,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog
user: mxIdUsername,
},
password,
- initial_device_display_name: 'Cinny Web',
+ initial_device_display_name: 'Ratatoskr Web',
});
};
const handleEmailLogin = (email: string, password: string) => {
@@ -163,7 +163,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog
address: email,
},
password,
- initial_device_display_name: 'Cinny Web',
+ initial_device_display_name: 'Ratatoskr Web',
});
};
diff --git a/src/app/pages/auth/login/TokenLogin.tsx b/src/app/pages/auth/login/TokenLogin.tsx
index 761d5dc5..0541742d 100644
--- a/src/app/pages/auth/login/TokenLogin.tsx
+++ b/src/app/pages/auth/login/TokenLogin.tsx
@@ -57,7 +57,7 @@ export function TokenLogin({ token }: TokenLoginProps) {
startLogin(baseUrl, {
type: 'm.login.token',
token,
- initial_device_display_name: 'Cinny Web',
+ initial_device_display_name: 'Ratatoskr Web',
});
}, [baseUrl, token, startLogin]);
diff --git a/src/app/pages/auth/register/PasswordRegisterForm.tsx b/src/app/pages/auth/register/PasswordRegisterForm.tsx
index 9f173422..c9b1924c 100644
--- a/src/app/pages/auth/register/PasswordRegisterForm.tsx
+++ b/src/app/pages/auth/register/PasswordRegisterForm.tsx
@@ -109,7 +109,7 @@ function RegisterUIAFlow({
auth: authDict,
password,
username,
- initial_device_display_name: 'Cinny Web',
+ initial_device_display_name: 'Ratatoskr Web',
});
},
[onRegister, formData]
@@ -250,7 +250,7 @@ export function PasswordRegisterForm({
auth: {
session: authData.session,
},
- initial_device_display_name: 'Cinny Web',
+ initial_device_display_name: 'Ratatoskr Web',
});
};
diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx
index ce952bfc..db3eefc2 100644
--- a/src/app/pages/client/ClientNonUIFeatures.tsx
+++ b/src/app/pages/client/ClientNonUIFeatures.tsx
@@ -3,9 +3,9 @@ import React, { ReactNode, useCallback, useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import { RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk';
import { roomToUnreadAtom, unreadEqual, unreadInfoToUnread } from '../../state/room/roomToUnread';
-import LogoSVG from '../../../../public/res/svg/cinny.svg';
-import LogoUnreadSVG from '../../../../public/res/svg/cinny-unread.svg';
-import LogoHighlightSVG from '../../../../public/res/svg/cinny-highlight.svg';
+import LogoSVG from '../../../../public/res/svg/ratatoskr.svg';
+import LogoUnreadSVG from '../../../../public/res/svg/ratatoskr-unread.svg';
+import LogoHighlightSVG from '../../../../public/res/svg/ratatoskr-highlight.svg';
import NotificationSound from '../../../../public/sound/notification.ogg';
import InviteSound from '../../../../public/sound/invite.ogg';
import { notificationPermission, setFavicon } from '../../utils/dom';
diff --git a/src/app/pages/client/WelcomePage.tsx b/src/app/pages/client/WelcomePage.tsx
index 6a25392c..74869c3f 100644
--- a/src/app/pages/client/WelcomePage.tsx
+++ b/src/app/pages/client/WelcomePage.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import { Box, Button, Icon, Icons, Text, config, toRem } from 'folds';
import { Page, PageHero, PageHeroSection } from '../../components/page';
-import CinnySVG from '../../../../public/res/svg/cinny.svg';
+import RatatoskrSVG from '../../../../public/res/svg/ratatoskr.svg';
export function WelcomePage() {
return (
@@ -14,17 +14,17 @@ export function WelcomePage() {
>
}
- title="Welcome to Cinny"
+ icon={
}
+ title="Welcome to Ratatoskr"
subTitle={
- Yet another matrix client.{' '}
+ GameCult's Matrix client, based on{' '}
- v4.12.8
+ Cinny
}
@@ -33,7 +33,7 @@ export function WelcomePage() {
}
@@ -42,18 +42,6 @@ export function WelcomePage() {
Source Code
- }
- >
-
- Support
-
-