++ { body }
++ { widgets }
++
++ );
++ }
+ return (
+
+ {body}
+diff --git a/src/utils/FileUtils.ts b/src/utils/FileUtils.ts
+index 194cb31d20..0c0aec2138 100644
+--- a/src/utils/FileUtils.ts
++++ b/src/utils/FileUtils.ts
+@@ -38,7 +38,9 @@ export function presentableTextForFile(
+ shortened = false,
+ ): string {
+ let text = fallbackText;
+- if (content.body?.length) {
++ if (content.filename?.length) {
++ text = content.filename
++ } else if (content.body?.length) {
+ // The content body should be the name of the file including a
+ // file extension.
+ text = content.body;
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0005-Don-t-preview-reactions.patch b/patches/matrix-react-sdk/0005-Don-t-preview-reactions.patch
new file mode 100644
index 0000000..b935d6e
--- /dev/null
+++ b/patches/matrix-react-sdk/0005-Don-t-preview-reactions.patch
@@ -0,0 +1,29 @@
+From 0f0f80d270be5c88b0b762b51fe570c11b0bea7f Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Thu, 14 Dec 2023 10:32:10 +0100
+Subject: Don't preview reactions
+
+---
+ src/stores/room-list/MessagePreviewStore.ts | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/stores/room-list/MessagePreviewStore.ts b/src/stores/room-list/MessagePreviewStore.ts
+index e0e06ec980..7ee27f8402 100644
+--- a/src/stores/room-list/MessagePreviewStore.ts
++++ b/src/stores/room-list/MessagePreviewStore.ts
+@@ -57,10 +57,12 @@ const PREVIEWS: Record<
+ isState: false,
+ previewer: new StickerEventPreview(),
+ },
++ /*
+ "m.reaction": {
+ isState: false,
+ previewer: new ReactionEventPreview(),
+ },
++ */
+ [M_POLL_START.name]: {
+ isState: false,
+ previewer: new PollStartEventPreview(),
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0006-Hide-the-mute-notification-state-the-same-way-as-the.patch b/patches/matrix-react-sdk/0006-Hide-the-mute-notification-state-the-same-way-as-the.patch
new file mode 100644
index 0000000..eafb725
--- /dev/null
+++ b/patches/matrix-react-sdk/0006-Hide-the-mute-notification-state-the-same-way-as-the.patch
@@ -0,0 +1,30 @@
+From bc49b8d30cf7e0da038fac992ee2ff04c9dc91aa Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Wed, 17 Nov 2021 12:50:25 +0100
+Subject: Hide the "mute" notification state the same way as the other states
+
+This can get in the way of the "marked as unread" icon otherwise.
+Furthermore, I didn't really like it showing there persistently either
+way.
+---
+ src/components/views/rooms/RoomTile.tsx | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx
+index 93fb42f447..09df8eaac9 100644
+--- a/src/components/views/rooms/RoomTile.tsx
++++ b/src/components/views/rooms/RoomTile.tsx
+@@ -304,7 +304,9 @@ export class RoomTile extends React.PureComponent {
+
+ // Only show the icon by default if the room is overridden to muted.
+ // TODO: [FTUE Notifications] Probably need to detect global mute state
+- mx_RoomTile_notificationsButton_show: state === RoomNotifState.Mute,
++ //mx_RoomTile_notificationsButton_show: state === RoomNotifState.Mute,
++ // SchildiChat: never show the icon by default. This gets in the way of the "marked as unread" icon.
++ mx_RoomTile_notificationsButton_show: false,
+ });
+
+ return (
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0007-Allow-muted-rooms-to-render-as-unread.patch b/patches/matrix-react-sdk/0007-Allow-muted-rooms-to-render-as-unread.patch
new file mode 100644
index 0000000..dd98773
--- /dev/null
+++ b/patches/matrix-react-sdk/0007-Allow-muted-rooms-to-render-as-unread.patch
@@ -0,0 +1,25 @@
+From 10b23f715bf5115715dca07676ca467a6433c9c9 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Fri, 10 May 2024 18:58:32 +0200
+Subject: Allow muted rooms to render as unread
+
+---
+ src/RoomNotifs.ts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/RoomNotifs.ts b/src/RoomNotifs.ts
+index cc027c9682..c4c31a51cb 100644
+--- a/src/RoomNotifs.ts
++++ b/src/RoomNotifs.ts
+@@ -255,7 +255,7 @@ export function determineUnreadState(
+ return { symbol: "!", count: 1, level: NotificationLevel.Highlight };
+ }
+
+- if (getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) {
++ if (false && getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) {
+ return { symbol: null, count: 0, level: NotificationLevel.None };
+ }
+
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0008-Increase-default-visible-tiles.patch b/patches/matrix-react-sdk/0008-Increase-default-visible-tiles.patch
new file mode 100644
index 0000000..e2d8e51
--- /dev/null
+++ b/patches/matrix-react-sdk/0008-Increase-default-visible-tiles.patch
@@ -0,0 +1,25 @@
+From 641cd216c155318e35eabef30761613706e36c87 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Sun, 30 Aug 2020 15:33:01 +0200
+Subject: Increase default visible tiles
+
+---
+ src/stores/room-list/ListLayout.ts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/stores/room-list/ListLayout.ts b/src/stores/room-list/ListLayout.ts
+index ff60309e08..275b6d330b 100644
+--- a/src/stores/room-list/ListLayout.ts
++++ b/src/stores/room-list/ListLayout.ts
+@@ -74,7 +74,7 @@ export class ListLayout {
+
+ public get defaultVisibleTiles(): number {
+ // This number is what "feels right", and mostly subject to design's opinion.
+- return 8;
++ return 50;
+ }
+
+ public tilesWithPadding(n: number, paddingPx: number): number {
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0009-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch b/patches/matrix-react-sdk/0009-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch
new file mode 100644
index 0000000..7ef1a39
--- /dev/null
+++ b/patches/matrix-react-sdk/0009-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch
@@ -0,0 +1,92 @@
+From 2203554625f7c8d924981b3cd03b1389dc6873d9 Mon Sep 17 00:00:00 2001
+From: su-ex
+Date: Sun, 26 May 2024 10:43:36 +0200
+Subject: Bring back showSpaceDMBadges setting, force-enabled for now
+
+TODO settings UI
+
+Co-authored-by: SpiritCroc
+---
+ src/settings/Settings.tsx | 5 +++++
+ src/stores/spaces/SpaceStore.ts | 25 +++++++++++++++++++++++++
+ 2 files changed, 30 insertions(+)
+
+diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx
+index 7aea53ceea..b668c65dfd 100644
+--- a/src/settings/Settings.tsx
++++ b/src/settings/Settings.tsx
+@@ -198,6 +198,11 @@ export const SETTINGS: { [setting: string]: ISetting } = {
+ default: true,
+ controller: new ReloadOnChangeController(),
+ },
++ "Spaces.showSpaceDMBadges": {
++ displayName: _td("Show notification badges for People in Spaces"),
++ supportedLevels: LEVELS_ACCOUNT_SETTINGS,
++ default: true,
++ },
+ // SC settings end
+ "feature_video_rooms": {
+ isFeature: true,
+diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts
+index 90358f3310..60df05478a 100644
+--- a/src/stores/spaces/SpaceStore.ts
++++ b/src/stores/spaces/SpaceStore.ts
+@@ -154,9 +154,17 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
+ /** Whether the feature flag is set for MSC3946 */
+ private _msc3946ProcessDynamicPredecessor: boolean = SettingsStore.getValue("feature_dynamic_room_predecessors");
+
++ // SC start
++ private _showSpaceDMBadges = true;
++ // SC end
++
+ public constructor() {
+ super(defaultDispatcher, {});
+
++ // SC start
++ SettingsStore.monitorSetting("Spaces.showSpaceDMBadges", null);
++ // SC end
++
+ SettingsStore.monitorSetting("Spaces.allRoomsInHome", null);
+ SettingsStore.monitorSetting("Spaces.enabledMetaSpaces", null);
+ SettingsStore.monitorSetting("Spaces.showPeopleInSpace", null);
+@@ -192,6 +200,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
+ return this._allRoomsInHome;
+ }
+
++ public get showSpaceDMBadges(): boolean { // SC
++ return this._showSpaceDMBadges;
++ }
++
+ public setActiveRoomInSpace(space: SpaceKey): void {
+ if (!isMetaSpace(space) && !this.matrixClient?.getRoom(space)?.isSpaceRoom()) return;
+ if (space !== this.activeSpace) this.setActiveSpace(space, false);
+@@ -701,6 +713,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
+
+ if (room.isSpaceRoom() || !flattenedRoomsForSpace.has(room.roomId)) return false;
+
++ if (this.showSpaceDMBadges) { // SC
++ return true;
++ }
++
+ if (dmBadgeSpace && DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {
+ return s === dmBadgeSpace;
+ }
+@@ -1277,6 +1293,15 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
+ break;
+ }
+
++ case "Spaces.showSpaceDMBadges": { // SC
++ const newValue = SettingsStore.getValue("Spaces.showSpaceDMBadges");
++ if (this.showSpaceDMBadges !== newValue) {
++ this._showSpaceDMBadges = newValue;
++ this.rebuildSpaceHierarchy(); // rebuild everything
++ }
++ break;
++ }
++
+ case "Spaces.enabledMetaSpaces": {
+ const newValue = SettingsStore.getValue("Spaces.enabledMetaSpaces");
+ const enabledMetaSpaces = metaSpaceOrder.filter((k) => newValue[k]);
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0010-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch b/patches/matrix-react-sdk/0010-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch
new file mode 100644
index 0000000..a281def
--- /dev/null
+++ b/patches/matrix-react-sdk/0010-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch
@@ -0,0 +1,134 @@
+From 961ee28392810973057a0c8af410e1067a15547a Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Wed, 29 May 2024 19:32:42 +0200
+Subject: Squashed: Freeform reactions from tadzik/freeform-reactions-upstream
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit 9eea56b0080db3720efa49b457707bcde3be6474
+Merge: 06f81c9662 8570f16e31
+Author: Tadeusz Sośnierz
+Date: Tue Jun 20 09:57:19 2023 +0200
+
+ Merge branch 'develop' into tadzik/freeform-reactions-upstream
+
+commit 06f81c9662fbe033b4eac859d7e14e0ab24a6e91
+Merge: ad4fef85b1 0d6a550c33
+Author: Michael Telatynski <7t3chguy@gmail.com>
+Date: Wed Aug 31 09:06:49 2022 +0100
+
+ Merge branch 'develop' into tadzik/freeform-reactions
+
+commit ad4fef85b160087b8017b9ae9cf9aebfd5348f41
+Merge: 689b57c0b9 5aae974e93
+Author: Tadeusz Sośnierz
+Date: Sun Aug 28 10:11:48 2022 +0200
+
+ Merge branch 'develop' into tadzik/freeform-reactions
+
+commit 689b57c0b91e12907a8dbc3fac3ed10302a11e4a
+Author: Tadeusz Sośnierz
+Date: Fri May 20 10:35:06 2022 +0200
+
+ Fix conflict resolution fail in EmojiPicker
+
+commit 70a8e212b748584949b37bc99b72acffce2fd148
+Merge: 215df55f13 a0cdc93642
+Author: Tadeusz Sośnierz
+Date: Fri May 20 10:25:17 2022 +0200
+
+ Merge branch 'develop' into tadzik/freeform-reactions-upstream
+
+commit 215df55f13162bdc8eb13da5219763c56f560dd0
+Author: Tadeusz Sośnierz
+Date: Tue Aug 17 16:30:06 2021 +0200
+
+ Disable freeform emoji reactions in the message composer
+
+commit 6bb8263007e077d22929fcc1fb439d94a4f15c6f
+Author: Tadeusz Sośnierz
+Date: Tue Aug 17 12:12:28 2021 +0200
+
+ Add more typing to EmojiPicker
+
+commit b2a1728318a8a5496345797995c1ec09ae3f88e6
+Author: Tadeusz Sośnierz
+Date: Tue Aug 17 11:52:35 2021 +0200
+
+ Make free-form reaction button translatable
+
+commit f4adaf00b805baba454fbceb41cc5c081ec886a7
+Author: Tadeusz Sośnierz
+Date: Tue Aug 17 11:29:22 2021 +0200
+
+ Allow sending free-form reactions
+
+ Signed-off-by: Tadeusz Sośnierz
+---
+ src/components/views/emojipicker/EmojiPicker.tsx | 15 +++++++++++++++
+ .../views/emojipicker/ReactionPicker.tsx | 1 +
+ 2 files changed, 16 insertions(+)
+
+diff --git a/src/components/views/emojipicker/EmojiPicker.tsx b/src/components/views/emojipicker/EmojiPicker.tsx
+index 4806ad4216..7d4a4353e2 100644
+--- a/src/components/views/emojipicker/EmojiPicker.tsx
++++ b/src/components/views/emojipicker/EmojiPicker.tsx
+@@ -17,6 +17,7 @@ import Header from "./Header";
+ import Search from "./Search";
+ import Preview from "./Preview";
+ import QuickReactions from "./QuickReactions";
++import AccessibleButton from '../elements/AccessibleButton';
+ import Category, { CategoryKey, ICategory } from "./Category";
+ import { filterBoolean } from "../../../utils/arrays";
+ import {
+@@ -37,6 +38,7 @@ export const EMOJIS_PER_ROW = 8;
+ const ZERO_WIDTH_JOINER = "\u200D";
+
+ interface IProps {
++ allowUnlisted?: boolean;
+ selectedEmojis?: Set;
+ onChoose(unicode: string): boolean;
+ onFinished(): void;
+@@ -341,6 +343,10 @@ class EmojiPicker extends React.Component {
+ }
+ };
+
++ private reactWith = (reaction: string): void => {
++ this.props.onChoose(reaction);
++ };
++
+ private static categoryHeightForEmojiCount(count: number): number {
+ if (count === 0) {
+ return 0;
+@@ -396,6 +402,15 @@ class EmojiPicker extends React.Component {
+ return categoryElement;
+ })}
+
++ {
++ (this.props.allowUnlisted && this.state.filter) &&
++ this.reactWith(this.state.filter)}
++ >
++ { _t('React with "%(reaction)s"', { reaction: this.state.filter }) }
++
++ }
+ {this.state.previewEmoji ? (
+
+ ) : (
+diff --git a/src/components/views/emojipicker/ReactionPicker.tsx b/src/components/views/emojipicker/ReactionPicker.tsx
+index 2c2eb442a0..62bfd2ea0f 100644
+--- a/src/components/views/emojipicker/ReactionPicker.tsx
++++ b/src/components/views/emojipicker/ReactionPicker.tsx
+@@ -123,6 +123,7 @@ class ReactionPicker extends React.Component {
+ public render(): React.ReactNode {
+ return (
+
+Date: Sat, 22 Apr 2023 12:15:18 +0200
+Subject: Allow reactions to take more space
+
+---
+ res/css/views/messages/_ReactionsRowButton.pcss | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/res/css/views/messages/_ReactionsRowButton.pcss b/res/css/views/messages/_ReactionsRowButton.pcss
+index f2e3885de4..2a8bb9224e 100644
+--- a/res/css/views/messages/_ReactionsRowButton.pcss
++++ b/res/css/views/messages/_ReactionsRowButton.pcss
+@@ -14,6 +14,7 @@ Please see LICENSE files in the repository root for full details.
+ background-color: $secondary-hairline-color;
+ user-select: none;
+ align-items: center;
++ max-width: calc(100% - 40px);;
+
+ &:hover {
+ border-color: $quinary-content;
+@@ -29,7 +30,6 @@ Please see LICENSE files in the repository root for full details.
+ }
+
+ .mx_ReactionsRowButton_content {
+- max-width: 100px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0012-On-space-switch-don-t-automatically-show-last-opened.patch b/patches/matrix-react-sdk/0012-On-space-switch-don-t-automatically-show-last-opened.patch
new file mode 100644
index 0000000..b224046
--- /dev/null
+++ b/patches/matrix-react-sdk/0012-On-space-switch-don-t-automatically-show-last-opened.patch
@@ -0,0 +1,79 @@
+From b43bf7e8a183f36e30e9b79e3fc2dcd14afc6823 Mon Sep 17 00:00:00 2001
+From: su-ex
+Date: Thu, 30 May 2024 14:35:16 +0200
+Subject: On space switch don't automatically show last opened room
+
+---
+ src/components/structures/MatrixChat.tsx | 18 +++++++++++++++++-
+ src/settings/Settings.tsx | 6 ++++++
+ src/stores/spaces/SpaceStore.ts | 1 +
+ 3 files changed, 24 insertions(+), 1 deletion(-)
+
+diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx
+index 1726c8462d..150f29d0b8 100644
+--- a/src/components/structures/MatrixChat.tsx
++++ b/src/components/structures/MatrixChat.tsx
+@@ -1448,7 +1448,15 @@ export default class MatrixChat extends React.PureComponent {
+ if (this.screenAfterLogin && this.screenAfterLogin.screen) {
+ this.showScreen(this.screenAfterLogin.screen, this.screenAfterLogin.params);
+ this.screenAfterLogin = undefined;
+- } else if (localStorage && localStorage.getItem("mx_last_room_id")) {
++ } else if (
++ !SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") &&
++ localStorage &&
++ localStorage.getItem("mx_active_space") &&
++ localStorage.getItem("mx_active_space")[0] === "!"
++ ) {
++ // SC: Show the last viewed space
++ this.viewLastSpace();
++ } else if (SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && localStorage && localStorage.getItem("mx_last_room_id")) {
+ // Before defaulting to directory, show the last viewed room
+ this.viewLastRoom();
+ } else {
+@@ -1460,6 +1468,14 @@ export default class MatrixChat extends React.PureComponent {
+ }
+ }
+
++ private viewLastSpace(): void { // SC
++ // SC-ToDo: Make this work for meta spaces
++ dis.dispatch({
++ action: Action.ViewRoom,
++ room_id: localStorage.getItem("mx_active_space"),
++ });
++ }
++
+ private viewLastRoom(): void {
+ dis.dispatch({
+ action: Action.ViewRoom,
+diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx
+index b668c65dfd..be4433e1bc 100644
+--- a/src/settings/Settings.tsx
++++ b/src/settings/Settings.tsx
+@@ -203,6 +203,12 @@ export const SETTINGS: { [setting: string]: ISetting } = {
+ supportedLevels: LEVELS_ACCOUNT_SETTINGS,
+ default: true,
+ },
++ "Spaces.returnToPreviouslyOpenedRoom": {
++ displayName: _td("Return to the room previously opened in a space"),
++ description: _td("If disabled, the space overview will be shown when switching to another space."),
++ supportedLevels: LEVELS_ACCOUNT_SETTINGS,
++ default: false,
++ },
+ // SC settings end
+ "feature_video_rooms": {
+ isFeature: true,
+diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts
+index 60df05478a..0be7ba190a 100644
+--- a/src/stores/spaces/SpaceStore.ts
++++ b/src/stores/spaces/SpaceStore.ts
+@@ -265,6 +265,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
+ // else if the last viewed room in this space is joined then view that
+ // else view space home or home depending on what is being clicked on
+ if (
++ SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") &&
+ roomId &&
+ cliSpace?.getMyMembership() !== KnownMembership.Invite &&
+ this.matrixClient.getRoom(roomId)?.getMyMembership() === KnownMembership.Join &&
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0013-Exclude-spaces-from-breadcrumbs.patch b/patches/matrix-react-sdk/0013-Exclude-spaces-from-breadcrumbs.patch
new file mode 100644
index 0000000..49b0d89
--- /dev/null
+++ b/patches/matrix-react-sdk/0013-Exclude-spaces-from-breadcrumbs.patch
@@ -0,0 +1,24 @@
+From 3aa2246c56ae3e5b7703003ef785d6e3ad77b844 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Tue, 9 Aug 2022 09:32:19 +0200
+Subject: Exclude spaces from breadcrumbs
+
+---
+ src/stores/BreadcrumbsStore.ts | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/stores/BreadcrumbsStore.ts b/src/stores/BreadcrumbsStore.ts
+index 9859f24015..957b54286c 100644
+--- a/src/stores/BreadcrumbsStore.ts
++++ b/src/stores/BreadcrumbsStore.ts
+@@ -137,6 +137,7 @@ export class BreadcrumbsStore extends AsyncStoreWithClient {
+ }
+
+ private async appendRoom(room: Room): Promise {
++ if (room.isSpaceRoom()) return;
+ let updated = false;
+ const rooms = (this.state.rooms || []).slice(); // cheap clone
+ const msc3946ProcessDynamicPredecessor = SettingsStore.getValue("feature_dynamic_room_predecessors");
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0014-Stop-the-search-bar-wobble.patch b/patches/matrix-react-sdk/0014-Stop-the-search-bar-wobble.patch
new file mode 100644
index 0000000..e4b33fc
--- /dev/null
+++ b/patches/matrix-react-sdk/0014-Stop-the-search-bar-wobble.patch
@@ -0,0 +1,24 @@
+From 288aa3cf8e56a4ca60810eac98fb6f692b154f61 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Mon, 19 Aug 2024 20:27:33 +0200
+Subject: Stop the search bar wobble
+
+---
+ res/css/_common.pcss | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/res/css/_common.pcss b/res/css/_common.pcss
+index 05a3dac067..7861af6381 100644
+--- a/res/css/_common.pcss
++++ b/res/css/_common.pcss
+@@ -181,6 +181,7 @@ input[type="search"].mx_textinput_icon {
+ padding-left: 36px;
+ background-repeat: no-repeat;
+ background-position: 10px center;
++ min-height: 33px;
+ }
+
+ /* FIXME THEME - Tint by CSS rather than referencing a duplicate asset */
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0015-Import-SC-compound-theme-overrides.patch b/patches/matrix-react-sdk/0015-Import-SC-compound-theme-overrides.patch
new file mode 100644
index 0000000..d823f0d
--- /dev/null
+++ b/patches/matrix-react-sdk/0015-Import-SC-compound-theme-overrides.patch
@@ -0,0 +1,34 @@
+From a4bca41b7371c42499fd8c805482066514a9edc2 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Sun, 13 Oct 2024 11:23:54 +0200
+Subject: Import SC compound theme overrides
+
+---
+ res/css/_common.pcss | 1 +
+ res/css/sc-cpd-overrides.css | 1 +
+ 2 files changed, 2 insertions(+)
+ create mode 120000 res/css/sc-cpd-overrides.css
+
+diff --git a/res/css/_common.pcss b/res/css/_common.pcss
+index 7861af6381..f7a660a339 100644
+--- a/res/css/_common.pcss
++++ b/res/css/_common.pcss
+@@ -11,6 +11,7 @@ Please see LICENSE files in the repository root for full details.
+
+ @import url("@vector-im/compound-design-tokens/assets/web/css/compound-design-tokens.css") layer(compound);
+ @import url("@vector-im/compound-web/dist/style.css");
++@import "./sc-cpd-overrides.css";
+ @import "./_font-sizes.pcss";
+ @import "./_animations.pcss";
+ @import "./_spacing.pcss";
+diff --git a/res/css/sc-cpd-overrides.css b/res/css/sc-cpd-overrides.css
+new file mode 120000
+index 0000000000..532e96fddc
+--- /dev/null
++++ b/res/css/sc-cpd-overrides.css
+@@ -0,0 +1 @@
++../../../res/css/sc-cpd-overrides.css
+\ No newline at end of file
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0016-No-damn-avatar-background-in-room-list.patch b/patches/matrix-react-sdk/0016-No-damn-avatar-background-in-room-list.patch
new file mode 100644
index 0000000..2fa7d3a
--- /dev/null
+++ b/patches/matrix-react-sdk/0016-No-damn-avatar-background-in-room-list.patch
@@ -0,0 +1,26 @@
+From fc577303d8c2d290f1c17e13deaf442822af68a1 Mon Sep 17 00:00:00 2001
+From: su-ex
+Date: Tue, 7 Sep 2021 19:41:52 +0200
+Subject: No damn avatar background in room list
+
+---
+ src/components/structures/BackdropPanel.tsx | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx
+index 80c21235cc..a9c464f4b2 100644
+--- a/src/components/structures/BackdropPanel.tsx
++++ b/src/components/structures/BackdropPanel.tsx
+@@ -13,6 +13,9 @@ interface IProps {
+ }
+
+ export const BackdropPanel: React.FC = ({ backgroundImage, blurMultiplier }) => {
++ // SC: no damn avatar background in room list
++ return null;
++
+ if (!backgroundImage) return null;
+
+ const styles: CSSProperties = {};
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0017-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch b/patches/matrix-react-sdk/0017-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch
new file mode 100644
index 0000000..b81a35b
--- /dev/null
+++ b/patches/matrix-react-sdk/0017-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch
@@ -0,0 +1,29 @@
+From e4a7ea01c2fd9f7d67660402c20bfdc5969f28c4 Mon Sep 17 00:00:00 2001
+From: su-ex
+Date: Tue, 22 Dec 2020 19:16:28 +0100
+Subject: No red messages in 1:1 chats Close SchildiChat/schildichat-desktop#13
+
+---
+ src/components/views/rooms/EventTile.tsx | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx
+index 746cceabd8..3e5879f7ad 100644
+--- a/src/components/views/rooms/EventTile.tsx
++++ b/src/components/views/rooms/EventTile.tsx
+@@ -685,6 +685,12 @@ export class UnwrappedEventTile extends React.Component
+ return false;
+ }
+
++ // don't show highlights in 1:1 rooms
++ const room = cli.getRoom(this.props.mxEvent.getRoomId());
++ if (room && room.currentState.getJoinedMemberCount() === 2) {
++ return false;
++ }
++
+ return !!(actions?.tweaks.highlight || previousActions?.tweaks.highlight);
+ }
+
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0018-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch b/patches/matrix-react-sdk/0018-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch
new file mode 100644
index 0000000..76d5935
--- /dev/null
+++ b/patches/matrix-react-sdk/0018-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch
@@ -0,0 +1,61 @@
+From a37ca889b832578a9201a5b45b059f58eb781bc5 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Sun, 13 Oct 2024 13:26:16 +0200
+Subject: Always apply corner radius to all edges of the bubble
+
+---
+ res/css/views/rooms/_EventBubbleTile.pcss | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/res/css/views/rooms/_EventBubbleTile.pcss b/res/css/views/rooms/_EventBubbleTile.pcss
+index ec443c44de..8e0f3cf1b6 100644
+--- a/res/css/views/rooms/_EventBubbleTile.pcss
++++ b/res/css/views/rooms/_EventBubbleTile.pcss
+@@ -277,6 +277,8 @@ Please see LICENSE files in the repository root for full details.
+ margin-inline: var(--EventTile_bubble_line-margin-inline-start) var(--EventTile_bubble_line-margin-inline-end);
+ border-top-left-radius: var(--cornerRadius);
+ border-top-right-radius: var(--cornerRadius);
++ border-bottom-left-radius: var(--cornerRadius);
++ border-bottom-right-radius: var(--cornerRadius);
+
+ /* the selector here is quite weird because timestamps can appear linked & unlinked and in different places */
+ /* in the DOM depending on the specific rendering context */
+@@ -371,7 +373,7 @@ Please see LICENSE files in the repository root for full details.
+ }
+
+ &.mx_EventTile_continuation[data-self="false"] .mx_EventTile_line {
+- border-top-left-radius: 0;
++ //border-top-left-radius: 0;
+
+ .mx_MImageBody .mx_MImageBody_thumbnail_container,
+ .mx_MVideoBody .mx_MVideoBody_container,
+@@ -379,7 +381,7 @@ Please see LICENSE files in the repository root for full details.
+ .mx_MediaBody,
+ .mx_MLocationBody_map,
+ .mx_MBeaconBody {
+- border-top-left-radius: 0;
++ //border-top-left-radius: 0;
+ }
+ }
+ &.mx_EventTile_lastInSection[data-self="false"] .mx_EventTile_line {
+@@ -396,7 +398,7 @@ Please see LICENSE files in the repository root for full details.
+ }
+
+ &.mx_EventTile_continuation[data-self="true"] .mx_EventTile_line {
+- border-top-right-radius: 0;
++ //border-top-right-radius: 0;
+
+ .mx_MImageBody .mx_MImageBody_thumbnail_container,
+ .mx_MVideoBody .mx_MVideoBody_container,
+@@ -404,7 +406,7 @@ Please see LICENSE files in the repository root for full details.
+ .mx_MediaBody,
+ .mx_MLocationBody_map,
+ .mx_MBeaconBody {
+- border-top-right-radius: 0;
++ //border-top-right-radius: 0;
+ }
+ }
+ &.mx_EventTile_lastInSection[data-self="true"] .mx_EventTile_line {
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0019-Always-show-timestamps-by-default.patch b/patches/matrix-react-sdk/0019-Always-show-timestamps-by-default.patch
new file mode 100644
index 0000000..8abccc6
--- /dev/null
+++ b/patches/matrix-react-sdk/0019-Always-show-timestamps-by-default.patch
@@ -0,0 +1,25 @@
+From 57942189da5f80069ee4b03dc2fbeb24ce6b4f7b Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Sun, 13 Oct 2024 13:53:07 +0200
+Subject: Always show timestamps by default
+
+---
+ src/settings/Settings.tsx | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx
+index be4433e1bc..1052bca0c9 100644
+--- a/src/settings/Settings.tsx
++++ b/src/settings/Settings.tsx
+@@ -662,7 +662,7 @@ export const SETTINGS: { [setting: string]: ISetting } = {
+ "alwaysShowTimestamps": {
+ supportedLevels: LEVELS_ACCOUNT_SETTINGS,
+ displayName: _td("settings|always_show_message_timestamps"),
+- default: false,
++ default: true,
+ },
+ "userTimezone": {
+ supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS,
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0021-Enable-custom-emote-rendering-by-default.patch b/patches/matrix-react-sdk/0021-Enable-custom-emote-rendering-by-default.patch
new file mode 100644
index 0000000..2db22df
--- /dev/null
+++ b/patches/matrix-react-sdk/0021-Enable-custom-emote-rendering-by-default.patch
@@ -0,0 +1,25 @@
+From 47bcb08e971256fe94a0b07fb553b75400e648ed Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Thu, 17 Oct 2024 19:40:51 +0200
+Subject: Enable custom emote rendering by default
+
+---
+ src/settings/Settings.tsx | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx
+index 1052bca0c9..f5fcb5d7a5 100644
+--- a/src/settings/Settings.tsx
++++ b/src/settings/Settings.tsx
+@@ -514,7 +514,7 @@ export const SETTINGS: { [setting: string]: ISetting } = {
+ description: _td("labs|render_reaction_images_description"),
+ supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG_PRIORITISED,
+ supportedLevelsAreOrdered: true,
+- default: false,
++ default: true,
+ },
+ /**
+ * With the transition to Compound we are moving to a base font size
+--
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0022-Don-t-symlink-css-to-fix-Windows-native-build.patch b/patches/matrix-react-sdk/0022-Don-t-symlink-css-to-fix-Windows-native-build.patch
new file mode 100644
index 0000000..124a69c
--- /dev/null
+++ b/patches/matrix-react-sdk/0022-Don-t-symlink-css-to-fix-Windows-native-build.patch
@@ -0,0 +1,32 @@
+From 16fe0fe8d0068e4c5da3fa5516c5578d2ffaabc7 Mon Sep 17 00:00:00 2001
+From: SpiritCroc
+Date: Sun, 20 Oct 2024 17:00:19 +0200
+Subject: Don't symlink css to fix Windows-native build
+
+---
+ .gitignore | 2 ++
+ res/css/sc-cpd-overrides.css | 1 -
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+ delete mode 120000 res/css/sc-cpd-overrides.css
+
+diff --git a/.gitignore b/.gitignore
+index 3137cd555b..5345301b97 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,3 +1,5 @@
++res/css/sc-*.css
++
+ /.npmrc
+ /*.log
+ package-lock.json
+diff --git a/res/css/sc-cpd-overrides.css b/res/css/sc-cpd-overrides.css
+deleted file mode 120000
+index 532e96fddc..0000000000
+--- a/res/css/sc-cpd-overrides.css
++++ /dev/null
+@@ -1 +0,0 @@
+-../../../res/css/sc-cpd-overrides.css
+\ No newline at end of file
+--
+2.47.0
+
diff --git a/publish_release.sh b/publish_release.sh
deleted file mode 100755
index cd5874c..0000000
--- a/publish_release.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-
-set -e
-
-mydir="$(dirname "$(realpath "$0")")"
-
-pushd "$mydir" > /dev/null
-
-source ./merge_helpers.sh
-
-# Check branch
-check_branch $branch
-forall_repos check_branch $branch
-
-# Ensure clean git state
-forall_repos check_clean_git
-
-git fetch origin
-git branch -D master || true
-git checkout -b master --track origin/master
-git merge --ff-only sc
-git push
-git checkout sc
-forall_repos git fetch origin
-forall_repos git branch -D master || true
-forall_repos git checkout -b master --track origin/master
-forall_repos git merge --ff-only sc
-forall_repos git push
-forall_repos git checkout sc
-
-popd > /dev/null
diff --git a/push_current_sc_branches.sh b/push_current_sc_branches.sh
new file mode 100755
index 0000000..7a34314
--- /dev/null
+++ b/push_current_sc_branches.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+pushd "$mydir" > /dev/null
+
+source ./merge_helpers.sh
+
+get_branch_of() {
+ local repo="$1"
+ pushd "$repo" > /dev/null
+ local b=`git branch --show-current`
+ if [[ "$b" = sc_v* ]]; then
+ echo "$b"
+ else
+ >&2 echo "Unexpected branch name for $repo: $b"
+ exit 1
+ fi
+ popd > /dev/null
+}
+
+b_js=`get_branch_of matrix-js-sdk`
+b_react=`get_branch_of matrix-react-sdk`
+b_web=`get_branch_of element-web`
+b_desktop=`get_branch_of element-desktop`
+
+if [ "$b_js" != "$b_react" ] || [ "$b_react" != "$b_web" ] || [ "$b_web" != "$b_desktop" ]; then
+ echo "Detected branch name mismatch!"
+ echo "js-sdk: $b_js"
+ echo "react-sdk: $b_react"
+ echo "element-web: $b_web"
+ echo "element-desktop: $b_desktop"
+ exit 1
+fi
+
+branch="$b_js"
+
+echo "Pushing to all repos: $branch"
+forall_repos git push --set-upstream origin "$branch" "$@"
diff --git a/res/css/sc-cpd-overrides.css b/res/css/sc-cpd-overrides.css
new file mode 100644
index 0000000..a9987b0
--- /dev/null
+++ b/res/css/sc-cpd-overrides.css
@@ -0,0 +1,174 @@
+/*
+ * Upstream file for reference:
+ * - Dark: https://github.com/element-hq/compound-design-tokens/blob/main/assets/web/css/cpd-theme-dark-base.css
+ * - Light: https://github.com/element-hq/compound-design-tokens/blob/main/assets/web/css/cpd-theme-light-base.css
+ */
+
+.cpd-theme-dark.cpd-theme-dark {
+ --cpd-color-text-primary: rgba(255, 255, 255, 0.9);
+ --cpd-color-text-secondary: rgba(255, 255, 255, 0.65);
+ /* TODO?
+ --cpd-color-alpha-green-1400: hsla(152, 88%, 94%, 0.96);
+ --cpd-color-alpha-green-1300: hsla(152, 93%, 88%, 0.91);
+ --cpd-color-alpha-green-1200: hsla(156, 97%, 76%, 0.83);
+ --cpd-color-alpha-green-1100: hsla(162, 98%, 57%, 0.74);
+ --cpd-color-alpha-green-1000: hsla(163, 99%, 55%, 0.65);
+ --cpd-color-alpha-green-900: hsla(164, 98%, 53%, 0.58);
+ --cpd-color-alpha-green-800: hsl(168, 100%, 24%, 1);
+ --cpd-color-alpha-green-700: hsl(165, 100%, 18%, 1);
+ --cpd-color-alpha-green-600: hsl(162, 100%, 14%, 1);
+ --cpd-color-alpha-green-500: hsl(160, 100%, 12%, 1);
+ --cpd-color-alpha-green-400: hsl(155, 100%, 9%, 1);
+ --cpd-color-alpha-green-300: hsl(151, 100%, 7%, 1);
+ --cpd-color-alpha-green-200: hsl(147, 100%, 6%, 1);
+ --cpd-color-alpha-green-100: hsl(144, 100%, 6%, 1);
+
+ --cpd-color-alpha-gray-1400: hsla(214, 78%, 98%, 0.95);
+ --cpd-color-alpha-gray-1300: hsla(213, 73%, 97%, 0.89);
+ --cpd-color-alpha-gray-1200: hsla(215, 74%, 96%, 0.79);
+ --cpd-color-alpha-gray-1100: hsla(215, 92%, 95%, 0.68);
+ --cpd-color-alpha-gray-1000: hsla(213, 93%, 94%, 0.61);
+ --cpd-color-alpha-gray-900: hsla(211, 94%, 94%, 0.54);
+ --cpd-color-alpha-gray-800: hsla(216, 100%, 94%, 0.41);
+ --cpd-color-alpha-gray-700: hsla(213, 85%, 95%, 0.27);
+ --cpd-color-alpha-gray-600: hsla(225, 46%, 95%, 0.2);
+ --cpd-color-alpha-gray-500: hsla(214, 41%, 97%, 0.15);
+ --cpd-color-alpha-gray-400: hsla(270, 37%, 93%, 0.1);
+ --cpd-color-alpha-gray-200: hsla(286, 31%, 82%, 0.04);
+ --cpd-color-alpha-gray-100: hsla(214, 10%, 86%, 0.02);
+ */
+ /* Hover of room list items, search bar bg, space icon bg */
+ --cpd-color-alpha-gray-300: rgba(255, 255, 255, 0.06);
+
+ /* TODO more accent variants? */
+ --cpd-color-green-1400: #F1F8E9;
+ --cpd-color-green-1300: #DCEDC8;
+ --cpd-color-green-1200: #C5E1A5;
+ --cpd-color-green-1100: #AED581;
+ --cpd-color-green-1000: #9CCC65;
+ --cpd-color-green-900: #8BC34A;
+ --cpd-color-green-800: #8BC34A;
+ --cpd-color-green-700: #8BC34A;
+ --cpd-color-green-600: #8BC34A;
+ --cpd-color-green-500: #8BC34A;
+ --cpd-color-green-400: #689F38;
+ --cpd-color-green-300: #33691E;
+ --cpd-color-green-200: #33691E;
+ --cpd-color-green-100: #33691E;
+
+ /* TODO
+ --cpd-color-red-1400: #ffe9e6;
+ --cpd-color-red-1300: #ffd4cd;
+ --cpd-color-red-1200: #ffaea4;
+ --cpd-color-red-1100: #ff877c;
+ --cpd-color-red-1000: #ff665d;
+ --cpd-color-red-900: #fd3e3c;
+ --cpd-color-red-800: #d1212a;
+ --cpd-color-red-700: #9f0d1e;
+ --cpd-color-red-600: #830009;
+ --cpd-color-red-500: #710000;
+ --cpd-color-red-400: #590000;
+ --cpd-color-red-300: #470000;
+ --cpd-color-red-200: #3e0000;
+ --cpd-color-red-100: #370000;
+ */
+
+ --cpd-color-gray-1400: #eeeeee;
+ --cpd-color-gray-1300: #e0e0e0;
+ --cpd-color-gray-1200: #b3b3b3;
+ --cpd-color-gray-1100: #aaaaaa;
+ --cpd-color-gray-1000: #9e9e9e;
+ --cpd-color-gray-900: #808080;
+ --cpd-color-gray-800: #757575;
+ --cpd-color-gray-700: #424242;
+ --cpd-color-gray-600: #424242;
+ --cpd-color-gray-500: #424242;
+ --cpd-color-gray-400: #303030;
+ --cpd-color-gray-300: #212121;
+ --cpd-color-gray-200: #212121;
+ --cpd-color-gray-100: #171717;
+ --cpd-color-theme-bg: #171717;
+}
+
+.cpd-theme-light.cpd-theme-light {
+ /* TODO?
+ --cpd-color-alpha-gray-1400: hsla(223, 64%, 2%, 0.9);
+ --cpd-color-alpha-gray-1300: hsla(225, 57%, 3%, 0.84);
+ --cpd-color-alpha-gray-1200: hsla(213, 73%, 3%, 0.77);
+ --cpd-color-alpha-gray-1100: hsla(215, 74%, 5%, 0.71);
+ --cpd-color-alpha-gray-1000: hsla(218, 79%, 6%, 0.66);
+ --cpd-color-alpha-gray-900: hsla(213, 83%, 7%, 0.61);
+ --cpd-color-alpha-gray-800: hsla(213, 87%, 9%, 0.5);
+ --cpd-color-alpha-gray-700: hsla(215, 96%, 10%, 0.35);
+ --cpd-color-alpha-gray-600: hsla(212, 97%, 12%, 0.26);
+ --cpd-color-alpha-gray-500: hsla(212, 87%, 15%, 0.2);
+ --cpd-color-alpha-gray-400: hsla(213, 90%, 20%, 0.12);
+ --cpd-color-alpha-gray-300: hsla(216, 89%, 18%, 0.06);
+ --cpd-color-alpha-gray-200: hsla(200, 41%, 36%, 0.04);
+ --cpd-color-alpha-gray-100: hsla(210, 48%, 41%, 0.02);
+
+ --cpd-color-alpha-green-1400: hsl(149, 100%, 7%, 1);
+ --cpd-color-alpha-green-1300: hsl(157, 100%, 10%, 1);
+ --cpd-color-alpha-green-1200: hsl(162, 100%, 14%, 1);
+ --cpd-color-alpha-green-1100: hsl(165, 100%, 18%, 1);
+ --cpd-color-alpha-green-1000: hsl(166, 100%, 21%, 1);
+ --cpd-color-alpha-green-900: hsl(168, 100%, 24%, 1);
+ --cpd-color-alpha-green-800: hsl(166, 100%, 30%, 1);
+ --cpd-color-alpha-green-700: hsla(163, 99%, 38%, 0.96);
+ --cpd-color-alpha-green-600: hsla(156, 99%, 36%, 0.56);
+ --cpd-color-alpha-green-500: hsla(154, 96%, 37%, 0.41);
+ --cpd-color-alpha-green-400: hsla(151, 93%, 37%, 0.23);
+ --cpd-color-alpha-green-300: hsla(150, 100%, 36%, 0.11);
+ --cpd-color-alpha-green-200: hsla(150, 79%, 41%, 0.06);
+ --cpd-color-alpha-green-100: hsla(156, 79%, 41%, 0.03);
+ */
+
+ /* TODO accent variants? */
+ --cpd-color-green-1400: #33691E;
+ --cpd-color-green-1300: #33691E;
+ --cpd-color-green-1200: #33691E;
+ --cpd-color-green-1100: #33691E;
+ --cpd-color-green-1000: #33691E;
+ --cpd-color-green-900: #33691E;
+ --cpd-color-green-800: #33691E;
+ --cpd-color-green-700: #8BC34A;
+ --cpd-color-green-600: #8BC34A;
+ --cpd-color-green-500: #8BC34A;
+ --cpd-color-green-400: #8BC34A;
+ --cpd-color-green-300: #C5E1A5;
+ --cpd-color-green-200: #DCEDC8;
+ --cpd-color-green-100: #F1F8E9;
+
+ /* TODO
+ --cpd-color-red-1400: #450000;
+ --cpd-color-red-1300: #620000;
+ --cpd-color-red-1200: #850006;
+ --cpd-color-red-1100: #a4041d;
+ --cpd-color-red-1000: #bc0f22;
+ --cpd-color-red-900: #d51928;
+ --cpd-color-red-800: #ff3d3d;
+ --cpd-color-red-700: #ff8c81;
+ --cpd-color-red-600: #ffafa5;
+ --cpd-color-red-500: #ffc5bc;
+ --cpd-color-red-400: #ffdfda;
+ --cpd-color-red-300: #ffefec;
+ --cpd-color-red-200: #fff7f6;
+ --cpd-color-red-100: #fffaf9;
+ */
+
+ --cpd-color-gray-1400: #212121;
+ --cpd-color-gray-1300: #212121;
+ --cpd-color-gray-1200: #424242;
+ --cpd-color-gray-1100: #424242;
+ --cpd-color-gray-1000: #616161;
+ --cpd-color-gray-900: #616161;
+ --cpd-color-gray-800: #808080;
+ --cpd-color-gray-700: #b3b3b3;
+ --cpd-color-gray-600: #b3b3b3;
+ --cpd-color-gray-500: #cdd3da;
+ --cpd-color-gray-400: #e0e0e0;
+ --cpd-color-gray-300: #f5f5f5;
+ --cpd-color-gray-200: #f5f5f5;
+ --cpd-color-gray-100: #fafafa;
+ --cpd-color-theme-bg: #ffffff;
+}
diff --git a/setup.sh b/setup.sh
index 98aabe1..65e945a 100755
--- a/setup.sh
+++ b/setup.sh
@@ -25,9 +25,15 @@ popd
pushd element-desktop
$yarn install
-ln -s ../element-web/webapp ./ || true
+# Seshat: compare https://github.com/element-hq/element-desktop/blob/develop/docs/native-node-modules.md#adding-seshat-for-search-in-e2e-encrypted-rooms
+$yarn add matrix-seshat
+#$yarn add electron-build-env
+#$yarn run electron-build-env -- --electron "$electron_version" -- neon build matrix-seshat --release
popd
pushd i18n-helper
$yarn install
popd
+
+# CSS overrides
+cp res/css/* matrix-react-sdk/res/css/
diff --git a/theme.sh b/theme.sh
new file mode 100755
index 0000000..2255068
--- /dev/null
+++ b/theme.sh
@@ -0,0 +1,189 @@
+#!/bin/bash
+
+set -e
+shopt -s globstar
+
+mydir="$(dirname "$(realpath "$0")")"
+automatic_commit="$1"
+
+pushd "$mydir/matrix-react-sdk" > /dev/null
+
+if [[ "$automatic_commit" == [Yy]* ]]; then
+ # Require clean git state
+ uncommitted=`git status --porcelain`
+ if [ ! -z "$uncommitted" ]; then
+ echo "Uncommitted changes are present, please commit first!"
+ exit 1
+ fi
+fi
+
+M_ACCENT="#8bc34a"
+M_ACCENT_DEC="139, 195, 74"
+M_ACCENT_DARK="#33691e"
+M_ACCENT_LIGHT="#dcedc8"
+M_ALERT="#e53935"
+M_LINK="#368bd6"
+
+replace_colors() {
+ local f="$1"
+ if [[ "$f" =~ "dark" ]]; then
+ echo "Replacing colors (dark) for $f..."
+ BG_ACCENT="$M_ACCENT_DARK"
+ CODEBLOCK_BORDER_COLOR="#121212"
+ CODEBLOCK_BACKGROUND_COLOR="#121212"
+ PILL_COLOR="rgba(255, 255, 255, 0.15)"
+ PILL_HOVER_COLOR="rgba(255, 255, 255, 0.18)"
+ PRESENCE_OFFLINE="#e0e0e0" # not applied because not existing specifically for dark
+ MESSAGE_BUBBLE_BACKGROUND="#424242"
+ MESSAGE_BUBBLE_BACKGROUND_SELF="#303030"
+ MESSAGE_BUBBLE_BACKGROUND_SELECTED="#212121"
+ ROOMLIST_BG_COLOR="#303030"
+ SPACELIST_BG_COLOR="#424242"
+ else
+ echo "Replacing colors (light) for $f..."
+ BG_ACCENT="$M_ACCENT_LIGHT"
+ CODEBLOCK_BORDER_COLOR="#00000010"
+ CODEBLOCK_BACKGROUND_COLOR="#00000010"
+ PILL_COLOR="rgba(0, 0, 0, 0.13)"
+ PILL_HOVER_COLOR="rgba(0, 0, 0, 0.1)"
+ PRESENCE_OFFLINE="#bdbdbd" # for light this should actually be darker
+ MESSAGE_BUBBLE_BACKGROUND="#eeeeee"
+ MESSAGE_BUBBLE_BACKGROUND_SELF="#f1f8e9"
+ MESSAGE_BUBBLE_BACKGROUND_SELECTED="#e0e0e0"
+ ROOMLIST_BG_COLOR="#eeeeee"
+ SPACELIST_BG_COLOR="#fafafa"
+ fi
+ # Neutral colors
+ sed -i 's|#15171b|#212121|gi' "$f"
+ sed -i 's|#15191E|#212121|gi' "$f"
+ sed -i 's|#2e2f32|#212121|gi' "$f"
+ sed -i 's|#232f32|#212121|gi' "$f"
+ sed -i 's|#27303a|#212121|gi' "$f"
+ sed -i 's|#17191C|#212121|gi' "$f"
+ sed -i 's|#181b21|#303030|gi' "$f"
+ sed -i 's|#1A1D23|#303030|gi' "$f"
+ sed -i 's|#20252B|#303030|gi' "$f"
+ sed -i 's|#20252c|#303030|gi' "$f"
+ sed -i 's|#21262c|#383838|gi' "$f" # selection/hover color
+ sed -i 's|#238cf5|#303030|gi' "$f"
+ sed -i 's|#25271F|#303030|gi' "$f"
+ sed -i 's|#272c35|#303030|gi' "$f"
+ sed -i 's|#2a3039|#303030|gi' "$f"
+ sed -i 's|#343a46|#424242|gi' "$f"
+ sed -i 's|#3c4556|#424242|gi' "$f"
+ sed -i 's|#3d3b39|#424242|gi' "$f"
+ sed -i 's|#45474a|#424242|gi' "$f"
+ sed -i 's|#454545|#424242|gi' "$f"
+ sed -i 's|#2e3649|#424242|gi' "$f"
+ sed -i 's|#4e5054|#424242|gi' "$f"
+ sed -i 's|#394049|#424242|gi' "$f"
+ sed -i 's|#3e444c|#424242|gi' "$f"
+ sed -i 's|#61708b|#616161|gi' "$f"
+ sed -i 's|#616b7f|#616161|gi' "$f"
+ sed -i 's|#5c6470|#616161|gi' "$f"
+ sed -i 's|#545a66|#616161|gi' "$f" # pill hover bg color
+ sed -i 's|#737D8C|#757575|gi' "$f"
+ sed -i 's|#6F7882|#757575|gi' "$f"
+ sed -i 's|#91A1C0|#757575|gi' "$f" # icon in button color
+ sed -i 's|#8D99A5|#808080|gi' "$f"
+ sed -i 's|#8E99A4|#808080|gi' "$f" # maybe use #9e9e9e instead
+ sed -i 's|#8D97A5|#808080|gi' "$f"
+ sed -i 's|#a2a2a2|#9e9e9e|gi' "$f"
+ sed -i 's|#9fa9ba|#aaaaaa|gi' "$f" # maybe use #9e9e9e instead
+ sed -i 's|#acacac|#aaaaaa|gi' "$f" # maybe use #9e9e9e instead
+ sed -i 's|#B9BEC6|#b3b3b3|gi' "$f" # maybe use #bdbdbd instead
+ sed -i 's|#a1b2d1|#b3b3b3|gi' "$f"
+ sed -i 's|#A9B2BC|#b3b3b3|gi' "$f"
+ sed -i 's|#C1C6CD|#bdbdbd|gi' "$f"
+ sed -i 's|#c1c9d6|#bdbdbd|gi' "$f"
+ sed -i 's|#c8c8cd|#cccccc|gi' "$f" # maybe use #bdbdbd instead
+ # sed -i 's|#dddddd|#e0e0e0|gi' "$f" # really?
+ sed -i 's|#e7e7e7|#e0e0e0|gi' "$f"
+ sed -i 's|#e3e8f0|#e0e0e0|gi' "$f"
+ sed -i 's|#e9e9e9|#e0e0e0|gi' "$f"
+ sed -i 's|#e9edf1|#e0e0e0|gi' "$f"
+ sed -i 's|#e8eef5|#e0e0e0|gi' "$f"
+ sed -i 's|#deddfd|#e0e0e0|gi' "$f" # $location-live-secondary-color, what to use really?
+ sed -i 's|#edf3ff|#eeeeee|gi' "$f"
+ sed -i 's|#f4f6fa|#f5f5f5|gi' "$f"
+ sed -i 's|#f6f7f8|#f5f5f5|gi' "$f"
+ sed -i 's|#f2f5f8|#f5f5f5|gi' "$f"
+ sed -i 's|#f5f8fa|#f5f5f5|gi' "$f"
+ sed -i 's|#f3f8fd|#fafafa|gi' "$f"
+ sed -i 's|rgba(33, 38, 34,|rgba(48, 48, 48,|gi' "$f"
+ sed -i 's|rgba(33, 38, 44,|rgba(48, 48, 48,|gi' "$f"
+ sed -i 's|rgba(34, 38, 46,|rgba(48, 48, 48,|gi' "$f"
+ sed -i 's|rgba(38, 39, 43,|rgba(48, 48, 48,|gi' "$f"
+ sed -i 's|rgba(38, 40, 45,|rgba(48, 48, 48,|gi' "$f"
+ sed -i 's|rgba(46, 48, 51,|rgba(48, 48, 48,|gi' "$f"
+ sed -i 's|rgba(92, 100, 112,|rgba(97, 97, 97,|gi' "$f"
+ sed -i 's|rgba(141, 151, 165,|rgba(144, 144, 144,|gi' "$f"
+ sed -i 's|rgba(242, 245, 248,|rgba(248, 248, 248,|gi' "$f"
+
+ sed -i "s|\\(\$event-highlight-bg-color: \\).*;|\\1transparent;|gi" "$f"
+ sed -i "s|\\(\$preview-widget-bar-color: \\).*;|\\1#bdbdbd;|gi" "$f"
+ sed -i "s|\\(\$blockquote-bar-color: \\).*;|\\1#bdbdbd;|gi" "$f"
+ sed -i "s|\\(\$pill-bg-color: \\).*;|\\1$PILL_COLOR;|gi" "$f"
+ sed -i "s|\\(\$pill-hover-bg-color: \\).*;|\\1$PILL_HOVER_COLOR;|gi" "$f"
+
+ sed -i "s|\\(\$inlinecode-border-color: \\).*;|\\1$CODEBLOCK_BORDER_COLOR;|gi" "$f"
+ sed -i "s|\\(\$inlinecode-background-color: \\).*;|\\1$CODEBLOCK_BACKGROUND_COLOR;|gi" "$f"
+ sed -i "s|\\(\$codeblock-background-color: \\).*;|\\1$CODEBLOCK_BACKGROUND_COLOR;|gi" "$f"
+
+ sed -i "s|\\(\$presence-offline: \\).*;|\\1$PRESENCE_OFFLINE;|gi" "$f"
+
+ sed -i "s|\\(\$roomlist-bg-color: \\).*;|\\1$ROOMLIST_BG_COLOR;|gi" "$f"
+ sed -i "s|\\(\$spacePanel-bg-color: \\).*;|\\1$SPACELIST_BG_COLOR;|gi" "$f"
+
+ # Accent colors
+ sed -i "s|#368bd6|$M_ACCENT|gi" "$f"
+ sed -i "s|#ac3ba8|$M_ACCENT|gi" "$f"
+ sed -i "s|#0DBD8B|$M_ACCENT|gi" "$f"
+ sed -i "s|#e64f7a|$M_ACCENT|gi" "$f"
+ sed -i "s|#ff812d|$M_ACCENT|gi" "$f"
+ sed -i "s|#2dc2c5|$M_ACCENT|gi" "$f"
+ sed -i "s|#5c56f5|$M_ACCENT|gi" "$f"
+ sed -i "s|#74d12c|$M_ACCENT|gi" "$f"
+ sed -i "s|#76CFA6|$M_ACCENT|gi" "$f"
+ sed -i "s|#03b381|$M_ACCENT|gi" "$f"
+ sed -i "s|rgba(3, 179, 129,|rgba($M_ACCENT_DEC,|gi" "$f"
+ sed -i "s|#03b381|$M_ACCENT|gi" "$f"
+ sed -i "s|#FF5B55|$M_ALERT|gi" "$f"
+ sed -i "s|\\(\$accent-alt: \\).*;|\\1$M_LINK;|gi" "$f"
+ #sed -i "s|\\(\$accent-darker: \\).*;|\\1$M_ACCENT_DARK;|gi" "$f"
+ sed -i "s|\\(\$roomtile-default-badge-bg-color: \\).*;|\\1$M_ACCENT;|gi" "$f"
+ #sed -i "s|\\(\$input-focused-border-color: \\).*;|\\1\$accent;|gi" "$f" # not existing anymore, need replacement?
+ sed -i "s|\\(\$reaction-row-button-selected-bg-color: \\).*;|\\1$BG_ACCENT;|gi" "$f"
+
+ # e2e colors
+ sed -i "s|\\(\$e2e-verified-color: \\).*;|\\1$M_ACCENT;|gi" "$f"
+ sed -i "s|\\(\$e2e-unknown-color: \\).*;|\\1#ffc107;|gi" "$f"
+ sed -i "s|\\(\$e2e-unverified-color: \\).*;|\\1#ffc107;|gi" "$f"
+ sed -i "s|\\(\$e2e-warning-color: \\).*;|\\1$M_ALERT;|gi" "$f"
+
+ # Message bubbles
+ sed -i "s|\\(\$eventbubble-self-bg: \\).*;|\$eventbubble-self-bg: $MESSAGE_BUBBLE_BACKGROUND_SELF;|gi" "$f"
+ sed -i "s|\\(\$eventbubble-others-bg: \\).*;|\$eventbubble-others-bg: $MESSAGE_BUBBLE_BACKGROUND;|gi" "$f"
+ sed -i "s|\\(\$eventbubble-bg-hover: \\).*;|\$eventbubble-bg-hover: $MESSAGE_BUBBLE_BACKGROUND_SELECTED;|gi" "$f"
+ #sed -i "s|\\(\$eventbubble-reply-color: \\).*;$||gi" "$f"
+}
+
+replace_colors res/themes/light/css/light.pcss
+replace_colors res/themes/light/css/_light.pcss
+replace_colors res/themes/legacy-light/css/legacy-light.pcss
+replace_colors res/themes/legacy-light/css/_legacy-light.pcss
+replace_colors res/themes/dark/css/dark.pcss
+replace_colors res/themes/dark/css/_dark.pcss
+replace_colors res/themes/legacy-dark/css/legacy-dark.pcss
+replace_colors res/themes/legacy-dark/css/_legacy-dark.pcss
+for f in res/**/*.svg; do
+ replace_colors "$f"
+done
+
+if [[ "$automatic_commit" == [Yy]* ]]; then
+ # see: https://devops.stackexchange.com/a/5443
+ git add -A
+ git diff-index --quiet HEAD || git commit -m "Automatic theme update"
+fi
+
+popd > /dev/null