├── .containerignore ├── .github └── workflows │ └── stale.yml ├── .gitignore ├── .gitmodules ├── Containerfile.debian ├── Containerfile.fedora ├── Containerfile.windows ├── FEATURES.md ├── LICENSE ├── Makefile ├── README.md ├── RELEASE.md ├── alternative_package.sh ├── apply_patches.sh ├── build-bom.sh ├── bump_release_version.sh ├── bump_test_version.sh ├── configs ├── .gitignore └── sc │ └── config.json ├── create_local_pkgbuild.sh ├── deploy ├── .gitignore ├── create-github-release.sh ├── update-aur-bin.sh └── update-flathub.sh ├── flake.lock ├── flake.nix ├── generate_changelog.sh ├── generate_patches.sh ├── graphics ├── feature_image.svg ├── feature_image_transparent.svg ├── ic_launcher_sc.svg ├── icon_gen.sh └── store_icon.svg ├── hard_reset_repos.sh ├── i18n-helper ├── .gitignore ├── index.js └── package.json ├── i18n-overlays ├── element-desktop │ ├── bg.json │ ├── cs.json │ ├── de.json │ ├── en_EN.json │ ├── es.json │ ├── et.json │ ├── eu.json │ ├── fa.json │ ├── fr.json │ ├── hu.json │ ├── id.json │ ├── it.json │ ├── ja.json │ ├── lt.json │ ├── nb_NO.json │ ├── nl.json │ ├── pl.json │ ├── pt_BR.json │ ├── ro.json │ ├── ru.json │ ├── sk.json │ ├── sv.json │ ├── tr.json │ ├── vi.json │ ├── zh_Hans.json │ └── zh_Hant.json ├── element-web │ ├── bg.json │ ├── cs.json │ ├── de_DE.json │ ├── en_EN.json │ ├── es.json │ ├── et.json │ ├── eu.json │ ├── fa.json │ ├── fr.json │ ├── hu.json │ ├── id.json │ ├── it.json │ ├── ja.json │ ├── lt.json │ ├── nb_NO.json │ ├── nl.json │ ├── pl.json │ ├── pt_BR.json │ ├── ro.json │ ├── ru.json │ ├── sk.json │ ├── sv.json │ ├── tr.json │ ├── vi.json │ ├── zh_Hans.json │ └── zh_Hant.json └── matrix-react-sdk │ ├── bg.json │ ├── cs.json │ ├── de_DE.json │ ├── en_EN.json │ ├── es.json │ ├── et.json │ ├── eu.json │ ├── fa.json │ ├── fr.json │ ├── hu.json │ ├── id.json │ ├── it.json │ ├── ja.json │ ├── lt.json │ ├── nb_NO.json │ ├── nl.json │ ├── pl.json │ ├── pt_BR.json │ ├── ro.json │ ├── ru.json │ ├── sk.json │ ├── sv.json │ ├── tr.json │ ├── vi.json │ ├── zh_Hans.json │ └── zh_Hant.json ├── local-pkgbuild-template ├── PKGBUILD └── schildichat-desktop.sh ├── merge_helpers.sh ├── merge_upstream.sh ├── overlay ├── element-desktop │ └── package.json └── element-web │ └── package.json ├── patches ├── element-desktop │ └── 0002-Add-back-schildi-fetch-package.ts-modifications.patch └── element-web │ ├── 0002-Change-default-login-background.patch │ ├── 0003-Don-t-welcome-to-Element.patch │ ├── 0004-Stronger-login-background-to-ensure-contrast-of-our-.patch │ ├── 0005-Schildify-login-footer.patch │ ├── 0006-Disable-sticky-rooms.patch │ ├── 0007-Bring-back-unified-room-list.patch │ ├── 0008-Don-t-sort-muted-rooms-to-bottom-I-still-want-to-see.patch │ ├── 0009-Don-t-preview-reactions.patch │ ├── 0010-Hide-the-mute-notification-state-the-same-way-as-the.patch │ ├── 0011-Allow-muted-rooms-to-render-as-unread.patch │ ├── 0012-Increase-default-visible-tiles.patch │ ├── 0013-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch │ ├── 0014-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch │ ├── 0015-Allow-reactions-to-take-more-space.patch │ ├── 0016-On-space-switch-don-t-automatically-show-last-opened.patch │ ├── 0017-Exclude-spaces-from-breadcrumbs.patch │ ├── 0018-Stop-the-search-bar-wobble.patch │ ├── 0019-Import-SC-compound-theme-overrides.patch │ ├── 0020-No-damn-avatar-background-in-room-list.patch │ ├── 0021-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch │ ├── 0022-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch │ ├── 0023-Always-show-timestamps-by-default.patch │ ├── 0024-Enable-custom-emote-rendering-by-default.patch │ ├── 0025-Enable-chat-previews-by-default.patch │ ├── 0026-Disable-showing-people-in-spaces-by-default.patch │ └── 0027-Improve-IRC-layout-for-SchildiChat.patch ├── push_current_sc_branches.sh ├── regenerate_i18n.sh ├── res └── css │ └── sc-cpd-overrides.css ├── screenshots ├── 1.png └── 2.png ├── setup.sh ├── theme.sh └── windowsportable.sh /.containerignore: -------------------------------------------------------------------------------- 1 | release/ -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: 'Close stale issues' 2 | on: 3 | schedule: 4 | - cron: '30 1 * * *' 5 | 6 | jobs: 7 | stale: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/stale@v6 11 | with: 12 | stale-issue-message: 'This issue is stale because it has been open 150 days with no activity. Remove stale label or comment or this will be closed in 14 days.' 13 | days-before-issue-stale: 150 14 | days-before-issue-close: 14 15 | days-before-pr-stale: -1 16 | days-before-pr-close: -1 17 | exempt-issue-labels: 'longterm,enhancement,parity-with-android,prio:medium,prio:high,electron issue,encrypted room search,build infrastructure' 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | release.mk 2 | /release 3 | /local-pkgbuild 4 | bom.lock 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "matrix-js-sdk"] 2 | path = matrix-js-sdk 3 | url = https://github.com/SchildiChat/matrix-js-sdk.git 4 | [submodule "element-web"] 5 | path = element-web 6 | url = https://github.com/SchildiChat/element-web.git 7 | [submodule "element-desktop"] 8 | path = element-desktop 9 | url = https://github.com/SchildiChat/element-desktop.git 10 | [submodule "compound-web"] 11 | path = compound-web 12 | url = https://github.com/SchildiChat/compound-web.git 13 | -------------------------------------------------------------------------------- /Containerfile.debian: -------------------------------------------------------------------------------- 1 | ARG NODE_VERSION 2 | FROM docker.io/node:${NODE_VERSION}-bookworm 3 | 4 | RUN apt-get -qq update && apt-get -qq install --no-install-recommends -y \ 5 | curl \ 6 | g++ \ 7 | gcc \ 8 | git \ 9 | jq \ 10 | libarchive-tools \ 11 | libsecret-1-dev \ 12 | libsqlcipher-dev \ 13 | libssl-dev \ 14 | make \ 15 | openssl \ 16 | pkg-config \ 17 | python3 \ 18 | rpm \ 19 | tcl \ 20 | vim 21 | RUN ln -s /usr/bin/python3 /usr/bin/python 22 | 23 | ENV RUSTUP_HOME=/usr/local/rustup \ 24 | CARGO_HOME=/usr/local/cargo \ 25 | PATH=/usr/local/cargo/bin:$PATH 26 | RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal 27 | 28 | WORKDIR /project 29 | -------------------------------------------------------------------------------- /Containerfile.fedora: -------------------------------------------------------------------------------- 1 | FROM docker.io/fedora:40 2 | 3 | RUN dnf install -y openssl openssl-devel cargo llvm libsecret libsecret-devel sqlcipher sqlcipher-devel g++ ruby-devel gcc make rpm-build libffi-devel tcl libxcrypt-compat pkgconf perl python3-setuptools git 4 | 5 | # node setup 6 | ARG NODE_VERSION 7 | RUN mkdir -p /usr/local/n 8 | RUN mkdir -p /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share 9 | RUN curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n 10 | RUN bash n ${NODE_VERSION} 11 | RUN npm install -g n 12 | RUN npm install -g yarn 13 | RUN npm install -g node-gyp 14 | RUN gem install --no-user-install --no-document fpm 15 | RUN ln -s /usr/bin/python3 /usr/bin/python 16 | 17 | ENV RUSTUP_HOME=/usr/local/rustup \ 18 | CARGO_HOME=/usr/local/cargo \ 19 | PATH=/usr/local/cargo/bin:$PATH 20 | RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal 21 | 22 | WORKDIR /project 23 | -------------------------------------------------------------------------------- /Containerfile.windows: -------------------------------------------------------------------------------- 1 | ARG CONTAINER_IMAGE_DEBIAN 2 | FROM ${CONTAINER_IMAGE_DEBIAN}:latest 3 | 4 | RUN dpkg --add-architecture i386 && apt-get update && apt-get install --no-install-recommends -y \ 5 | wine \ 6 | wine32 \ 7 | wine64 \ 8 | libwine \ 9 | libwine:i386 \ 10 | fonts-wine \ 11 | zip 12 | 13 | WORKDIR /project -------------------------------------------------------------------------------- /FEATURES.md: -------------------------------------------------------------------------------- 1 | # Features and changes compared to upstream 2 | 3 | Note that this list may be incomplete or outdated. 4 | 5 | 6 | ## General UI 7 | 8 | - Schildi theme 9 | - Some changed settings defaults 10 | 11 | 12 | ## Chat overview ("room list") 13 | 14 | - Unified room list instead of separating DMs and groups (TODO: setting) 15 | - Do not exclude currently selected room when updating room sort order 16 | - Do not force muted rooms to be sorted at the bottom 17 | - Hide reactions from room previews 18 | - Show unread state of muted rooms 19 | - Increase default visible tiles before collapsing each section 20 | - Include DMs in space unread counts 21 | - Show space overview rather then jumping to last opened room when switching space 22 | - Do not add spaces to recently opened rooms list ("breadcrumbs") 23 | 24 | 25 | ## Conversation screen 26 | 27 | - Allow sending freeform reactions 28 | - Less restrictive width limit for rendering text reactions 29 | 30 | 31 | ## Non-core community contributions 32 | 33 | Following features and changes are community-maintained, i.e. do not embody core SchildiChat features and may be dropped in future releases in case they cause a notable maintenance burden. 34 | 35 | - [Improved IRC layout](https://github.com/SchildiChat/schildichat-desktop/pull/269) 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all setup regenerate-i18n web desktop-common linux debian rpm pacman local-pkgbuild local-pkgbuild-install windows windows-portable 2 | .PHONY: web-release debian-release rpm-release pacman-release windows-setup-release windows-unpacked-release windows-portable-release windows-release 3 | .PHONY: macos-common macos macos-mas macos-release macos-mas-release icns 4 | .PHONY: container-build-debian container-build-fedora container-build-windows 5 | .PHONY: container-web-release container-debian-release container-rpm-release container-appimage-release container-windows-release container-release container-local-pkgbuild 6 | .PHONY: linux-container-release container-debian-based-release 7 | .PHONY: clean undo_setup fixup 8 | .PHONY: fix_yarn_cache 9 | 10 | CFGDIR ?= configs/sc 11 | 12 | all: web 13 | 14 | YARN ?= yarnpkg 15 | CONTAINER_ENGINE ?= podman 16 | NODE_VERSION ?= 22 17 | 18 | VERSION := $(shell grep version element-desktop/package.json | sed 's|.*: \"\(.*\)\",|\1|') 19 | WEB_APP_NAME := $(shell grep '"name"' element-web/package.json | head -n 1 | sed 's|.*: \"\(.*\)\",|\1|') 20 | DESKTOP_APP_NAME := $(shell grep '"name"' element-desktop/package.json | head -n 1 | sed 's|.*: \"\(.*\)\",|\1|') 21 | PRODUCT_NAME := $(shell grep '"productName"' element-desktop/package.json | sed 's|.*: \"\(.*\)\",|\1|') 22 | 23 | WEB_OUT := element-web/dist 24 | WEB_OUT_DIST_VERSION := $(VERSION) 25 | #OUT_WEB := $(WEB_OUT)/$(WEB_APP_NAME)-$(WEB_OUT_DIST_VERSION).tar.gz 26 | OUT_WEB := $(WEB_OUT)/element-$(WEB_OUT_DIST_VERSION).tar.gz 27 | 28 | DESKTOP_OUT := element-desktop/dist 29 | OUT_DEB64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)_$(VERSION)_amd64.deb 30 | OUT_RPM64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).x86_64.rpm 31 | OUT_PAC64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).pacman 32 | OUT_APPIMAGE64 := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION).AppImage 33 | OUT_TARXZ64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).tar.xz 34 | OUT_WIN64 := $(DESKTOP_OUT)/$(PRODUCT_NAME)\ Setup\ $(VERSION).exe 35 | OUT_WIN64_PORTABLE := $(DESKTOP_OUT)/$(PRODUCT_NAME)\ $(VERSION).exe 36 | OUT_WIN64_BETTER_NAME := $(PRODUCT_NAME)_Setup_v$(VERSION).exe 37 | OUT_WIN64_UNPACKED_BETTER_NAME := $(PRODUCT_NAME)_win-unpacked_v$(VERSION).zip 38 | OUT_WIN64_PORTABLE_BETTER_NAME := $(PRODUCT_NAME)_win-portable_v$(VERSION) 39 | OUT_MACOS := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION)-universal.dmg 40 | OUT_MACOS_MAS := $(DESKTOP_OUT)/mas-universal/$(PRODUCT_NAME).app 41 | 42 | CONTAINER_IMAGE_DEBIAN := schildichat-desktop-containerbuild-debian 43 | CONTAINER_IMAGE_FEDORA := schildichat-desktop-containerbuild-fedora 44 | CONTAINER_IMAGE_WINDOWS := schildichat-desktop-containerbuild-windows 45 | 46 | RELEASE_DIR := release 47 | CURRENT_RELEASE_DIR := $(RELEASE_DIR)/$(VERSION) 48 | 49 | # macOS Codesigning 50 | CSC_IDENTITY_AUTO_DISCOVERY ?= false 51 | NOTARIZE_APPLE_ID ?= 52 | CSC_NAME ?= 53 | 54 | -include release.mk 55 | 56 | setup: 57 | ./setup.sh 58 | 59 | element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset/*) 60 | 61 | element-desktop/build/icon.icns: element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset 62 | iconutil -c icns -o $@ $< 63 | 64 | element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset/*) 65 | 66 | element-desktop/build/dmg.icns: element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset 67 | iconutil -c icns -o $@ $< 68 | 69 | icns: element-desktop/build/icon.icns element-desktop/build/dmg.icns 70 | 71 | regenerate-i18n: setup 72 | ./regenerate_i18n.sh 73 | 74 | web: export DIST_VERSION=$(WEB_OUT_DIST_VERSION) 75 | web: setup 76 | cp $(CFGDIR)/config.json element-web/ 77 | $(YARN) --cwd element-web dist 78 | echo "$(VERSION)" > element-web/webapp/version 79 | 80 | desktop-common: web 81 | $(YARN) --cwd element-desktop run fetch --cfgdir '' 82 | SQLCIPHER_BUNDLED=1 $(YARN) --cwd element-desktop run build:native 83 | 84 | macos-common: web icns 85 | $(YARN) --cwd element-desktop run fetch --cfgdir '' 86 | $(YARN) --cwd element-desktop run build:native:universal 87 | 88 | linux: desktop-common 89 | $(YARN) --cwd element-desktop run build:64 --linux deb pacman tar.xz 90 | 91 | debian: desktop-common 92 | $(YARN) --cwd element-desktop run build:64 --linux deb 93 | 94 | rpm: desktop-common 95 | $(YARN) --cwd element-desktop run build:64 --linux rpm 96 | 97 | pacman: desktop-common 98 | $(YARN) --cwd element-desktop run build:64 --linux pacman 99 | 100 | appimage: desktop-common 101 | $(YARN) --cwd element-desktop run build:64 --linux AppImage 102 | 103 | windows: desktop-common 104 | $(YARN) --cwd element-desktop run build:64 --windows nsis 105 | 106 | windows-portable: desktop-common 107 | $(YARN) --cwd element-desktop run build:64 --windows portable 108 | 109 | macos: macos-common 110 | export CSC_IDENTITY_AUTO_DISCOVERY 111 | export NOTARIZE_APPLE_ID 112 | export CSC_NAME 113 | $(YARN) --cwd element-desktop run build:universal --mac dmg 114 | 115 | macos-mas: macos-common 116 | export NOTARIZE_APPLE_ID 117 | export CSC_NAME 118 | $(YARN) --cwd element-desktop run build:universal --mac mas 119 | 120 | local-pkgbuild: debian 121 | ./create_local_pkgbuild.sh $(VERSION) $(DESKTOP_APP_NAME) $(PRODUCT_NAME) $(OUT_DEB64) 122 | 123 | local-pkgbuild-install: local-pkgbuild 124 | cd local-pkgbuild; makepkg --install 125 | 126 | web-release: web 127 | mkdir -p $(CURRENT_RELEASE_DIR) 128 | cp $(OUT_WEB) $(CURRENT_RELEASE_DIR)/${WEB_APP_NAME}-$(WEB_OUT_DIST_VERSION).tar.gz 129 | 130 | debian-release: debian 131 | mkdir -p $(CURRENT_RELEASE_DIR) 132 | cp $(OUT_DEB64) $(CURRENT_RELEASE_DIR) 133 | 134 | rpm-release: rpm 135 | mkdir -p $(CURRENT_RELEASE_DIR) 136 | cp $(OUT_RPM64) $(CURRENT_RELEASE_DIR) 137 | 138 | pacman-release: pacman 139 | mkdir -p $(CURRENT_RELEASE_DIR) 140 | cp $(OUT_PAC64) $(CURRENT_RELEASE_DIR) 141 | 142 | appimage-release: appimage 143 | mkdir -p $(CURRENT_RELEASE_DIR) 144 | cp $(OUT_APPIMAGE64) $(CURRENT_RELEASE_DIR) 145 | 146 | windows-setup-release: windows 147 | mkdir -p $(CURRENT_RELEASE_DIR) 148 | cp $(OUT_WIN64) $(CURRENT_RELEASE_DIR)/$(OUT_WIN64_BETTER_NAME) 149 | 150 | windows-unpacked-release: windows 151 | mkdir -p $(CURRENT_RELEASE_DIR) 152 | cd element-desktop/dist/win-unpacked && zip -r ../../../$(CURRENT_RELEASE_DIR)/$(OUT_WIN64_UNPACKED_BETTER_NAME) * 153 | 154 | windows-portable-release: windows-portable 155 | ./windowsportable.sh $(OUT_WIN64_PORTABLE) $(OUT_WIN64_PORTABLE_BETTER_NAME) $(CURRENT_RELEASE_DIR) $(VERSION) 156 | 157 | windows-release: windows-setup-release windows-unpacked-release windows-portable-release 158 | 159 | macos-release: macos 160 | mkdir -p $(CURRENT_RELEASE_DIR) 161 | cp $(OUT_MACOS) $(CURRENT_RELEASE_DIR) 162 | 163 | macos-mas-release: macos-mas 164 | mkdir -p $(CURRENT_RELEASE_DIR) 165 | cp $(OUT_MACOS_MAS) $(CURRENT_RELEASE_DIR) 166 | 167 | container-build-debian: 168 | $(CONTAINER_ENGINE) build --security-opt seccomp=unconfined --security-opt label=disable -t $(CONTAINER_IMAGE_DEBIAN) -f Containerfile.debian --build-arg NODE_VERSION=$(NODE_VERSION) . 169 | 170 | container-build-fedora: 171 | $(CONTAINER_ENGINE) build --security-opt seccomp=unconfined --security-opt label=disable -t $(CONTAINER_IMAGE_FEDORA) -f Containerfile.fedora --build-arg NODE_VERSION=$(NODE_VERSION) . 172 | 173 | container-build-windows: container-build-debian 174 | $(CONTAINER_ENGINE) build --security-opt seccomp=unconfined --security-opt label=disable -t $(CONTAINER_IMAGE_WINDOWS) -f Containerfile.windows --build-arg CONTAINER_IMAGE_DEBIAN=$(CONTAINER_IMAGE_DEBIAN) . 175 | 176 | container-web-release: container-build-debian 177 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make web-release 178 | 179 | container-debian-release: container-build-debian 180 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make debian-release 181 | 182 | # For all releases which are fine being built from Debian 183 | container-debian-based-release: container-build-debian 184 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make web-release debian-release appimage-release 185 | 186 | container-rpm-release: container-build-fedora 187 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_FEDORA):latest make rpm-release 188 | 189 | container-appimage-release: container-build-debian 190 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make appimage-release 191 | 192 | container-windows-release: container-build-windows 193 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_WINDOWS):latest make windows-release 194 | 195 | container-release: container-build-windows #container-build-fedora 196 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_WINDOWS):latest make web-release debian-release appimage-release rpm-release windows-setup-release windows-portable-release 197 | #$(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_FEDORA):latest make rpm-release 198 | 199 | # For all Linux releases we build 200 | linux-container-release: container-debian-based-release container-rpm-release 201 | 202 | container-local-pkgbuild: container-build-debian 203 | $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make local-pkgbuild 204 | 205 | bom.lock: element-desktop/yarn.lock element-web/yarn.lock matrix-js-sdk/yarn.lock 206 | ./build-bom.sh 207 | bom: bom.lock 208 | 209 | fix_yarn_cache: 210 | $(YARN) cache list || $(YARN) cache clean 211 | 212 | clean: 213 | $(YARN) --cwd matrix-js-sdk clean 214 | $(YARN) --cwd element-web clean 215 | $(YARN) --cwd element-desktop clean 216 | rm -f element-desktop/webapp || true 217 | rm -rf element-web/dist 218 | rm -rf local-pkgbuild 219 | rm -f bom.lock 220 | rm -f element-web/res/css/sc-cpd-overrides.css 221 | 222 | undo_setup: 223 | rm -rf element-desktop/node_modules element-web/node_modules matrix-js-sdk/node_modules i18n-helper/node_modules element-desktop/.hak 224 | 225 | fixup: undo_setup fix_yarn_cache 226 | make setup 227 | make clean 228 | make setup 229 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SchildiChat Web/Desktop 2 | 3 | SchildiChat Web/Desktop is a fork of Element [Web](https://github.com/element-hq/element-web)/[Desktop](https://github.com/element-hq/element-desktop). 4 | 5 | 6 | ## Initial build setup 7 | 8 | ``` 9 | git clone -b lite --recurse-submodules https://github.com/SchildiChat/schildichat-desktop.git 10 | cd schildichat-desktop 11 | make setup # optional step if using the other make targets 12 | ``` 13 | 14 | ## Building on Linux 15 | 16 | Easiest to build on Linux is using `podman`, i.e. use one of the following make targets: 17 | 18 | ``` 19 | make container-appimage-release 20 | make container-debian-release 21 | make container-rpm-release 22 | make container-web-release 23 | ``` 24 | 25 | 26 | ## Windows building dependencies 27 | 28 | To build on Windows, use [Element's](https://web-docs.element.dev/Element%20Desktop/windows-requirements.html) guide as starting point. 29 | 30 | Some additional notes I found useful: 31 | 32 | 33 | ### Before build 34 | 35 | To prepare your build environment for VSC tools (use 2022 rather than 2019 mentioned upstream: 36 | 37 | ``` 38 | "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 39 | ``` 40 | 41 | Additionally, make sure some programs are in your `PATH`: 42 | 43 | ``` 44 | export PATH="/C/Strawberry/perl/bin:$PATH:/C/Program Files/NASM:/C/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC/14.41.34120/bin/Hostx64/x64/" 45 | ``` 46 | 47 | - Strawberry perl needs to go before possibly already installed `/usr/bin/perl` 48 | - NASM needs to be available 49 | - `nmake` bundled with VSC wasn't available without adding that additionally (make sure the version is correct for what you installed) 50 | 51 | 52 | ### Additional packages not mentioned upstream 53 | 54 | ``` 55 | npm install yarn 56 | npm install gyp 57 | npm install electron-builder 58 | npm install @electron/fuses 59 | pip install setuptools 60 | ``` 61 | 62 | To update outdated npm packages: 63 | 64 | ``` 65 | npm outdated 66 | npm update 67 | ``` 68 | 69 | ### Troubleshooting 70 | 71 | - `yarn link` fails with permission denied: [kill any running nodejs task](https://stackoverflow.com/questions/64603970/an-unexpected-error-occurred-eperm-operation-not-permitted-in-yarn) 72 | - `electron-builder` fails to extract `winCodeSign`: 73 | - Download [source code](https://github.com/electron-userland/electron-builder-binaries/releases/tag/winCodeSign-2.6.0) manually 74 | - Extract `electron-builder-binaries-winCodeSign-2.6.0.zip\electron-builder-binaries-winCodeSign-2.6.0\winCodeSign` to your `AppData\Local\electron-builder\Cache\winCodeSign\winCodeSign-2.6.0 75 | - [Source](https://github.com/electron-userland/electron-builder/issues/8149#issuecomment-2328460139) 76 | 77 | 78 | ## Release builds 79 | 80 | See [here](RELEASE.md). 81 | 82 | 83 | ## Old build instructions, to be revised in the future 84 | 85 | 86 | ## Building SchildiChat Web/Desktop 87 | 88 | This particular repo is a wrapper project for element-desktop, element-web, and matrix-js-sdk. It's the recommended starting point to build SchildiChat for Web **and** Desktop. 89 | 90 | The `master` branch contains the latest release. 91 | Development happens in the `sc` branch, which might be **broken at any time**! 92 | 93 |
schildichat-desktop <-- this repo (recommended starting point to build SchildiChat for Web and Desktop)
 94 | |-- element-desktop (electron wrapper)
 95 | |-- element-web (most of the development happens here)
 96 | `-- matrix-js-sdk (Matrix client js sdk)
 97 | 
98 | 99 | ### Install dependencies 100 | 101 | #### Debian build dependencies 102 | 103 | Since Debian is usually slow to update packages on its stable releases, 104 | some dependencies might not be recent enough to build SchildiChat. 105 | The following are the dependencies required to build SchildiChat Web/Desktop on Debian 11 (bullseye): 106 | 107 | ``` 108 | # apt install vim curl git make gcc g++ python jq libsqlcipher-dev pkg-config libsecret-1-dev libarchive-tools openssl libssl-dev tcl 109 | 110 | # curl -sL https://deb.nodesource.com/setup_16.x | bash - 111 | # apt update 112 | # apt install nodejs 113 | 114 | # curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - 115 | # echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list 116 | # apt update 117 | # apt install yarn 118 | 119 | $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 120 | $ echo 'export PATH="$PATH:$HOME/.cargo/bin"' >> .bashrc 121 | $ source .bashrc 122 | ``` 123 | 124 | #### macOS build dependencies 125 | 126 | ##### Install brew package manager 127 | ``` 128 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 129 | ``` 130 | 131 | ##### Install packages 132 | 133 | ``` 134 | brew install tcl rust node gpg vim curl git yarn git make gcc 135 | ``` 136 | 137 | #### Signed macOS builds 138 | 139 | To sign a macOS build set the environment or make variable `CSC_IDENTITY_AUTO_DISCOVERY` to true 140 | or set `CSC_NAME` to your certificate name or id. 141 | 142 | To notarize a build with Apple set `NOTARIZE_APPLE_ID` to your AppleID and set the keychain item 143 | `NOTARIZE_CREDS` to an App specific AppleID password. 144 | 145 | ### Create release builds 146 | 147 | ``` 148 | # The single make targets are explained below 149 | make {web|debian|windows-setup|windows-portable|macos|...}-release 150 | ``` 151 | 152 | After that these packages which belong to their respective make target should appear in release/\/. 153 | 154 | #### Builds distributed via GitHub releases 155 | - `web`: _schildichat-web-\.tar.gz_: Archive that can be unpacked and served by a **web** server (copy `config.sample.json` to `config.json` and adjust the [configuration](https://github.com/SchildiChat/element-web/blob/sc/docs/config.md) to your likings) 156 | - `debian`: File ready for installation on a **Debian Linux** (based) system via `dpkg -i schildichat-desktop__amd64.deb` 157 | - `windows-setup`: _SchildiChat_Setup_v\.exe_: File ready for **installation** on a **Windows** system 158 | - `windows-portable`: _SchildiChat_win-portable_v\.zip_: **Portable** version for a **Windows** system – take SchildiChat together with your login data around with you (the archive contains a readme with **instructions** and **notes**) 159 | - `macos`: Build a *.dmg for **macOS** 160 | 161 | #### Additional `{...}-release` targets not used for GitHub releases 162 | - `pacman`: File ready for installation on an **Arch Linux** (based) system via `pacman -U schildichat-desktop-.pacman` 163 | - `rpm`: Build a *.rpm for Linux 164 | - `windows-unpacked`: _SchildiChat_win-unpacked_v\.zip_: **unpacked** archive for a **Windows** system 165 | - `macos-mas`: Build a *.pkg for release in the Mac App Store 166 | 167 | ### Build SchildiChat Web and deploy it directly to your web server 168 | 169 | Put the `config.json` with the [configuration](https://github.com/SchildiChat/element-web/blob/sc/docs/config.md) you want for your hosted instance in a subfolder of the `configs` folder. 170 | Then create a file named `release.mk` and fill it similar to that: 171 | ``` 172 | .PHONY: your-deploy-web 173 | 174 | YOUR_CFGDIR := configs/your_subfolder 175 | your-deploy-%: CFGDIR := $(YOUR_CFGDIR) 176 | 177 | your-deploy-web: web 178 | rsync --info=progress2 -rup --del element-web/webapp/ you@yourwebserver:/the/folder/served/for/schildi/ 179 | ``` 180 | 181 | 182 | # Merge helpers 183 | 184 | ## Add upstream repo remotes 185 | 186 | ``` 187 | source merge_helpers.sh 188 | forall_repos add_upstream 189 | ``` 190 | -------------------------------------------------------------------------------- /RELEASE.md: -------------------------------------------------------------------------------- 1 | # Releasing SchildiChat deskop 2 | 3 | ## Build Linux releases 4 | 5 | On a Linux machine with podman: 6 | 7 | ``` 8 | make linux-container-release 9 | ``` 10 | 11 | ## Build Windows releases 12 | 13 | On a Windows machine in git bash (**not** WSL), run: 14 | 15 | ``` 16 | make windows-setup-release 17 | ``` 18 | 19 | ## Upload the release 20 | 21 | Copy the Windows-generated `.exe` from the `release` directory into the release directory on your Linux machine. 22 | Then (after ensuring you have a GitHub API token setup for the script to pick up): 23 | 24 | ``` 25 | ./deploy/create-github-release.sh 26 | ``` 27 | -------------------------------------------------------------------------------- /alternative_package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Convert app to a different package with different icon and name, 3 | # to allow multiple installations on the same device 4 | # (different colors for different account :D). 5 | 6 | package_add="$1" 7 | name_add="$2" 8 | mydir="$(dirname "$(realpath "$0")")" 9 | 10 | if [ -z "$package_add" ] || [ -z "$name_add" ]; then 11 | echo "Usage: $0 " 12 | exit 1 13 | fi 14 | 15 | pushd "$mydir" > /dev/null 16 | 17 | web_dir="element-web" 18 | desktop_dir="element-desktop" 19 | package_file="$desktop_dir/package.json" 20 | 21 | if grep -q "schildichat-desktop-$package_add" "$package_file"; then 22 | echo "Abort, $package_add already active" 23 | exit 0 24 | fi 25 | 26 | # Analog to SchildiChat-Android's alternative_package.sh 27 | logo_replace_color() { 28 | local file="$1" 29 | local color_shell="$2" 30 | local color_shell_dark="$3" 31 | local color_bg="$4" 32 | # shell color 33 | sed -i "s|#8BC34A|$color_shell|gi" "$file" 34 | sed -i "s|#33691E|$color_shell_dark|gi" "$file" 35 | # bg color 36 | sed -i "s|#e2f0d2|$color_bg|gi" "$file" 37 | } 38 | 39 | logo_alternative() { 40 | for f in "$web_dir"/graphics/*.svg; do 41 | logo_replace_color "$f" "$@" 42 | done 43 | for f in "$desktop_dir"/graphics/*.svg; do 44 | logo_replace_color "$f" "$@" 45 | done 46 | "$web_dir/graphics/icon_gen.sh" 47 | "$desktop_dir/graphics/icon_gen.sh" 48 | } 49 | 50 | # Analog to SchildiChat-Android's alternative_package.sh 51 | case "$package_add" in 52 | "a") 53 | # blue 54 | logo_alternative "#2196F3" "#0D47A1" "#BBDEFB" 55 | ;; 56 | "b") 57 | # orange: 900 color recuded in value 58 | logo_alternative "#FB8C00" "#7f2c00" "#FFE0B2" 59 | ;; 60 | "c") 61 | # red: 900 color reduced in value 62 | logo_alternative "#E53935" "#4c0b0b" "#FFCDD2" 63 | ;; 64 | "d") 65 | # purple 66 | logo_alternative "#5E35B1" "#311B92" "#D1C4E9" 67 | ;; 68 | "e") 69 | # pink 70 | logo_alternative "#D81B60" "#880E4F" "#F8BBD0" 71 | ;; 72 | "x") 73 | # cyan 74 | logo_alternative "#00ACC1" "#006064" "#B2EBF2" 75 | ;; 76 | "z") 77 | # white 78 | logo_alternative "#ffffff" "#000000" "#eeeeee" 79 | ;; 80 | esac 81 | 82 | sed -i "s|SchildiChat|SchildiChat.$name_add|g" "$package_file" 83 | sed -i "s|schildichat-desktop|schildichat-desktop-$package_add|g" "$package_file" 84 | -------------------------------------------------------------------------------- /apply_patches.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | 7 | print_section() { 8 | local msg="$1" 9 | echo "##############################################################" 10 | echo "# $msg" 11 | echo "##############################################################" 12 | } 13 | 14 | pushd "$mydir" > /dev/null 15 | 16 | source ./merge_helpers.sh 17 | 18 | # Apply our patches 19 | #print_section "Apply patches to matrix-js-sdk" 20 | #apply_patches matrix-js-sdk 21 | print_section "Apply patches to element-web" 22 | apply_patches element-web 23 | print_section "Apply patches to element-desktop" 24 | apply_patches element-desktop 25 | 26 | # Automatic adjustments 27 | #print_section "Apply i18n" 28 | #automatic_i18n_adjustment 29 | print_section "Apply automatic package adjustments" 30 | automatic_packagejson_adjustment 31 | 32 | # Automatic theme and icon update 33 | print_section "Apply automatic theme updates" 34 | ./theme.sh y 35 | print_section "Generate icons" 36 | ./graphics/icon_gen.sh y 37 | 38 | popd > /dev/null 39 | -------------------------------------------------------------------------------- /build-bom.sh: -------------------------------------------------------------------------------- 1 | # /usr/bin/env bash 2 | cat element-desktop/yarn.lock > bom.lock 3 | echo "" >> bom.lock 4 | cat element-web/yarn.lock >> bom.lock 5 | echo "" >> bom.lock 6 | cat matrix-js-sdk/yarn.lock >> bom.lock 7 | echo "" >> bom.lock 8 | 9 | # matrix-seshat 10 | cat << EOF >> bom.lock 11 | matrix-seshat@2.3.0: 12 | version "2.3.0" 13 | resolved "https://github.com/matrix-org/seshat/archive/refs/heads/master.tar.gz" 14 | integrity sha512-y4xtZViRX/h0zczl5hiqWyFNK7np0vVujQ/l47g1Mm7B7mDTHAneSSy/d5GADeUIsezZyvT3qKhSCwSSyqS8Xw== 15 | dependencies: 16 | sqlcipher "~m1" 17 | openssl "~1.1.1f" 18 | 19 | sqlcipher@m1: 20 | version "m1" 21 | resolved "https://github.com/SchildiChat/sqlcipher/archive/refs/heads/m1.tar.gz" 22 | integrity sha512-1Nk7J0dQyVedFLqnxUJQWrf/VBsUsfC5vAYaHDH3LRbWarfKDGYduZrhdBuzgAF+kMA237HaDt9Tq+CcXV0EJA== 23 | 24 | openssl@1.1.1f: 25 | version "1.1.1f" 26 | resolved "https://www.openssl.org/source/openssl-1.1.1f.tar.gz" 27 | integrity sha512-sAvZta1SmPvO7sa7GcGrDBBspc+zEXhJfFi/fg4M8w/MGcIPhOI68xzBJr8kR9Pk+EYduXuvp7149pVhky8ADA== 28 | EOF 29 | echo "" >> bom.lock 30 | 31 | # keytar 32 | cat << EOF >> bom.lock 33 | keytar@^5.6.0: 34 | version "5.6.0" 35 | resolved "https://github.com/atom/node-keytar/archive/refs/tags/v5.6.0.tar.gz" 36 | integrity sha512-dPdXLrm8AlqooT0ZS7y/mYif0DmQXoGGrqomwfl6ugIEHlpL1D+hJYhjyMC00TK924vOGD1a6OhDS2+RKEffXA== 37 | dependencies: 38 | libsecret "~0.20.3" 39 | 40 | libsecret@0.20.3: 41 | version "0.20.3" 42 | resolved "https://gitlab.gnome.org/GNOME/libsecret/-/archive/0.20.3/libsecret-0.20.3.tar.gz" 43 | integrity sha512-tbD1jNKEEW9bPWuyd5YZ68eQjHhXOsy5PseVwleWYMEXgrrPPGnGGrLzSFUXRzNulFceLMeUG49Qr1rnyvfa1A== 44 | EOF 45 | -------------------------------------------------------------------------------- /bump_release_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | 7 | pushd "$mydir" > /dev/null 8 | 9 | source ./merge_helpers.sh 10 | 11 | # Check branch 12 | check_branch $branch 13 | forall_repos check_branch $branch 14 | 15 | # Ensure clean git state 16 | forall_repos check_clean_git 17 | 18 | bump_release_version 19 | 20 | # Get version string 21 | get_current_versions 22 | get_versions_string 23 | 24 | # Add everything 25 | git add -A 26 | git commit --allow-empty -m "New release v$versions_string" 27 | git tag -s "v$versions_string" -m "New release v$versions_string" 28 | 29 | popd > /dev/null 30 | -------------------------------------------------------------------------------- /bump_test_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | 7 | pushd "$mydir" > /dev/null 8 | 9 | source ./merge_helpers.sh 10 | 11 | # Check branch 12 | check_branch $branch 13 | forall_repos check_branch $branch 14 | 15 | # Ensure clean git state 16 | forall_repos check_clean_git 17 | 18 | bump_test_version 19 | 20 | # Get version string 21 | get_current_versions 22 | get_versions_string 23 | 24 | # Add everything 25 | git add -A 26 | git commit --allow-empty -m "New test release v$versions_string" 27 | git tag -s "v$versions_string" -m "New test release v$versions_string" 28 | 29 | popd > /dev/null 30 | -------------------------------------------------------------------------------- /configs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !sc 3 | -------------------------------------------------------------------------------- /configs/sc/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "update_base_url": null, 3 | "default_server_config": { 4 | "m.homeserver": { 5 | "base_url": "https://matrix-client.matrix.org", 6 | "server_name": "matrix.org" 7 | } 8 | }, 9 | "brand": "SchildiChat", 10 | "integrations_ui_url": "https://scalar.vector.im/", 11 | "integrations_rest_url": "https://scalar.vector.im/api", 12 | "integrations_widgets_urls": [ 13 | "https://scalar.vector.im/_matrix/integrations/v1", 14 | "https://scalar.vector.im/api", 15 | "https://scalar-staging.vector.im/_matrix/integrations/v1", 16 | "https://scalar-staging.vector.im/api", 17 | "https://scalar-staging.riot.im/scalar/api" 18 | ], 19 | "show_labs_settings": true, 20 | "room_directory": { 21 | "servers": [ 22 | "matrix.org", 23 | "gitter.im", 24 | "libera.chat", 25 | "schildi.chat" 26 | ] 27 | }, 28 | "enable_presence_by_hs_url": { 29 | "https://matrix.org": false, 30 | "https://matrix-client.matrix.org": false 31 | }, 32 | "terms_and_conditions_links": [ 33 | { 34 | "url": "https://schildi.chat/desktop/privacy", 35 | "text": "Privacy Policy" 36 | } 37 | ], 38 | "map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx" 39 | } 40 | -------------------------------------------------------------------------------- /create_local_pkgbuild.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | cd "$mydir" 7 | 8 | version="$1" 9 | appName="$2" 10 | productName="$3" 11 | debOut="$4" 12 | 13 | template_dir="local-pkgbuild-template" 14 | out_dir="local-pkgbuild" 15 | 16 | if [ -z "$version" ] || [ -z "$appName" ] || [ -z "$productName" ] || [ -z "$debOut" ]; then 17 | echo "Usage: $0 version appName productName debOut" 18 | exit 1 19 | fi 20 | 21 | debName="$(basename "$debOut")" 22 | 23 | rm -rf "$out_dir" 24 | mkdir "$out_dir" 25 | 26 | setup_file() { 27 | local file="$1" 28 | local outfile="$2" 29 | if [ -z "$outfile" ]; then 30 | local outfile="$file" 31 | fi 32 | cat "$template_dir/$file" \ 33 | | sed "s|---version---|$version|g" \ 34 | | sed "s|---appName---|$appName|g" \ 35 | | sed "s|---productName---|$productName|g" \ 36 | | sed "s|---debName---|$debName|g" \ 37 | > "$out_dir/$outfile" 38 | } 39 | 40 | setup_file PKGBUILD 41 | setup_file schildichat-desktop.sh "$appName.sh" 42 | ln -r -s "$debOut" "$out_dir/$debName" 43 | -------------------------------------------------------------------------------- /deploy/.gitignore: -------------------------------------------------------------------------------- 1 | repos/* -------------------------------------------------------------------------------- /deploy/create-github-release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Based upon https://hinty.io/ivictbor/publish-and-upload-release-to-github-with-bash-and-curl/ 4 | # and https://gist.github.com/stefanbuck/ce788fee19ab6eb0b4447a85fc99f447 5 | # 6 | 7 | set -e 8 | # set -x 9 | 10 | version="$1" 11 | releasepath="$2" 12 | 13 | if [ -z "$version" ] || [ -z "$releasepath" ]; then 14 | echo "Usage: $0 " 15 | exit 1 16 | fi 17 | 18 | if [ -z "$GITHUB_API_TOKEN" ]; then 19 | github_api_token=`cat ~/githubtoken` 20 | else 21 | github_api_token="$GITHUB_API_TOKEN" 22 | fi 23 | release_notes_file="/tmp/scrn.md" 24 | 25 | owner=SchildiChat 26 | repo=schildichat-desktop 27 | target=lite 28 | 29 | # Define variables 30 | GH_API="https://api.github.com" 31 | GH_REPO="$GH_API/repos/$owner/$repo" 32 | AUTH="Authorization: token $github_api_token" 33 | 34 | # Validate token 35 | curl -o /dev/null -sH "$AUTH" $GH_REPO || { echo "Error: Invalid repo, token or network issue!"; exit 1; } 36 | 37 | # Get release notes 38 | $EDITOR "$release_notes_file" 39 | release_notes=`cat "$release_notes_file"` 40 | 41 | # Create draft release 42 | echo "Create GitHub draft release ..." 43 | json_string=`jq -n --arg tag "v$version" --arg target "$target" --arg body "$release_notes" '{ 44 | tag_name: $tag, 45 | target_commitish: $target, 46 | name: $tag, 47 | body: $body, 48 | draft: true, 49 | prerelease: true 50 | }'` 51 | # echo "$json_string" 52 | res=`echo "$json_string" | curl -sH "$AUTH" $GH_REPO/releases -d @-` 53 | # echo "$res" | jq "." 54 | 55 | # Get release id 56 | id=`echo $res | jq ".id"` 57 | # echo "id: $id" 58 | 59 | # Upload assets 60 | find "$releasepath" -type f | while read filename; do 61 | echo "" 62 | echo "Uploading $filename ..." 63 | 64 | # Construct url 65 | GH_ASSET="https://uploads.github.com/repos/$owner/$repo/releases/$id/assets?name=$(basename $filename)" 66 | 67 | # Upload 68 | res=`curl --progress-bar --data-binary @"$filename" -H "$AUTH" -H "Content-Type: application/octet-stream" $GH_ASSET` 69 | state=`echo $res | jq ".state"` 70 | if [ "$state" == "\"uploaded\"" ]; then 71 | echo "Success!" 72 | else 73 | echo "Error:" 74 | echo $res | jq "." 75 | exit -1 76 | fi 77 | done 78 | 79 | # Publish draft 80 | res=`curl -sH "$AUTH" $GH_REPO/releases/$id -d '{"draft": false}'` 81 | draft=`echo $res | jq ".draft"` 82 | echo "" 83 | if [ "$draft" == "false" ]; then 84 | echo "Release v$version published on GitHub!" 85 | else 86 | echo "Error:" 87 | echo $res | jq "." 88 | exit -1 89 | fi 90 | -------------------------------------------------------------------------------- /deploy/update-aur-bin.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | # set -x 5 | 6 | DEPLOY_ROOT="$(dirname "$(realpath "$0")")" 7 | 8 | version="$1" 9 | debpath="$2" 10 | 11 | repopath="$DEPLOY_ROOT/repos/aur-bin" 12 | repourl="ssh://aur@aur.archlinux.org/schildichat-desktop-bin.git" 13 | 14 | sha256sum=($(sha256sum $debpath)) 15 | 16 | [ -d "$repopath" ] || git clone $repourl $repopath 17 | 18 | pushd "$repopath" > /dev/null 19 | 20 | git fetch 21 | git reset --hard origin/master 22 | 23 | sed -i "s|^_pkgver=.*$|_pkgver=$version|" PKGBUILD 24 | sed -i "s|^pkgrel=.*$|pkgrel=1|" PKGBUILD 25 | sed -i "s|^sha256sums=('.*'$|sha256sums=('$sha256sum'|" PKGBUILD 26 | 27 | makepkg --printsrcinfo > .SRCINFO 28 | 29 | git add .SRCINFO PKGBUILD 30 | git commit -m "Bump version to v$version" 31 | 32 | git push 33 | 34 | popd > /dev/null 35 | 36 | echo "Release v$version published on AUR!" 37 | -------------------------------------------------------------------------------- /deploy/update-flathub.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | # set -x 5 | 6 | DEPLOY_ROOT="$(dirname "$(realpath "$0")")" 7 | 8 | version="$1" 9 | debpath="$2" 10 | 11 | repopath="$DEPLOY_ROOT/repos/flathub" 12 | repourl="git@github.com:flathub/chat.schildi.desktop.git" 13 | 14 | downloadurl="https://github.com/SchildiChat/schildichat-desktop/releases/download/v${version}/schildichat-desktop_${version}_amd64.deb" 15 | sha256sum=($(sha256sum $debpath)) 16 | debdate=$(date +%Y-%m-%d -r $debpath) 17 | 18 | [ -d "$repopath" ] || git clone $repourl $repopath 19 | 20 | pushd "$repopath" > /dev/null 21 | 22 | git fetch 23 | git checkout master 24 | git reset --hard origin/master 25 | 26 | git checkout -B "release-v$version" 27 | 28 | yamlFile="chat.schildi.desktop.yaml" 29 | xmlFile="chat.schildi.desktop.metainfo.xml" 30 | 31 | sed -i "s|url: .* #SC:url|url: $downloadurl #SC:url|" "$yamlFile" 32 | sed -i "s|sha256: .* #SC:sha256|sha256: $sha256sum #SC:sha256|" "$yamlFile" 33 | 34 | sed -i "s|^\s\s$| \n |" "$xmlFile" 35 | 36 | git add $yamlFile $xmlFile 37 | git commit -m "Bump version to v$version" 38 | 39 | git push -f --set-upstream origin "release-v$version" 40 | 41 | popd > /dev/null 42 | 43 | echo "Release v$version published on flathub, now merge that branch as PR: https://github.com/flathub/chat.schildi.desktop/" 44 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "nixpkgs": { 4 | "locked": { 5 | "lastModified": 1699380656, 6 | "narHash": "sha256-H9kQH3J2Z15Ady3zVQsN/tXv8qnRr+p1B0eUkR1bKfE=", 7 | "owner": "NixOS", 8 | "repo": "nixpkgs", 9 | "rev": "03e7a22654c44489a0a70ea0e237de3e512cd8a6", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "NixOS", 14 | "repo": "nixpkgs", 15 | "type": "github" 16 | } 17 | }, 18 | "root": { 19 | "inputs": { 20 | "nixpkgs": "nixpkgs" 21 | } 22 | } 23 | }, 24 | "root": "root", 25 | "version": 7 26 | } 27 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "The SchildiChat Matrix client"; 3 | 4 | inputs.nixpkgs.url = github:NixOS/nixpkgs; 5 | 6 | outputs = { self, nixpkgs }: let 7 | systems = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; 8 | forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system); 9 | 10 | overlay = import ./nix/overlay.nix; 11 | 12 | # Memoize nixpkgs for different platforms for efficiency. 13 | nixpkgsFor = forAllSystems (system: 14 | import nixpkgs { 15 | inherit system; 16 | overlays = [ overlay ]; 17 | }); 18 | in { 19 | inherit overlay; 20 | 21 | packages = builtins.mapAttrs (system: pkgs: { 22 | inherit (pkgs) 23 | schildichat-web 24 | schildichat-desktop 25 | schildichat-desktop-wayland 26 | ; 27 | }) nixpkgsFor; 28 | 29 | defaultPackage = forAllSystems (system: self.packages.${system}.schildichat-desktop); 30 | 31 | apps = forAllSystems(system: { 32 | schildichat-desktop = { 33 | type = "app"; 34 | program = "${self.packages.${system}.schildichat-desktop}/bin/schildichat-desktop"; 35 | }; 36 | schildichat-desktop-wayland = { 37 | type = "app"; 38 | program = "${self.packages.${system}.schildichat-desktop-wayland}/bin/schildichat-desktop"; 39 | }; 40 | }); 41 | 42 | defaultApp = forAllSystems (system: self.apps.${system}.schildichat-desktop); 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /generate_changelog.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | 7 | pushd "$mydir" > /dev/null 8 | 9 | source ./merge_helpers.sh 10 | 11 | # Check branch 12 | check_branch $branch 13 | forall_repos check_branch $branch 14 | 15 | # Ensure clean git state 16 | forall_repos check_clean_git 17 | 18 | # Fetch upstream 19 | forall_repos git fetch origin > /dev/null 2>/dev/null 20 | forall_repos git fetch upstream > /dev/null 2>/dev/null 21 | 22 | ( 23 | # Add new line below git log: https://unix.stackexchange.com/a/345558 24 | 25 | get_latest_upstream_tag 26 | forelement_repos git log --pretty=format:"- %s" "sc" "^$latest_upstream_tag" "^master" \ 27 | | printf '%s\n' "$(cat)" \ 28 | | sed "s|Merge tag '\\(.*\\)' into sc.*|Update codebase to Element \1|" \ 29 | | sed "s|Merge tag '\\(.*\\)' into merge.*|Update codebase to Element \1|" 30 | 31 | get_current_mxsdk_tags 32 | 33 | pushd "matrix-js-sdk" > /dev/null 34 | git log --pretty=format:"- %s" "sc" "^$current_mxjssdk_tag" "^master" \ 35 | | printf '%s\n' "$(cat)" \ 36 | | grep -v "Merge .*tag" 37 | popd > /dev/null 38 | 39 | pushd "matrix-react-sdk" > /dev/null 40 | git log --pretty=format:"- %s" "sc" "^$current_mxreactsdk_tag" "^master" \ 41 | | printf '%s\n' "$(cat)" \ 42 | | grep -v "Merge .*tag" 43 | popd > /dev/null 44 | ) \ 45 | | grep -v "Automatic i18n reversion" \ 46 | | grep -v "Automatic package.json reversion" \ 47 | | grep -v "Merge .*branch" \ 48 | | grep -v "Automatic theme update" \ 49 | | grep -v "Automatic package.json adjustment" \ 50 | | grep -v "Automatic i18n adjustment" \ 51 | | grep -v "Update version to .*-sc\\..*" \ 52 | | grep -v "\\.sh" \ 53 | | grep -v "\\.md" \ 54 | | grep -v "Added translation using Weblate" \ 55 | | grep -v "Translated using Weblate" \ 56 | | grep -v "weblate/sc" \ 57 | | grep -v "\\[.*merge.*\\]" \ 58 | | awk '!seen[$0]++' `# https://stackoverflow.com/a/1444448` \ 59 | || echo "No significant changes since the last stable release" 60 | 61 | popd > /dev/null 62 | -------------------------------------------------------------------------------- /generate_patches.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | pushd "$mydir" > /dev/null 7 | 8 | source ./merge_helpers.sh 9 | 10 | persist_patches() { 11 | local repo="$(realpath "$1")" 12 | local patch_dir="$SCHILDI_ROOT/patches/$(basename "$1")" 13 | if [ ! -d "$repo" ]; then 14 | echo "Unknown repo: $repo" 15 | return 1 16 | fi 17 | 18 | pushd "$repo" 19 | 20 | if [ -d "$patch_dir" ]; then 21 | echo "Clearing old patches..." 22 | rm "$patch_dir"/* 23 | else 24 | echo "Creating new patch dir $patch_dir..." 25 | mkdir "$patch_dir" 26 | fi 27 | # Assume we forked from a tag starting with 'v' (our own tags start with sc_) 28 | local fork_point=`git describe --tags --match 'v*'| sed 's|-[^-]*-[^-]*$||'` 29 | echo "Creating new patches from $fork_point" 30 | git format-patch -k "$fork_point".. -o "$patch_dir" 31 | echo "Clearing automated commits from patches" 32 | find "$patch_dir" -name "*-Automatic-package.json-adjustment.patch" -exec rm {} \; 33 | find "$patch_dir" -name "*-Automatic-icon-update.patch" -exec rm {} \; 34 | find "$patch_dir" -name "*-Automatic-theme-update.patch" -exec rm {} \; 35 | find "$patch_dir" -name "*-Automatic-setup-commit.patch" -exec rm {} \; 36 | find "$patch_dir" -name "*-Update-version-to-*.patch" -exec rm {} \; 37 | popd 38 | } 39 | 40 | persist_patches element-desktop 41 | persist_patches element-web 42 | #persist_patches matrix-js-sdk 43 | 44 | popd > /dev/null 45 | -------------------------------------------------------------------------------- /graphics/icon_gen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | automatic_commit="$1" 7 | 8 | SCHILDI_ROOT="$mydir/.." 9 | source "$SCHILDI_ROOT/merge_helpers.sh" 10 | 11 | if [[ "$automatic_commit" == [Yy]* ]]; then 12 | forelement_repos check_clean_git 13 | fi 14 | 15 | 16 | export_rect() { 17 | w="$1" 18 | h="$2" 19 | in="$3" 20 | out="$4" 21 | inkscape -w "$w" -h "$h" --export-filename="$out" -C "$in" 22 | } 23 | export_square() { 24 | size="$1" 25 | in="$2" 26 | out="$3" 27 | export_rect "$1" "$size" "$in" "$out" 28 | } 29 | 30 | repo_dir="$SCHILDI_ROOT/element-web" 31 | base_out="$repo_dir/res/vector-icons" 32 | 33 | for i in 1024 120 150 152 180 24 300 44 48 50 76 88; do 34 | export_square "$i" "$mydir/ic_launcher_sc.svg" "$base_out/$i.png" 35 | done 36 | 37 | for i in 114 120 144 152 180 57 60 72 76; do 38 | export_square "$i" "$mydir/store_icon.svg" "$base_out/apple-touch-icon-$i.png" 39 | done 40 | 41 | for i in 150 310 70; do 42 | export_square "$i" "$mydir/store_icon.svg" "$base_out/mstile-$i.png" 43 | done 44 | 45 | # TODO fix measures of input to have correct measures for export here again 46 | export_rect 1024 500 "$mydir/feature_image_transparent.svg" "$base_out/1240x600.png" 47 | export_rect 512 250 "$mydir/feature_image_transparent.svg" "$base_out/620x300.png" 48 | export_rect 256 125 "$mydir/feature_image.svg" "$base_out/mstile-310x150.png" 49 | 50 | magick "$base_out/48.png" "$base_out/favicon.ico" 51 | rm "$base_out/48.png" # this was only created for favicon.ico 52 | 53 | for f in "$base_out"/*.png; do 54 | pngcrush -ow "$f" 55 | done 56 | 57 | 58 | cp "$mydir/ic_launcher_sc.svg" "$repo_dir/res/themes/element/img/logos/element-logo.svg" 59 | 60 | export_square 320 "$mydir/ic_launcher_sc.svg" "$repo_dir/res/themes/element/img/logos/element-app-logo.png" 61 | 62 | repo_dir="$SCHILDI_ROOT/element-desktop" 63 | base_out="$repo_dir/res/img" 64 | 65 | export_square 256 "$mydir/ic_launcher_sc.svg" "$base_out/element.png" 66 | magick "$base_out/element.png" "$base_out/element.ico" 67 | 68 | # TODO monochrome icon? Unless https://github.com/element-hq/element-desktop/pull/1934 is what we'll end with 69 | export_square 256 "$mydir/ic_launcher_sc.svg" "$base_out/monochrome.png" 70 | magick "$base_out/element.png" "$base_out/monochrome.ico" 71 | 72 | for f in "$base_out"/*.png; do 73 | pngcrush -ow "$f" 74 | done 75 | 76 | 77 | 78 | 79 | base_out="$repo_dir/build" 80 | 81 | for i in 16 24 48 64 96 128 256 512 1024; do 82 | export_square "$i" "$mydir/ic_launcher_sc.svg" "$base_out/icons/$i"x"$i.png" 83 | done 84 | 85 | export_square "320" "$mydir/ic_launcher_sc.svg" "$base_out/install-spinner.png" 86 | pngcrush "$base_out/install-spinner.png" 87 | magick "$base_out/install-spinner.png" "$base_out/install-spinner.gif" 88 | rm "$base_out/install-spinner.png" 89 | 90 | magick "$base_out/icons/256x256.png" "$base_out/icon.ico" 91 | magick "$base_out/icons/1024x1024.png" "$base_out/icon.icns" 92 | rm "$base_out/icons/1024x1024.png" 93 | 94 | for f in "$base_out/icons"/*.png; do 95 | pngcrush -ow "$f" 96 | done 97 | 98 | 99 | if [[ "$automatic_commit" == [Yy]* ]]; then 100 | forelement_repos commit_if_dirty "Automatic icon update" 101 | fi 102 | -------------------------------------------------------------------------------- /graphics/store_icon.svg: -------------------------------------------------------------------------------- 1 | ic_launcher_sc.svg -------------------------------------------------------------------------------- /hard_reset_repos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | 7 | cd "$mydir" 8 | 9 | source ./merge_helpers.sh 10 | 11 | # Note: this doesn't delete files starting with a dot, 12 | # and in particular not the '.git' directory, which we 13 | # want to keep 14 | forall_repos bash -c 'rm -rf *' 15 | forall_repos git reset HEAD --hard 16 | -------------------------------------------------------------------------------- /i18n-helper/.gitignore: -------------------------------------------------------------------------------- 1 | yarn.lock 2 | yarn-error.log 3 | node_modules/ -------------------------------------------------------------------------------- /i18n-helper/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const globby = require('globby'); 4 | 5 | function readStrings(p) { 6 | return JSON.parse(fs.readFileSync(p).toString()); 7 | } 8 | 9 | function writeStrings(p, strings) { 10 | fs.writeFileSync(p, JSON.stringify(strings, null, 4) + "\n"); 11 | } 12 | 13 | (async () => { 14 | console.log(process.argv.length); 15 | console.log(process.argv[0]); 16 | console.log(process.argv[1]); 17 | console.log(process.argv[2]); 18 | console.log(process.argv[3]); 19 | if (process.argv.length < 3) { 20 | console.log("No path with the original strings given!"); 21 | process.exit(-1); 22 | } 23 | originalPath = process.argv[2]; 24 | 25 | overlayPath = null; 26 | if (process.argv.length > 3) { 27 | overlayPath = process.argv[3]; 28 | } else { 29 | console.log("Continue without overlays ...") 30 | } 31 | 32 | const paths = await globby(path.join(originalPath, "*.json")); 33 | 34 | paths.forEach(p => { 35 | let strings = readStrings(p); 36 | 37 | for (const key of Object.keys(strings)) { 38 | strings[key] = strings[key] 39 | .replace(/Element/g, "SchildiChat") 40 | .replace(/element\.io/g, "schildi.chat") 41 | 42 | // It's still Element Call 43 | .replace(/SchildiChat Call/g, "Element Call") 44 | .replace(/SchildiChat-Call/g, "Element-Call"); 45 | } 46 | 47 | if (overlayPath) { 48 | op = path.join(overlayPath, path.basename(p)); 49 | 50 | if (fs.existsSync(op)) { 51 | overlayStrings = readStrings(op); 52 | Object.assign(strings, overlayStrings); 53 | } 54 | } 55 | 56 | writeStrings(p, strings); 57 | }); 58 | })(); -------------------------------------------------------------------------------- /i18n-helper/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "i18n-helper", 3 | "version": "0.0.1", 4 | "main": "index.js", 5 | "dependencies": { 6 | "globby": "^11.0.3" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/bg.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Zobrazit" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Anzeigen" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/en_EN.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Show" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Mostrar" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/et.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Näita" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/eu.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/fa.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "نشان دادن" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Afficher" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Mutat" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Tampilkan" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Visualizza" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/ja.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/lt.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Rodyti" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/nb_NO.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Vis" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Tonen" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Pokaż" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/pt_BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Mostrar" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Arată" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Показать" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/sk.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Visa" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "Göster" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/vi.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/zh_Hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "显示" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-desktop/zh_Hant.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show": "顯示" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/bg.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfigurace SchildiChatu obsahuje neplatný JSON. Opravte problém a načtěte stránku znovu.", 3 | "Download Completed": "Stahování dokončeno", 4 | "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s používá pokročilé funkce prohlížeče, které váš prohlížeč nepodporuje." 5 | } 6 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/de_DE.json: -------------------------------------------------------------------------------- 1 | { 2 | "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Deine SchildiChat-Konfiguration enthält ungültiges JSON. Bitte korrigiere das Problem und lade die Seite neu.", 3 | "Download Completed": "Download abgeschlossen", 4 | "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s verwendet erweiterte Browserfunktionen, die von deinem aktuellen Browser nicht unterstützt werden." 5 | } 6 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/en_EN.json: -------------------------------------------------------------------------------- 1 | { 2 | "Welcome to SchildiChat": "Welcome to SchildiChat" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/es.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/et.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/eu.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/fa.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/fr.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/hu.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/id.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/it.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/ja.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/lt.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/nb_NO.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/nl.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/pl.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/pt_BR.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/ro.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/ru.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/sk.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/sv.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/tr.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/vi.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/zh_Hans.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/element-web/zh_Hant.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/bg.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "Enable layout with message bubbles": "Povolit bubliny zpráv", 3 | "Show message bubbles on one side only": "Bubliny zpráv zobrazit pouze na jedné straně", 4 | "Show message bubbles depending on the width either on both sides or only on one side": "Bubliny zpráv zobrazit v závislosti na šířce stránky buď na obou stranách, nebo pouze na jedné straně", 5 | "Message bubbles": "Bubliny zpráv", 6 | "Normal priority": "Normální priorita", 7 | "Message layout": "Vzhled zpráv", 8 | "Modern": "Moderní", 9 | "Show people and rooms in a combined list": "Zobrazit lidi a místnosti v kombinovaném seznamu", 10 | "Update notifications": "Aktualizace oznámení", 11 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Chcete se připojit k místnosti, která vás bude informovat o nových verzích? To je užitečné zejména v případě, že vaše platforma nepodporuje automatické aktualizace SchildiChatu (např. Windows a macOS).", 12 | "Don't ask again": "Neptat se znovu", 13 | "System": "Systém", 14 | "Light theme": "Světlý motiv", 15 | "Dark theme": "Tmavý motiv", 16 | "Add custom theme": "Přidat vlastní motiv", 17 | "Theme in use": "Používaný motiv", 18 | "User name color mode": "Barevný režim uživatelského jména", 19 | "Uniform": "Jednotný", 20 | "PowerLevel": "Úroveň oprávnění", 21 | "MXID": "MXID", 22 | "In group chats": "Ve skupinových chatech", 23 | "In public rooms": "Ve veřejných místnostech", 24 | "All rooms you're in will appear in Home.": "Všechny místnosti, ve kterých se nacházíte, se zobrazí v Úvodu.", 25 | "Show all rooms in Home": "Zobrazit všechny místnosti v Úvodu", 26 | "Show people in spaces": "Ukázat lidi v prostorech", 27 | "Show notification badges for People in Spaces": "Zobrazit odznaky oznámení pro Lidé v prostorech", 28 | "Return to the room previously opened in a space": "Návrat do dříve otevřené místnosti v prostoru", 29 | "If disabled, the space overview will be shown when switching to another space.": "Pokud je vypnuto, zobrazí se při přepnutí do jiného prostoru přehled prostorů.", 30 | "For people": "Pro osoby", 31 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Pokud je zakázáno, můžete stále přidávat chaty s lidmi do osobních prostorů. Pokud je povoleno, automaticky se zobrazí všichni, kteří jsou členy daného prostoru.", 32 | "Intermediate: medium sized avatar with single-line preview": "Střední: středně velký avatar s jednořádkovým náhledem", 33 | "Roomy: big avatar with two-line preview": "Prostorný: velký avatar s dvouřádkovým náhledem", 34 | "Room list style": "Styl seznamu místností", 35 | "Compact: tiny avatar together with name and preview in one line": "Kompaktní: malý avatar spolu se jménem a náhledem v jednom řádku", 36 | "Show advanced theme settings": "Zobrazit pokročilá nastavení motivu", 37 | "Theme": "Motiv", 38 | "Room list": "Seznam místností", 39 | "Font size and typeface": "Velikost a typ písma", 40 | "Hide advanced theme settings": "Skrýt pokročilá nastavení motivu", 41 | "Mark rooms as unread": "Povolit označování chatů jako nepřečtených", 42 | "Mark as unread": "Označit jako nepřečtené", 43 | "Mark as read": "Označit jako přečtené", 44 | "Enable YouTube embed player": "Povolí vložený přehrávač YouTube", 45 | "Collapse additional buttons": "Sbalit další tlačítka", 46 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Úvod je užitečný pro získání přehledu o všem. Mějte na paměti, že její vypnutí může způsobit, že nebudete moci zobrazit některé místnosti.", 47 | "Corners": "Rohy", 48 | "Round": "Oblé", 49 | "Extra round": "Kulaté", 50 | "Mixed": "Smíšené", 51 | "Sound pack": "Balíček zvuků", 52 | "Schildi: Softer sounds for reduced anxiety": "Schildi: Jemnější zvuky pro snížení úzkosti", 53 | "Classic: The same sharp sounds as Element": "Klasické: Stejně ostré zvuky jako Element", 54 | "React with \"%(reaction)s\"": "Reagovat pomocí \"%(reaction)s\"" 55 | } 56 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/en_EN.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "Show message bubbles on one side only", 3 | "Show message bubbles depending on the width either on both sides or only on one side": "Show message bubbles depending on the width either on both sides or only on one side", 4 | "Message bubbles": "Message bubbles", 5 | "Normal priority": "Normal priority", 6 | "Message layout": "Message layout", 7 | "Modern": "Modern", 8 | "Show people and rooms in a combined list": "Show people and rooms in a combined list", 9 | "Update notifications": "Update notifications", 10 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).", 11 | "Don't ask again": "Don't ask again", 12 | "System": "System", 13 | "Add custom theme": "Add custom theme", 14 | "Theme in use": "Theme in use", 15 | "Light theme": "Light theme", 16 | "Dark theme": "Dark theme", 17 | "User name color mode": "User name color mode", 18 | "Uniform": "Uniform", 19 | "PowerLevel": "PowerLevel", 20 | "MXID": "MXID", 21 | "For people": "For people", 22 | "In group chats": "In group chats", 23 | "In public rooms": "In public rooms", 24 | "Show all rooms in Home": "Show all rooms in Home", 25 | "All rooms you're in will appear in Home.": "All rooms you're in will appear in Home.", 26 | "Show people in spaces": "Show people in spaces", 27 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.", 28 | "Show notification badges for People in Spaces": "Show notification badges for People in Spaces", 29 | "Return to the room previously opened in a space": "Return to the room previously opened in a space", 30 | "If disabled, the space overview will be shown when switching to another space.": "If disabled, the space overview will be shown when switching to another space.", 31 | "Compact: tiny avatar together with name and preview in one line": "Compact: tiny avatar together with name and preview in one line", 32 | "Intermediate: medium sized avatar with single-line preview": "Intermediate: medium sized avatar with single-line preview", 33 | "Roomy: big avatar with two-line preview": "Roomy: big avatar with two-line preview", 34 | "Room list style": "Room list style", 35 | "Hide advanced theme settings": "Hide advanced theme settings", 36 | "Show advanced theme settings": "Show advanced theme settings", 37 | "Theme": "Theme", 38 | "Room list": "Room list", 39 | "Font size and typeface": "Font size and typeface", 40 | "Mark rooms as unread": "Allow marking chats as unread", 41 | "Mark as unread": "Mark as unread", 42 | "Mark as read": "Mark as read", 43 | "Enable YouTube embed player": "Enable YouTube embed player", 44 | "Collapse additional buttons": "Collapse additional buttons", 45 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.", 46 | "Corners": "Corners", 47 | "Round": "Round", 48 | "Extra round": "Extra round", 49 | "Mixed": "Mixed", 50 | "Sound pack": "Sound pack", 51 | "Schildi: Softer sounds for reduced anxiety": "Schildi: Softer sounds for reduced anxiety", 52 | "Classic: The same sharp sounds as Element": "Classic: The same sharp sounds as Element", 53 | "React with \"%(reaction)s\"": "React with \"%(reaction)s\"" 54 | } 55 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "mostrar las burbujas de mensajes en un solo lado", 3 | "Message bubbles": "Burbujas de mensajes", 4 | "Normal priority": "Prioridad normal", 5 | "Enable layout with message bubbles": "Activar diseño con mensajes de burbujas", 6 | "Show message bubbles depending on the width either on both sides or only on one side": "Mostrar mensajes de burbuja dependiendo del tamaño tanto en ambos lados o solo en un lado" 7 | } 8 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/et.json: -------------------------------------------------------------------------------- 1 | { 2 | "Enable layout with message bubbles": "Sõnumimullidega paigutuse lubamine", 3 | "Show message bubbles on one side only": "Näita sõnumimulle ainult ühel poolel", 4 | "Show message bubbles depending on the width either on both sides or only on one side": "Näita sõnumimullid sõltuvalt laiusest kas mõlemal või ainult ühel küljel", 5 | "Normal priority": "Tavaline prioriteet", 6 | "Message bubbles": "Sõnumimullid" 7 | } 8 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/eu.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "Erakutsi mezu burbuilak alde batetik bakarrik", 3 | "Message bubbles": "Mezu burbuilak", 4 | "Normal priority": "Normala lehentasuna", 5 | "Enable layout with message bubbles": "Gaitu diseinua batera mezua burbuilak", 6 | "Show message bubbles depending on the width either on both sides or only on one side": "Erakutsi mezu burbuilak arabera zabalera bai, bi aldeetatik edo alde batetik bakarrik" 7 | } 8 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/fa.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "Afficher les bulles de message sur un seul côté", 3 | "Show message bubbles depending on the width either on both sides or only on one side": "Afficher les bulles de message selon la largeur soit sur un seul côté, soit sur les deux", 4 | "Message bubbles": "Bulles de message", 5 | "Normal priority": "Priorité normale", 6 | "Message layout": "Disposition des messages", 7 | "Modern": "Moderne", 8 | "Show people and rooms in a combined list": "Afficher les personnes et les salons dans une liste combinée", 9 | "Update notifications": "Mettre à jour les notifications", 10 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Souhaitez-vous rejoindre un salon vous notifiant à propos des nouvelles versions ? Cela est surtout utile si votre plateforme ne supporte pas les mises à jour automatiques pour SchildiChat (par ex. Windows et macOS).", 11 | "Don't ask again": "Ne plus demander", 12 | "System": "Système", 13 | "Add custom theme": "Ajouter un thème personnalisé", 14 | "Theme in use": "Thème utilisé", 15 | "Light theme": "Thème lumineux", 16 | "Dark theme": "Thème sombre", 17 | "Uniform": "Uniforme", 18 | "MXID": "MXID", 19 | "In group chats": "Dans les chats de groupe", 20 | "In public rooms": "Dans les salons publiques", 21 | "All rooms you're in will appear in Home.": "Tous les salons dans lesquels vous êtes apparaîtront dans Accueil", 22 | "Show people in spaces": "Afficher les personnes dans les espaces", 23 | "Show notification badges for People in Spaces": "Afficher les badges de notifications pour les Personnes dans les Espaces", 24 | "User name color mode": "Mode de couleur des noms d'utilisateur", 25 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Si désactivé, vous pouvez toujours ajouter Messages Directs à votre Espace Personnel. Si activé, vous verrez automatiquement toutes les personnes qui sont membres de l'Espace.", 26 | "For people": "Pour les personnes", 27 | "Show all rooms in Home": "Afficher tous les salons dans Accueil" 28 | } 29 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "Enable layout with message bubbles": "Üzenetbuborékos elrendezés engedélyezése", 3 | "Show message bubbles on one side only": "Üzenetbuborékok megjelenítése csak az egyik oldalon", 4 | "Message bubbles": "Üzenet buborékok", 5 | "Show message bubbles depending on the width either on both sides or only on one side": "Üzenetbuborékok megjelenítése a szélességtől függően mindkét oldalon vagy csak az egyik oldalon", 6 | "Normal priority": "Normál prioritás", 7 | "Show people and rooms in a combined list": "Személyek és szobák megjelenítése egy egyesített listában", 8 | "Update notifications": "Értesítések frissítése", 9 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Szeretne csatlakozni olyan szobához, amely értesíti Önt az új megjelenésekről? Ez különösen akkor hasznos, ha az Ön platformja nem támogatja a SchildiChat automatikus frissítéseit (pl. Windows és macOS).", 10 | "System": "Rendszer", 11 | "Show all rooms in Home": "Az összes szoba megjelenítése a kezdőoldalon", 12 | "All rooms you're in will appear in Home.": "Az összes szoba, amelyben tartózkodik, megjelenik a Kezdőlapon.", 13 | "Mark as read": "Olvasottnak jelöl", 14 | "Enable YouTube embed player": "YouTube beágyazott lejátszó engedélyezése", 15 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "A Kezdőlap hasznos ahhoz, hogy mindenről áttekintést kapjunk. Ne feledje, hogy a kikapcsolásával bizonyos szobákat nem fog látni.", 16 | "Schildi: Softer sounds for reduced anxiety": "Schildi: Lágyabb hangok a kevesebb stresszért", 17 | "Sound pack": "Hangcsomag", 18 | "Classic: The same sharp sounds as Element": "Klasszikus: Ugyanazok az éles hangok, mint az Elementnél", 19 | "Don't ask again": "Ne kérdezze újra", 20 | "Light theme": "Világos téma", 21 | "Dark theme": "Sötét téma", 22 | "Mark as unread": "Olvasatlannak jelöl", 23 | "Collapse additional buttons": "További gombok összecsukása", 24 | "Theme": "Téma", 25 | "Room list": "Szobák listája", 26 | "Font size and typeface": "Betűméret és betűtípus", 27 | "Message layout": "Üzenetek elrendezése", 28 | "Modern": "Modern" 29 | } 30 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "Normal priority": "Prioritas normal", 3 | "Message layout": "Tata letak pesan", 4 | "Modern": "Modern", 5 | "Show people and rooms in a combined list": "Tampilkan pengguna dan ruangan di daftar gabungan", 6 | "Don't ask again": "Jangan tanya lagi", 7 | "System": "Sistem", 8 | "Add custom theme": "Tambahkan tema kustom", 9 | "Theme in use": "Tema digunakan", 10 | "Light theme": "Tema terang", 11 | "Dark theme": "Tema gelap", 12 | "User name color mode": "Mode warna nama pengguna", 13 | "Uniform": "Seragam", 14 | "PowerLevel": "TingkatDaya", 15 | "MXID": "MXID", 16 | "In group chats": "Di grup", 17 | "In public rooms": "Di ruangan publik", 18 | "Show all rooms in Home": "Tampilkan semua ruangan di Beranda", 19 | "All rooms you're in will appear in Home.": "Semua ruangan yang Anda bergabung akan ditampilkan di Beranda.", 20 | "Show notification badges for People in Spaces": "Tampilkan lencana pemberitahuan untuk Orang di Space", 21 | "Show people in spaces": "Tampilkan orang di space", 22 | "For people": "Untuk orang-orang", 23 | "Return to the room previously opened in a space": "Kembali ke ruangan yang sebelumnya dibuka di sebuah space", 24 | "If disabled, the space overview will be shown when switching to another space.": "Jika dinonaktifkan, ikhtisar space akan ditampilkan saat ganti ke space yang lain.", 25 | "Compact: tiny avatar together with name and preview in one line": "Kecil: avatar kecil dengan nama dan tampilan di satu baris", 26 | "Roomy: big avatar with two-line preview": "Luas: avatar besar dengan tampilan dua baris", 27 | "Room list style": "Gaya daftar ruangan", 28 | "Hide advanced theme settings": "Sembunyikan pengaturan tema lanjutan", 29 | "Show advanced theme settings": "Tampilkan pengaturan tema lanjutan", 30 | "Theme": "Tema", 31 | "Room list": "Daftar ruangan", 32 | "Font size and typeface": "Ukuran fon dan jenis huruf", 33 | "Show message bubbles on one side only": "Tampilkan gelembung pesan di satu sisi saja", 34 | "Show message bubbles depending on the width either on both sides or only on one side": "Tampilkan gelembung pesan tergantung pada lebarnya baik di kedua sisi atau hanya di satu sisi", 35 | "Message bubbles": "Gelembung pesan", 36 | "Update notifications": "Notifikasi peningkatan", 37 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Apakah Anda ingin bergabung ke ruangan yang memberitahu Anda tentang rilis yang baru? Ini sangat berguna jika platform Anda tidak mendukung pembaruan otomatis untuk SchildiChat (mis. Windows dan macOS).", 38 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Jika dinonaktifkan, Anda masih dapat menambahkan Pesan Langsung ke Space Personal. Jika diaktifkan, Anda akan otomatis melihat semua orang yang juga ada di Spacenya.", 39 | "Intermediate: medium sized avatar with single-line preview": "Sedang: avatar sedang dengan tampilan satu baris", 40 | "Mark rooms as unread": "Perbolehkan menandai obrolan sebagai dibaca", 41 | "Mark as unread": "Tandai sebagai belum dibaca", 42 | "Mark as read": "Tandai sebagai dibaca", 43 | "Enable YouTube embed player": "Aktifkan pemain YouTube tersemat", 44 | "Collapse additional buttons": "Sembunyikan tombol tambahan", 45 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Beranda berguna untuk mendapatkan ikhtisar segalanya. Menonaktifkan Beranda mungkin dapat membuat Anda tidak dapat melihat beberapa ruangan.", 46 | "Corners": "Sudut", 47 | "Round": "Bulat", 48 | "Extra round": "Ekstra bulat", 49 | "Mixed": "Campur", 50 | "Sound pack": "Paket suara", 51 | "Schildi: Softer sounds for reduced anxiety": "Schildi: Suara lebih lembut untuk mengurangi kecemasan", 52 | "Classic: The same sharp sounds as Element": "Klasik: Suara keras yang biasa seperti Element", 53 | "React with \"%(reaction)s\"": "Reaksi dengan \"%(reaction)s\"" 54 | } 55 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "Modern": "Moderno", 3 | "Show people and rooms in a combined list": "Visualizza persone e stanze in una lista combinata", 4 | "Update notifications": "Aggiorna notifiche", 5 | "Don't ask again": "Non chiedere di nuovo", 6 | "System": "Sistema", 7 | "Add custom theme": "Aggiungi tema personalizzato", 8 | "Theme in use": "Tema in uso", 9 | "Light theme": "Tema chiaro", 10 | "Dark theme": "Tema scuro", 11 | "Normal priority": "Priorità normale", 12 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Vuoi entrare in una stanza che ti notificherà riguardo nuove release? Sarebbe comodo particolarmente se la tua piattaforma non supporta aggiornamenti automatici (Come per esempio Windows o MacOS.)", 13 | "Show message bubbles on one side only": "Visualizza bolle messaggi su un lato solo", 14 | "Show message bubbles depending on the width either on both sides or only on one side": "Visualizza bolle messaggi in base alla lunghezza di entrambi i lati o di uno solo", 15 | "User name color mode": "Modalità colore nome utente", 16 | "Room list style": "Stile lista stanze", 17 | "Theme": "Tema", 18 | "Show all rooms in Home": "Visualizza tutte le stanze nella Home", 19 | "All rooms you're in will appear in Home.": "Tutte le stanze in cui partecipi appariranno nella Home.", 20 | "For people": "Per le persone", 21 | "Room list": "Lista stanze", 22 | "Show advanced theme settings": "Visualizza impostazioni avanzate tema", 23 | "Mark rooms as unread": "Permetti di segnare le chat come non lette", 24 | "Message bubbles": "Bolle messaggi", 25 | "Message layout": "Impaginazione messaggi", 26 | "Mark as unread": "Segna come non letto", 27 | "Uniform": "Uniforme", 28 | "Show people in spaces": "Visualizza persone negli spazi", 29 | "MXID": "MXID", 30 | "In public rooms": "Nelle stanze pubbliche", 31 | "In group chats": "Nelle chat di gruppo", 32 | "Font size and typeface": "Dimensione e tipo carattere", 33 | "Hide advanced theme settings": "Nascondi impostazioni avanzate tema" 34 | } 35 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "Normal priority": "常優先度" 3 | } 4 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/lt.json: -------------------------------------------------------------------------------- 1 | { 2 | "Normal priority": "Normalaus prioriteto", 3 | "Modern": "Modernus", 4 | "Message bubbles": "Žinučių burbulai", 5 | "Message layout": "Žinučių išdėstymas", 6 | "Show people and rooms in a combined list": "Asmenų ir kambarių rodymas bendrame sąraše", 7 | "Room list": "Kambarių sąrašas", 8 | "Show message bubbles on one side only": "Rodyti žinučių burbulus tik vienoje pusėje", 9 | "Update notifications": "Atnaujinimų pranešimai", 10 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Ar jūs norite prisijungti prie kambario kuris praneš jums apie atnaujinimus? Tai yra labai naudinga jei jūsų platforma nepalaiko automatinių SchildiChat atnaujinimų (pvz. Windows ir macOS).", 11 | "Don't ask again": "Nebeklausti", 12 | "System": "Sistema", 13 | "Theme in use": "Tema naudojama", 14 | "Light theme": "Šviesi tema", 15 | "Dark theme": "Tamsi tema", 16 | "MXID": "MXID", 17 | "In group chats": "Pokalbių grupėse", 18 | "In public rooms": "Viešuose kambariuose", 19 | "Show all rooms in Home": "Rodyti visus kambarius Pradžioje", 20 | "All rooms you're in will appear in Home.": "Visi kambariai kuriuose esate bus rodomi Pradžioje.", 21 | "Hide advanced theme settings": "Slėpti išplėstinius temos nustatymus", 22 | "Show advanced theme settings": "Rodyti išplėstinius temos nustatymus", 23 | "Theme": "Tema", 24 | "Font size and typeface": "Šrifto dydis ir raštas", 25 | "Show message bubbles depending on the width either on both sides or only on one side": "Rodyti žinučių burbulus, priklausomai nuo pločio, abiejose pusėse arba tik vienoje pusėje", 26 | "Sound pack": "Garso paketas", 27 | "Schildi: Softer sounds for reduced anxiety": "Schildi: švelnesni garsai sumažintam nerimui", 28 | "Classic: The same sharp sounds as Element": "Klasikiniai: Tie patys aštrūs garsai kaip ir Element", 29 | "Enable YouTube embed player": "Įgalinti YouTube įterptą grotuvą", 30 | "Add custom theme": "Pridėti pasirinktinę temą", 31 | "Mark as unread": "Žymėti kaip neskaitytą", 32 | "Mark as read": "Žymėti kaip perskaitytą", 33 | "User name color mode": "Naudotojo vardo spalvų režimas", 34 | "Uniform": "Vienodi", 35 | "Show notification badges for People in Spaces": "Rodyti pranešimų ženkliukus žmonėms erdvėse", 36 | "Return to the room previously opened in a space": "Grįžti į anksčiau atidarytą kambarį erdvėje", 37 | "If disabled, the space overview will be shown when switching to another space.": "Jei išjungta, perjungiant į kitą erdvę bus rodoma erdvės apžvalga.", 38 | "Room list style": "Kambarių sąrašo stilius", 39 | "Compact: tiny avatar together with name and preview in one line": "Kompaktiška: mažytis avataras kartu su vardu ir peržiūra vienoje eilutėje", 40 | "Intermediate: medium sized avatar with single-line preview": "Vidutinis: vidutinio dydžio avataras su vienos eilutės peržiūra", 41 | "Roomy: big avatar with two-line preview": "Erdvus: didelis avataras su dviejų eilučių peržiūra", 42 | "PowerLevel": "Galios lygis", 43 | "For people": "Žmonėms", 44 | "Show people in spaces": "Rodyti žmones erdvėse", 45 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Jei išjungta, vis tiek galite pridėti tiesioginius pokalbius į asmenines erdves. Jei ši funkcija įjungta, automatiškai matysite visus, kurie yra erdvės nariai.", 46 | "Mark rooms as unread": "Leisti žymėti pokalbius kaip neskaitytus", 47 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Pradžia yra naudinga, kad galėtumėte viską apžvelgti. Turėkite omenyje, kad ją išjungę galite nematyti tam tikrų kambarių.", 48 | "Collapse additional buttons": "Sulankstyti papildomus mygtukus", 49 | "Corners": "Kampai", 50 | "Round": "Apvalus", 51 | "Extra round": "Ypač apvalus", 52 | "Mixed": "Mišrus" 53 | } 54 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/nb_NO.json: -------------------------------------------------------------------------------- 1 | { 2 | "Message bubbles": "Meldingsbobler", 3 | "Normal priority": "Normal prioritet", 4 | "Message layout": "Meldingsvisning", 5 | "Modern": "Moderne", 6 | "Show people and rooms in a combined list": "Vis folk og rom i kombinert liste", 7 | "Update notifications": "Oppdater merknader", 8 | "Show message bubbles on one side only": "Vis meldingsbobler kun på én side", 9 | "Show message bubbles depending on the width either on both sides or only on one side": "Vis meldingsbobler avhengig av bredden enten på begge sider eller kun på én side", 10 | "Don't ask again": "Ikke spør igjen", 11 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Ønsker du at et rom skal gi deg merknader om nye utgivelser? Dette er spesielt nyttig hvis din plattform ikke støtter automatiske oppdateringer for SchildiChat (f.eks. Windows og macOS).", 12 | "Hide advanced theme settings": "Skjul avanserte draktinnstillinger", 13 | "Show advanced theme settings": "Vis avanserte draktinnstillinger", 14 | "Theme": "Drakt", 15 | "Room list": "Romliste", 16 | "Font size and typeface": "Størrelse på og type skrift", 17 | "Sound pack": "Lydpakke", 18 | "Schildi: Softer sounds for reduced anxiety": "Schildi: Mykere lyder for mindre angst", 19 | "System": "System", 20 | "Add custom theme": "Legg til egendefinert drakt", 21 | "Theme in use": "Drakt i bruk", 22 | "Light theme": "Lys drakt", 23 | "Dark theme": "Mørk drakt", 24 | "Mark as read": "Marker som lest", 25 | "Mark rooms as unread": "Tillat markering av sludringer som uleste", 26 | "Mark as unread": "Marker som ulest", 27 | "In group chats": "I gruppesludringer", 28 | "In public rooms": "I offentlige rom", 29 | "For people": "For folk", 30 | "Classic: The same sharp sounds as Element": "Klassisk: Samme skarpe lyder som Element", 31 | "Collapse additional buttons": "Fold sammen ytterligere knapper", 32 | "Corners": "Hjørner", 33 | "Round": "Runde", 34 | "Extra round": "Ekstra runde", 35 | "Mixed": "Blandet" 36 | } 37 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "Boodschappenbubbels slechts aan één kant tonen", 3 | "Show message bubbles depending on the width either on both sides or only on one side": "Toon berichtbubbels, afhankelijk van de breedte, aan beide zijden of slechts aan één zijde", 4 | "Message bubbles": "Boodschap bellen", 5 | "Normal priority": "Normale prioriteit", 6 | "Enable layout with message bubbles": "Schakel lay-out in met tekstballonnen", 7 | "Update notifications": "Update meldingen", 8 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Wilt u lid worden van een kamer waarin u wordt geïnformeerd over nieuwe releases? Dit is vooral handig als uw platform geen automatische updates voor SchildiChat ondersteunt (bijv. Windows en macOS).", 9 | "Don't ask again": "Niet nogmaals vragen", 10 | "Modern": "Modern", 11 | "Message layout": "Berichtlayout", 12 | "Show people and rooms in a combined list": "Toon personen en kamers in een gecombineerde lijst" 13 | } 14 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/pl.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/pt_BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "Enable layout with message bubbles": "Habilitar layout com bolhas de mensagem", 3 | "Message bubbles": "Bolhas de mensagens", 4 | "Normal priority": "Prioridade normal", 5 | "Show message bubbles on one side only": "Mostrar bolhas de mensagem em apenas um lado", 6 | "Show message bubbles depending on the width either on both sides or only on one side": "Mostrar bolhas de mensagem dependendo da largura de ambos os lados ou somente de um lado", 7 | "Hide advanced theme settings": "Ocultar configurações de tema avançadas", 8 | "Show advanced theme settings": "Mostrar configurações de tema avançadas", 9 | "Theme": "Tema", 10 | "Room list": "Lista de salas", 11 | "Font size and typeface": "Tamanho da fonte e tipo de letra", 12 | "Message layout": "Layout da mensagem", 13 | "Modern": "Moderno", 14 | "Show people and rooms in a combined list": "Mostrar pessoas e salas em uma lista combinada", 15 | "Update notifications": "Atualizar notificações", 16 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Você quer participar numa sala para ser notificado sobre novos lançamentos? Isto é especialmente útil se a sua plataforma não suportar atualizações automáticas para SchildiChat (tipo Windows e macOS).", 17 | "Don't ask again": "Não pergunte novamente", 18 | "System": "Sistema", 19 | "Add custom theme": "Adicionar tema personalizado", 20 | "Theme in use": "Tema em uso", 21 | "Dark theme": "Tema escuro", 22 | "Light theme": "Tema claro", 23 | "Uniform": "comum", 24 | "PowerLevel": "Nível de poder", 25 | "MXID": "MXID", 26 | "In group chats": "Em conversas de grupo", 27 | "In public rooms": "Em salas públicas", 28 | "All rooms you're in will appear in Home.": "Todos as salas em que você estiver aparecerão em Início.", 29 | "Show all rooms in Home": "Mostrar todos as salas em Início", 30 | "Show people in spaces": "Mostrar as pessoas em espaços", 31 | "Show notification badges for People in Spaces": "Mostrar símbolo de notificação para Pessoas em Espaços", 32 | "Return to the room previously opened in a space": "Retornar à sala previamente aberta em um espaço", 33 | "If disabled, the space overview will be shown when switching to another space.": "Se desativado, a visão geral do espaço será mostrada ao mudar para outro espaço.", 34 | "For people": "Para pessoas", 35 | "User name color mode": "Modo de cor baseado em nome do usuário", 36 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Se estiver desativado, você ainda pode adicionar Mensagens Diretas aos Espaços Pessoais. Se ativado, você verá automaticamente todos os que são membros do Espaço.", 37 | "Compact: tiny avatar together with name and preview in one line": "Compacto: avatar minúsculo junto com o nome e visualização em uma linha", 38 | "Intermediate: medium sized avatar with single-line preview": "Intermédio: avatar de tamanho médio com visualização de uma linha", 39 | "Roomy: big avatar with two-line preview": "Amplo: grande avatar com visualização em duas linhas", 40 | "Room list style": "Estilo da lista de salas", 41 | "Mark rooms as unread": "Permitir markar conversas como não lidos", 42 | "Mark as unread": "Markar como não lido", 43 | "Mark as read": "Markar como lido", 44 | "Collapse additional buttons": "Recolher botões adicionais" 45 | } 46 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "Arata bulele mesajelor pe o singură parte", 3 | "Show message bubbles depending on the width either on both sides or only on one side": "Arată bulele mesajelor bazat fie pe lățimea ambelor părți sau o singură parte", 4 | "Message bubbles": "Bulele mesajelor", 5 | "Normal priority": "Prioritate normală", 6 | "Message layout": "Așezarea mesajului", 7 | "Modern": "Modern", 8 | "Show people and rooms in a combined list": "Arată persoanele și camerele într-o listă combinată", 9 | "Update notifications": "Actualizează notificările", 10 | "Don't ask again": "Nu întreba din nou", 11 | "System": "Sistem", 12 | "Add custom theme": "Adaugă o temă proprie", 13 | "Theme in use": "Temă în folosință", 14 | "Light theme": "Temă luminoasă", 15 | "Dark theme": "Temă întunecată", 16 | "Uniform": "Uniform", 17 | "In group chats": "În chaturile de grup", 18 | "In public rooms": "În camerele publice", 19 | "All rooms you're in will appear in Home.": "Toate camerele în care te afli vor apărea în Pagina principala", 20 | "Show people in spaces": "Arată persoanele în spații", 21 | "Show notification badges for People in Spaces": "Arată simboluri de notificare pentru Persoanele din Spații", 22 | "Return to the room previously opened in a space": "Întoarce-te spre camera deschisă ultima oară într-un spațiu", 23 | "If disabled, the space overview will be shown when switching to another space.": "Dacă e dezactivat, se va arăta vederea de ansamblu a spațiului când schimbi pe alt spațiu.", 24 | "For people": "Pentru persoane", 25 | "User name color mode": "Modul culorilor utilizatorilor", 26 | "Show all rooms in Home": "Arată toate camerele în Pagina principală", 27 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Dacă e dezactivat, încă poți adăuga Mesaje Directe în Spații Personale. Dacă e activat, vei vedea toți membrii Spațiului automat." 28 | } 29 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "Message bubbles": "Пузырьки сообщений", 3 | "Normal priority": "Нормальный приоритет", 4 | "Enable layout with message bubbles": "Включение макета с пузырьками сообщений", 5 | "Show message bubbles on one side only": "Показывайте пузырьки с сообщениями только на одной стороне", 6 | "Show message bubbles depending on the width either on both sides or only on one side": "Показывать пузырьки сообщений в зависимости от ширины либо с обеих сторон, либо только с одной стороны", 7 | "Modern": "Современное", 8 | "Message layout": "Оформление сообщений", 9 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Вы хотите присоединиться к комнате, уведомляющей вас о новых релизах? Это особенно полезно, если ваша платформа не поддерживает автоматические обновления для SchildiChat (например, Windows и macOS).", 10 | "Show people and rooms in a combined list": "Показать людей и комнаты в объединенном списке", 11 | "Update notifications": "Уведомления об обновлениях", 12 | "Don't ask again": "Не спрашивать больше", 13 | "Hide advanced theme settings": "Скрыть расширенные настройки темы", 14 | "Show advanced theme settings": "Показать расширенные настройки темы", 15 | "Theme": "Тема", 16 | "Room list": "Список комнат", 17 | "Font size and typeface": "Размер и начертание шрифта", 18 | "Light theme": "Светлая тема", 19 | "Dark theme": "Тёмная тема", 20 | "System": "Система", 21 | "Add custom theme": "Добавить пользовательскую тему", 22 | "Theme in use": "Используемая тема", 23 | "In group chats": "В групповых чатах", 24 | "In public rooms": "В публичных комнатах", 25 | "PowerLevel": "Уровень прав", 26 | "MXID": "MXID", 27 | "Show all rooms in Home": "Показать все комнаты в Начале", 28 | "Show notification badges for People in Spaces": "Показывать значки уведомлений для людей в пространствах", 29 | "Return to the room previously opened in a space": "Возврат в комнату, ранее открытую в пространстве", 30 | "If disabled, the space overview will be shown when switching to another space.": "Если отключить, то при переключении на другое пространство будет отображаться обзор пространства.", 31 | "Uniform": "Одинаковый", 32 | "All rooms you're in will appear in Home.": "Все комнаты, в которых вы находитесь, будут отображаться в Начале.", 33 | "Show people in spaces": "Показать людей в пространствах", 34 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Если этот параметр отключен, вы по-прежнему можете добавлять личные сообщения в личные пространства. Если включено, вы будете автоматически видеть всех, кто является членом пространства.", 35 | "Compact: tiny avatar together with name and preview in one line": "Компактный: крошечный аватар вместе с именем и превью в одной строке", 36 | "User name color mode": "Имя пользователя цветовой режим", 37 | "For people": "Для людей", 38 | "Room list style": "Стиль списка комнат", 39 | "Intermediate: medium sized avatar with single-line preview": "Средний: аватар среднего размера с однострочным превью", 40 | "Roomy: big avatar with two-line preview": "Вместительный: большой аватар с двухстрочным превью" 41 | } 42 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "Enable layout with message bubbles": "Povolenie rozloženia s bublinami správ", 3 | "Show message bubbles on one side only": "Zobrazenie bublín správ len na jednej strane", 4 | "Show message bubbles depending on the width either on both sides or only on one side": "Zobrazenie bublín správ v závislosti od šírky buď na oboch stranách, alebo len na jednej strane", 5 | "Message bubbles": "Bubliny správ", 6 | "Normal priority": "Normálna priorita" 7 | } 8 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "Message bubbles": "Meddelandebubblor", 3 | "Normal priority": "Normal prioritet", 4 | "Message layout": "Meddelande layout", 5 | "Modern": "Modern", 6 | "Show people and rooms in a combined list": "Visa personer och rum i en kombinerad lista", 7 | "Update notifications": "Uppdatera meddelanden", 8 | "Don't ask again": "Fråga inte igen", 9 | "System": "System", 10 | "Add custom theme": "Lägg till anpassat tema", 11 | "Theme in use": "Tema i bruk", 12 | "Light theme": "Ljus tema", 13 | "Dark theme": "Mörkt tema", 14 | "Show message bubbles on one side only": "Visa meddelandebubblor bara på ena sidan", 15 | "Show message bubbles depending on the width either on both sides or only on one side": "Visa meddelandebubblor beroende på bredden antingen på båda sidor eller bara på ena sidan", 16 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Vill du gå med i ett rum som informerar dig om nya utgåvor? Detta är särskilt användbart om din plattform inte stöder automatiska uppdateringar för SchildiChat (t.ex.Windows och macOS).", 17 | "Uniform": "Enhetlig", 18 | "PowerLevel": "PowerLevel", 19 | "MXID": "MXID", 20 | "In group chats": "I gruppchattar", 21 | "In public rooms": "I offentliga rum", 22 | "Show all rooms in Home": "Visa alla rum i Home", 23 | "Show people in spaces": "Visa människor i Spaces", 24 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Om den är inaktiverad kan du fortfarande lägga till direktmeddelanden till personliga utrymmen. Om den är aktiverad ser du automatiskt alla som är medlem i Space.", 25 | "Show notification badges for People in Spaces": "Visa meddelandemärken för personer in Spaces", 26 | "Return to the room previously opened in a space": "Återgå till rummet som tidigare öppnats i ett Space", 27 | "If disabled, the space overview will be shown when switching to another space.": "Om den är inaktiverad visas utrymmeöversikten när du byter till ett annat utrymme.", 28 | "For people": "För folk", 29 | "User name color mode": "Användarnamns färgläge", 30 | "All rooms you're in will appear in Home.": "Alla rum du befinner dig i visas i Home.", 31 | "Show advanced theme settings": "Visa avancerade temainställningar", 32 | "Theme": "tema", 33 | "Room list": "Rumslista", 34 | "Font size and typeface": "Teckenstorlek och typsnitt", 35 | "Hide advanced theme settings": "Dölj avancerade temainställningar", 36 | "Compact: tiny avatar together with name and preview in one line": "Kompakt: liten avatar tillsammans med namn och förhandsvisning på en rad", 37 | "Intermediate: medium sized avatar with single-line preview": "Medel: medelstor avatar med enradig förhandsvisning", 38 | "Roomy: big avatar with two-line preview": "Rymlig: stor avatar med förhandsvisning med två rader", 39 | "Room list style": "Rumslista stil", 40 | "Mark as unread": "markera som oläst", 41 | "Mark as read": "markera som läst", 42 | "Mark rooms as unread": "Tillåt att chattar markeras som olästa", 43 | "Enable YouTube embed player": "Aktivera inbäddad YouTube-spelare", 44 | "Collapse additional buttons": "Dölj ytterligare knappar", 45 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Home är användbart för att få en överblick över allt. Tänk på att om du inaktiverar den kan du inte se vissa rum.", 46 | "Round": "Runda", 47 | "Extra round": "Extrarunda", 48 | "Mixed": "Blandad", 49 | "Corners": "Hörn", 50 | "Sound pack": "Ljudpaket", 51 | "Schildi: Softer sounds for reduced anxiety": "Schildi: Mjukare ljud för minskad ångest", 52 | "Classic: The same sharp sounds as Element": "Klassisk: Samma skarpa ljud som Element" 53 | } 54 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Show message bubbles on one side only": "Mesaj baloncuklarını yalnızca bir tarafta göster", 3 | "Show message bubbles depending on the width either on both sides or only on one side": "Genişliğe bağlı olarak mesaj baloncuklarını her iki tarafta veya sadece bir tarafta göster", 4 | "Message bubbles": "Mesaj baloncukları", 5 | "Normal priority": "Normal öncelik", 6 | "Message layout": "Mesaj düzeni", 7 | "Modern": "Modern", 8 | "Update notifications": "Güncelleme bildirimleri", 9 | "Don't ask again": "Bir daha sorma", 10 | "System": "Sistem", 11 | "Add custom theme": "Özel tema ekle", 12 | "Theme in use": "Tema kullanımda", 13 | "Light theme": "Açık tema", 14 | "Dark theme": "Koyu tema", 15 | "Uniform": "Düzenli", 16 | "For people": "İnsanlar için", 17 | "In group chats": "Grup sohbetlerinde", 18 | "In public rooms": "Halka açık odalarda", 19 | "Show people and rooms in a combined list": "Kişileri ve odaları birleşik bir listede göster", 20 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Yeni sürümler hakkında sizi bilgilendiren bir odaya katılmak ister misiniz? Bu oda özellikle platformunuz SchildiChat için otomatik güncellemeleri desteklemiyorsa (ör. Windows ve macOS) kullanışlıdır.", 21 | "If disabled, the space overview will be shown when switching to another space.": "Devre dışı bırakılırsa, başka bir alana geçerken alana ilişkin genel görünüm gösterilir.", 22 | "Mark as unread": "Okunmadı olarak işaretle", 23 | "User name color mode": "Kullanıcı adı renk modu", 24 | "Show people in spaces": "İnsanları alanlarda göster", 25 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Devre dışı bırakılmışsa, kişisel alanlara direkt mesajlar eklemeye devam edebilirsiniz. Etkinleştirilirse, alana üye olan herkesi otomatik olarak görürsünüz.", 26 | "Show notification badges for People in Spaces": "Alanlardaki Kişiler için bildirim rozetlerini göster", 27 | "Return to the room previously opened in a space": "Bir alanda daha önce açılmış olan odaya geri dön", 28 | "Compact: tiny avatar together with name and preview in one line": "Sıkıştırılmış: tek satırda isim ve önizleme ile birlikte küçük avatar", 29 | "Intermediate: medium sized avatar with single-line preview": "Orta: tek satır önizlemeli orta boy avatar", 30 | "Roomy: big avatar with two-line preview": "Ferah: iki satırlık önizleme ile büyük avatar", 31 | "Room list style": "Oda listesi tarzı", 32 | "Hide advanced theme settings": "Gelişmiş tema ayarlarını gizle", 33 | "Show all rooms in Home": "Ana sayfadaki tüm odaları göster", 34 | "All rooms you're in will appear in Home.": "Bulunduğunuz tüm odalar ana sayfada görünecektir.", 35 | "Show advanced theme settings": "Gelişmiş tema ayarlarını göster", 36 | "Theme": "Tema", 37 | "Font size and typeface": "Yazı tipi boyutu ve yazı karakteri", 38 | "Room list": "Oda sıralaması", 39 | "Mark rooms as unread": "Sohbetleri okunmamış olarak işaretlemeye izin ver", 40 | "Mark as read": "Okundu olarak işaretle", 41 | "Enable YouTube embed player": "YouTube gömülü oynatıcıyı etkinleştir", 42 | "Collapse additional buttons": "Ek düğmeleri daralt", 43 | "Corners": "Köşeler", 44 | "Round": "Yuvarlak", 45 | "Extra round": "Fazladan yuvarlak", 46 | "Mixed": "Karışık", 47 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Ana sayfa, her şeye genel bir bakış elde etmek için kullanışlıdır. Devre dışı bırakıldığında belirli odaları göremeyebileceğinizi unutmayın." 48 | } 49 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/vi.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/zh_Hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "Message bubbles": "消息气泡", 3 | "Normal priority": "正常优先级", 4 | "Message layout": "消息布局", 5 | "Modern": "现代", 6 | "Show people and rooms in a combined list": "使用组合列表显示所有人员和房间", 7 | "Update notifications": "更新通知", 8 | "Don't ask again": "不再询问", 9 | "System": "系统", 10 | "Add custom theme": "添加自定义主题", 11 | "Theme in use": "当前主题", 12 | "User name color mode": "用户名颜色模式", 13 | "Light theme": "浅色主题", 14 | "Dark theme": "深色主题", 15 | "Uniform": "单色", 16 | "In group chats": "群聊", 17 | "For people": "私聊", 18 | "All rooms you're in will appear in Home.": "你加入的所有聊天室都会显示在主页。", 19 | "In public rooms": "公共聊天室", 20 | "Show people in spaces": "显示空间中的人", 21 | "Show all rooms in Home": "在主页显示所有聊天室", 22 | "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "如果禁用,你仍可以将私聊添加至个人空间。若启用,你将自动看见空间中的每位成员。", 23 | "Show notification badges for People in Spaces": "为空间中的人显示通知标志", 24 | "PowerLevel": "根据权限等级自动设定", 25 | "MXID": "根据 Matrix ID 自动设定", 26 | "Return to the room previously opened in a space": "返回先前在空间中打开的聊天室", 27 | "If disabled, the space overview will be shown when switching to another space.": "如果禁用,切换到其他空间时将显示空间概览。", 28 | "Compact: tiny avatar together with name and preview in one line": "紧凑:在一行中包含小头像、用户名和消息预览", 29 | "Intermediate: medium sized avatar with single-line preview": "中等:中等大小头像,用户名与消息预览在头像旁以单行宽度分列", 30 | "Roomy: big avatar with two-line preview": "宽敞:大尺寸头像,用户名与消息预览在头像旁以双行宽度分列", 31 | "Hide advanced theme settings": "隐藏高级主题设置", 32 | "Show advanced theme settings": "显示高级主题设置", 33 | "Theme": "主题", 34 | "Room list": "聊天室列表", 35 | "Font size and typeface": "字号与字型", 36 | "Show message bubbles on one side only": "仅在一侧显示消息气泡", 37 | "Room list style": "聊天室列表样式", 38 | "Show message bubbles depending on the width either on both sides or only on one side": "根据窗口大小智能切换消息气泡的显示样式", 39 | "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "您想加入一个用来通知版本更新的房间吗?如果您的平台不支持自动更新 SchildiChat(例如 Windows 和 macOS),这将非常有用。", 40 | "Mark as read": "标记为已读", 41 | "Mark rooms as unread": "允许将聊天记录标记为未读", 42 | "Mark as unread": "标记为未读", 43 | "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "主页对于概览所有消息来说非常有用。请注意:禁用主页可能会让您无法看到某些房间。", 44 | "Enable YouTube embed player": "启用 YouTube 嵌入式播放器", 45 | "Collapse additional buttons": "折叠额外的按钮", 46 | "Round": "圆角", 47 | "React with \"%(reaction)s\"": "与 \"%(reaction)s\" 互动", 48 | "Schildi: Softer sounds for reduced anxiety": "Schildi: 舒缓音效以减少焦虑", 49 | "Mixed": "混合", 50 | "Extra round": "超圆角", 51 | "Sound pack": "音频包", 52 | "Classic: The same sharp sounds as Element": "Classic: 与 Element 相同的尖锐声音", 53 | "Corners": "边缘" 54 | } 55 | -------------------------------------------------------------------------------- /i18n-overlays/matrix-react-sdk/zh_Hant.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /local-pkgbuild-template/PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: su-ex 2 | # Maintainer: SpiritCroc 3 | # Contributor: David Mehren 4 | 5 | pkgname=---appName----git 6 | _pkgver=---version--- 7 | pkgver=${_pkgver//-/.} 8 | pkgrel=1 9 | pkgdesc="SchildiChat is a Matrix client based on Element with a more traditional instant messaging experience." 10 | arch=('x86_64') 11 | url="https://schildi.chat" 12 | license=('Apache') 13 | depends=() 14 | provides=('---appName---') 15 | conflicts=('---appName---') 16 | source=("---debName---" 17 | "---appName---.sh") 18 | sha256sums=('SKIP' 19 | 'SKIP') 20 | 21 | package() { 22 | msg2 "Extracting the data.tar.xz..." 23 | bsdtar -xf data.tar.xz -C "$pkgdir/" 24 | install -Dm755 "${srcdir}"/---appName---.sh "${pkgdir}"/usr/bin/---appName--- 25 | sed -i 's|^Exec=.*|Exec=/usr/bin/---appName--- %u|' "${pkgdir}"/usr/share/applications/---appName---.desktop 26 | } 27 | -------------------------------------------------------------------------------- /local-pkgbuild-template/schildichat-desktop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | exec "/opt/---productName---/---appName---" "$@" 4 | -------------------------------------------------------------------------------- /merge_helpers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "$SCHILDI_ROOT" ]; then 4 | SCHILDI_ROOT="$(dirname "$(realpath "$0")")" 5 | fi 6 | 7 | branch=${BRANCH:-"lite"} 8 | 9 | i18n_helper_path="$SCHILDI_ROOT/i18n-helper/index.js" 10 | i18n_path="src/i18n/strings" 11 | i18n_overlay_path="$SCHILDI_ROOT/i18n-overlays" 12 | 13 | yarn=yarnpkg 14 | 15 | add_upstream() { 16 | if git remote | grep -q upstream; then 17 | echo "Remote named upstream already exists, deleting..." 18 | git remote remove upstream 19 | fi 20 | local sc_remote="$(git remote -v|grep origin|grep fetch|sed 's|.*\t\(.*\) (fetch)|\1|;s|git@github.com:|https://github.com/|')" 21 | if echo "$sc_remote" | grep -q matrix-js-sdk; then 22 | # matrix.org repo 23 | local upstream_remote="$(echo "$sc_remote" | sed 's|SchildiChat|matrix-org|')" 24 | elif echo "$sc_remote" | grep -q "element\\|compound-web"; then 25 | # vector-im repo 26 | local upstream_remote="$(echo "$sc_remote" | sed 's|SchildiChat|element-hq|')" 27 | else 28 | echo "Don't know upstream repo for $sc_remote" 29 | return 1 30 | fi 31 | echo "Adding upstream $upstream_remote" 32 | git remote add upstream "$upstream_remote" 33 | git fetch upstream 34 | } 35 | 36 | forall_repos() { 37 | for repo in "matrix-js-sdk" "element-web" "element-desktop" "compound-web"; do 38 | pushd "$SCHILDI_ROOT/$repo" > /dev/null 39 | "$@" 40 | popd > /dev/null 41 | done 42 | } 43 | 44 | forelement_repos() { 45 | for repo in "element-web" "element-desktop"; do 46 | pushd "$SCHILDI_ROOT/$repo" > /dev/null 47 | "$@" 48 | popd > /dev/null 49 | done 50 | } 51 | 52 | for_main_repos() { 53 | for repo in "matrix-js-sdk" "element-web" "element-desktop"; do 54 | pushd "$SCHILDI_ROOT/$repo" > /dev/null 55 | "$@" 56 | popd > /dev/null 57 | done 58 | } 59 | 60 | ensure_yes() { 61 | read -e -p "$1 [y/N] " choice 62 | 63 | if [[ "$choice" != [Yy]* ]]; then 64 | exit 1 65 | fi 66 | } 67 | 68 | check_branch() { 69 | if [[ $(git branch --show-current) != "$1" ]]; then 70 | repo_name=$(basename `git rev-parse --show-toplevel`) 71 | ensure_yes "$repo_name not in branch $1. Continue?" 72 | fi 73 | } 74 | 75 | check_clean_git() { 76 | # Require clean git state 77 | uncommitted=`git status --porcelain` 78 | if [ ! -z "$uncommitted" ]; then 79 | echo "Uncommitted changes are present, please commit first!" 80 | exit 1 81 | fi 82 | } 83 | 84 | revert_i18n_changes() { 85 | local i18n_path="$1" 86 | local revision="$2" 87 | local skip_commit="$3" 88 | 89 | git checkout "$revision" -- "$i18n_path" 90 | 91 | if [[ "$skip_commit" != [Yy]* ]]; then 92 | git commit -m "Automatic i18n reversion" || true 93 | fi 94 | } 95 | 96 | apply_i18n_changes() { 97 | local i18n_path="$1" 98 | 99 | git add "$i18n_path" 100 | git commit -m "Automatic i18n adjustment" || true 101 | } 102 | 103 | automatic_i18n_reversion() { 104 | local skip_commit="$1" 105 | 106 | local current_upstream_tag 107 | get_current_upstream_tag 108 | 109 | local current_mxjssdk_tag 110 | get_current_mxsdk_tags 111 | 112 | pushd "$SCHILDI_ROOT/element-web" > /dev/null 113 | revert_i18n_changes "$i18n_path" "$current_upstream_tag" "$skip_commit" 114 | popd > /dev/null 115 | 116 | pushd "$SCHILDI_ROOT/element-desktop" > /dev/null 117 | revert_i18n_changes "$i18n_path" "$current_upstream_tag" "$skip_commit" 118 | popd > /dev/null 119 | } 120 | 121 | automatic_i18n_adjustment() { 122 | # element-web 123 | pushd "$SCHILDI_ROOT/element-web" > /dev/null 124 | $yarn i18n 125 | node "$i18n_helper_path" "$SCHILDI_ROOT/element-web/$i18n_path" "$i18n_overlay_path/element-web" 126 | apply_i18n_changes "$i18n_path" 127 | popd > /dev/null 128 | 129 | # element-desktop 130 | pushd "$SCHILDI_ROOT/element-desktop" > /dev/null 131 | $yarn i18n 132 | node "$i18n_helper_path" "$SCHILDI_ROOT/element-desktop/$i18n_path" "$i18n_overlay_path/element-desktop" 133 | apply_i18n_changes "$i18n_path" 134 | popd > /dev/null 135 | } 136 | 137 | get_current_versions() { 138 | local version=`cat "$SCHILDI_ROOT/element-web/package.json" | jq .version -r` 139 | if [[ "$version" =~ ([0-9\.]*)(-sc\.([0-9]+)(\.test.([0-9]+))?)? ]]; then 140 | upstream="${BASH_REMATCH[1]}" 141 | release="${BASH_REMATCH[3]}" 142 | test="${BASH_REMATCH[5]}" 143 | fi 144 | 145 | versions=("${upstream:-"0.0.1"}" "${release:-"0"}" "${test:-"0"}") 146 | } 147 | 148 | get_versions_string() { 149 | versions_string="${versions[0]}-sc.${versions[1]}" 150 | 151 | # both zero means the initial version after a merge 152 | if [[ ${versions[1]} -eq 0 || ${versions[2]} -gt 0 ]]; then 153 | versions_string+=".test.${versions[2]}" 154 | fi 155 | } 156 | 157 | write_version() { 158 | local file="$1" 159 | local versions_string 160 | get_versions_string 161 | 162 | new_content=`jq --arg version "$versions_string" '.version = $version' "$file"` 163 | echo "$new_content" > "$file" 164 | 165 | git add "$file" 166 | git commit -m "Update version to $versions_string" || true 167 | } 168 | 169 | bump_test_version() { 170 | local versions 171 | get_current_versions 172 | 173 | # increment test version 174 | versions[2]=$((versions[2] + 1)) 175 | 176 | forelement_repos write_version "package.json" 177 | } 178 | 179 | bump_release_version() { 180 | local versions 181 | get_current_versions 182 | 183 | # increment release version 184 | versions[1]=$((versions[1] + 1)) 185 | 186 | # set test version to 0 187 | versions[2]=0 188 | 189 | forelement_repos write_version "package.json" 190 | } 191 | 192 | revert_packagejson_changes() { 193 | local path="$1" 194 | local revision="$2" 195 | local skip_commit="$3" 196 | 197 | git checkout "$revision" -- "$path" 198 | 199 | if [[ "$skip_commit" != [Yy]* ]]; then 200 | git commit -m "Automatic package.json reversion" || true 201 | fi 202 | } 203 | 204 | apply_packagejson_overlay() { 205 | local orig_path="$1" 206 | local overlay_path="../overlay/$(basename "$PWD")/package.json" 207 | 208 | # see: https://stackoverflow.com/a/24904276 209 | new_content=`jq -s '.[0] * .[1]' "$orig_path" "$overlay_path" | sed 's| | |g'` 210 | 211 | echo "$new_content" > "$orig_path" 212 | git add "$orig_path" 213 | git commit -m "Automatic package.json adjustment" || true 214 | } 215 | 216 | automatic_packagejson_reversion() { 217 | local skip_commit="$1" 218 | 219 | local current_upstream_tag 220 | get_current_upstream_tag 221 | 222 | forelement_repos revert_packagejson_changes "package.json" "$current_upstream_tag" "$skip_commit" 223 | } 224 | 225 | automatic_packagejson_adjustment() { 226 | local versions 227 | get_current_versions 228 | 229 | forelement_repos apply_packagejson_overlay "package.json" 230 | forelement_repos write_version "package.json" 231 | } 232 | 233 | get_latest_upstream_tag() { 234 | pushd "$SCHILDI_ROOT/element-web" > /dev/null 235 | git fetch upstream 236 | latest_upstream_tag=`git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags | sed -nr 's|refs/tags/(v[0-9]+(\.[0-9]+(\.[0-9]+)?)?) .*|\1|p' | tail -n 1` 237 | popd > /dev/null 238 | } 239 | 240 | get_current_upstream_tag() { 241 | local versions 242 | get_current_versions 243 | current_upstream_tag="v${versions[0]}" 244 | } 245 | 246 | get_current_mxsdk_tags() { 247 | current_mxjssdk_tag="v$(cat "$SCHILDI_ROOT/element-web/package.json" | jq '.dependencies["matrix-js-sdk"]' -r)" 248 | } 249 | 250 | apply_patches() { 251 | local repo="$(realpath "$1")" 252 | local patch_dir="$SCHILDI_ROOT/patches/$(basename "$1")" 253 | if [ ! -d "$repo" ]; then 254 | echo "Unknown repo: $repo" 255 | return 1 256 | fi 257 | if [ ! -d "$patch_dir" ]; then 258 | echo "No patches found at $patch_dir" 259 | return 1 260 | fi 261 | pushd "$repo" 262 | for patch in "$patch_dir"/*; do 263 | echo "Applying $patch to $repo..." 264 | git am "$patch" || on_apply_patch_fail_try_original_commit "$patch" "$repo" 265 | done 266 | popd 267 | } 268 | 269 | on_apply_patch_fail_try_original_commit() { 270 | local patch="$1" 271 | local repo="$2" 272 | local orig_commit="$(head -n 1 "$patch"|sed 's|From ||;s| .*||')" 273 | echo "Applying $patch failed, trying with original commit $orig_commit..." 274 | git am --abort 275 | git cherry-pick "$orig_commit" || on_apply_patch_fail "$patch" "$repo" "$orig_commit" 276 | } 277 | 278 | on_apply_patch_fail() { 279 | local patch="$1" 280 | local repo="$2" 281 | local orig_commit="$3" 282 | echo "----------------------------------" 283 | echo "Applying patch failed, please commit manually!" 284 | echo "Patch: $patch" 285 | echo "Repo: $repo" 286 | echo "Original commit: $(head -n 1 "$patch"|sed 's|From ||;s| .*||')" 287 | echo "----------------------------------" 288 | read -p "Press enter after committing resolved conflicts: " 289 | } 290 | 291 | commit_if_dirty() { 292 | local message="$1" 293 | # see: https://devops.stackexchange.com/a/5443 294 | git add -A 295 | git diff-index --quiet HEAD || git commit -m "$message" 296 | } 297 | -------------------------------------------------------------------------------- /merge_upstream.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | 7 | # Update patches? 8 | if [ "$1" = "-u" ]; then 9 | keep_patches=0 10 | shift 11 | else 12 | keep_patches=1 13 | fi 14 | 15 | pushd "$mydir" > /dev/null 16 | 17 | source ./merge_helpers.sh 18 | 19 | # Persist current state 20 | if [ "$keep_patches" = 0 ]; then 21 | ./generate_patches.sh 22 | fi 23 | 24 | # Abandon all local submodule state 25 | forall_repos git reset --hard 26 | git submodule update -f --recursive 27 | 28 | # Fetch upstream 29 | forall_repos git fetch upstream 30 | 31 | # Check if specific version to merge passed 32 | if [ -z "$1" ]; then 33 | get_latest_upstream_tag 34 | else 35 | latest_upstream_tag="$1" 36 | fi 37 | 38 | sc_branch_name="sc_$latest_upstream_tag" 39 | 40 | forelement_repos git checkout "$latest_upstream_tag" -B "$sc_branch_name" 41 | 42 | get_current_mxsdk_tags 43 | 44 | pushd "matrix-js-sdk" > /dev/null 45 | git checkout "$current_mxjssdk_tag" -B "$sc_branch_name" 46 | popd > /dev/null 47 | 48 | # Refresh environment 49 | make clean 50 | make setup 51 | forall_repos commit_if_dirty "Automatic setup commit" 52 | 53 | ./apply_patches.sh 54 | 55 | compound_web_version=`cat element-web/package.json|grep compound-web|sed 's|.*: \"\(.*\)",|\1|;s|\^||'` 56 | echo "TODO: merge compound web at $compound_web_version" 57 | 58 | popd > /dev/null 59 | -------------------------------------------------------------------------------- /overlay/element-desktop/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "schildichat-desktop-alpha", 3 | "productName": "SchildiChatAlpha", 4 | "description": "A Matrix Client based on Element with some changes and tweaks", 5 | "author": "SchildiChat", 6 | "repository": { 7 | "url": "https://github.com/SchildiChat/schildichat-desktop" 8 | }, 9 | "homepage": "https://schildi.chat/" 10 | } 11 | -------------------------------------------------------------------------------- /overlay/element-web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "schildichat-web-alpha", 3 | "description": "A Matrix Client based on Element with some changes and tweaks", 4 | "author": "SchildiChat", 5 | "repository": { 6 | "url": "https://github.com/SchildiChat/schildichat-desktop" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /patches/element-desktop/0002-Add-back-schildi-fetch-package.ts-modifications.patch: -------------------------------------------------------------------------------- 1 | From fbe03ba5b46a8bce93936f4e9ec752797a39b4fe Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sat, 2 Dec 2023 12:57:26 +0100 4 | Subject: Add back schildi fetch-package.ts modifications 5 | 6 | --- 7 | scripts/fetch-package.ts | 14 ++++++++++---- 8 | 1 file changed, 10 insertions(+), 4 deletions(-) 9 | 10 | diff --git a/scripts/fetch-package.ts b/scripts/fetch-package.ts 11 | index 7282945..4be7ab0 100644 12 | --- a/scripts/fetch-package.ts 13 | +++ b/scripts/fetch-package.ts 14 | @@ -54,6 +54,7 @@ async function main(): Promise { 15 | let filename: string | undefined; 16 | let url: string | undefined; 17 | let setVersion = false; 18 | + const sc = true; 19 | 20 | while (process.argv.length > 2) { 21 | switch (process.argv[2]) { 22 | @@ -82,7 +83,9 @@ async function main(): Promise { 23 | process.argv.shift(); 24 | } 25 | 26 | - if (targetVersion === undefined) { 27 | + if (sc) { 28 | + // nothing 29 | + } else if (targetVersion === undefined) { 30 | targetVersion = "v" + riotDesktopPackageJson.version; 31 | } else if (targetVersion !== "develop") { 32 | setVersion = true; // version was specified 33 | @@ -92,7 +95,7 @@ async function main(): Promise { 34 | filename = "develop.tar.gz"; 35 | url = DEVELOP_TGZ_URL; 36 | verify = false; // develop builds aren't signed 37 | - } else if (targetVersion.includes("://")) { 38 | + } else if (targetVersion?.includes("://")) { 39 | filename = targetVersion.substring(targetVersion.lastIndexOf("/") + 1); 40 | url = targetVersion; 41 | verify = false; // manually verified 42 | @@ -146,12 +149,15 @@ async function main(): Promise { 43 | } 44 | 45 | let haveDeploy = false; 46 | - let expectedDeployDir = path.join(deployDir, path.basename(filename).replace(/\.tar\.gz/, "")); 47 | + let expectedDeployDir = sc ? "../element-web/webapp" : path.join(deployDir, path.basename(filename).replace(/\.tar\.gz/, "")); 48 | try { 49 | await fs.opendir(expectedDeployDir); 50 | console.log(expectedDeployDir + "already exists"); 51 | haveDeploy = true; 52 | - } catch {} 53 | + } catch (e) { 54 | + console.log("Not a valid webapp dir: " + expectedDeployDir, e); 55 | + return 1; 56 | + } 57 | 58 | if (!haveDeploy) { 59 | const outPath = path.join(pkgDir, filename); 60 | -- 61 | 2.49.0 62 | 63 | -------------------------------------------------------------------------------- /patches/element-web/0003-Don-t-welcome-to-Element.patch: -------------------------------------------------------------------------------- 1 | From 13ce4b9769c425a4e76867c6ff262ec82aada25e Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 27 Oct 2024 19:38:47 +0100 4 | Subject: Don't welcome to Element 5 | 6 | --- 7 | res/welcome.html | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/res/welcome.html b/res/welcome.html 11 | index ef2d43bd8f..5b71670f4f 100644 12 | --- a/res/welcome.html 13 | +++ b/res/welcome.html 14 | @@ -169,7 +169,7 @@ we don't have an account and should hide them. No account == no guest account ei 15 | 16 | 17 | 18 | -

_t("welcome_to_element")

19 | +

_t("Welcome to SchildiChat")

20 | 21 |

_t("powered_by_matrix_with_logo")

22 |
23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0004-Stronger-login-background-to-ensure-contrast-of-our-.patch: -------------------------------------------------------------------------------- 1 | From 553a577bb18aef6fd23e23189e6399b3be6f1e49 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 27 Oct 2024 19:55:30 +0100 4 | Subject: Stronger login background to ensure contrast of our icon with our bg 5 | 6 | --- 7 | src/components/views/auth/AuthPage.tsx | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/components/views/auth/AuthPage.tsx b/src/components/views/auth/AuthPage.tsx 11 | index 3c7fe2503e..64163e837c 100644 12 | --- a/src/components/views/auth/AuthPage.tsx 13 | +++ b/src/components/views/auth/AuthPage.tsx 14 | @@ -58,7 +58,7 @@ export default class AuthPage extends React.PureComponent 3 | Date: Sun, 27 Oct 2024 20:07:30 +0100 4 | Subject: Schildify login footer 5 | 6 | --- 7 | src/components/views/auth/AuthFooter.tsx | 4 ++++ 8 | 1 file changed, 4 insertions(+) 9 | 10 | diff --git a/src/components/views/auth/AuthFooter.tsx b/src/components/views/auth/AuthFooter.tsx 11 | index 1942bf0431..1054d06f89 100644 12 | --- a/src/components/views/auth/AuthFooter.tsx 13 | +++ b/src/components/views/auth/AuthFooter.tsx 14 | @@ -15,9 +15,13 @@ import { _t } from "../../../languageHandler"; 15 | const AuthFooter = (): ReactElement => { 16 | const brandingConfig = SdkConfig.getObject("branding"); 17 | const links = brandingConfig?.get("auth_footer_links") ?? [ 18 | + /* 19 | { text: "Blog", url: "https://element.io/blog" }, 20 | { text: "Mastodon", url: "https://mastodon.matrix.org/@Element" }, 21 | { text: "GitHub", url: "https://github.com/element-hq/element-web" }, 22 | + */ 23 | + { text: "About", url: "https://schildi.chat" }, 24 | + { text: "GitHub", url: "https://github.com/schildichat/schildichat-desktop" }, 25 | ]; 26 | 27 | const authFooterLinks: JSX.Element[] = []; 28 | -- 29 | 2.49.0 30 | 31 | -------------------------------------------------------------------------------- /patches/element-web/0006-Disable-sticky-rooms.patch: -------------------------------------------------------------------------------- 1 | From beb53797528a9539658ffa55665048e2fb055fe9 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Tue, 18 Jan 2022 13:28:22 +0100 4 | Subject: Disable sticky rooms 5 | 6 | --- 7 | src/stores/room-list/algorithms/Algorithm.ts | 6 ++++-- 8 | 1 file changed, 4 insertions(+), 2 deletions(-) 9 | 10 | diff --git a/src/stores/room-list/algorithms/Algorithm.ts b/src/stores/room-list/algorithms/Algorithm.ts 11 | index 5419a6e47c..25d6b78fde 100644 12 | --- a/src/stores/room-list/algorithms/Algorithm.ts 13 | +++ b/src/stores/room-list/algorithms/Algorithm.ts 14 | @@ -159,8 +159,10 @@ export class Algorithm extends EventEmitter { 15 | this.recalculateActiveCallRooms(tagId); 16 | } 17 | 18 | - private updateStickyRoom(val: Room | null): void { 19 | - this.doUpdateStickyRoom(val); 20 | + private updateStickyRoom(val: Room) { 21 | + // Schildi: we don't want it sticky 22 | + this.doUpdateStickyRoom(null); 23 | + //this.doUpdateStickyRoom(val); 24 | this._lastStickyRoom = null; // clear to indicate we're done changing 25 | } 26 | 27 | -- 28 | 2.49.0 29 | 30 | -------------------------------------------------------------------------------- /patches/element-web/0007-Bring-back-unified-room-list.patch: -------------------------------------------------------------------------------- 1 | From 9d2fea504ab94b248930193dfe08dd66e3d95b59 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 5 May 2024 10:12:17 +0200 4 | Subject: Bring back unified room list 5 | 6 | Remaining TODO: 7 | - Hook up setting to UI again (better with own SC-specific screen?) 8 | 9 | Co-authored-by: su-ex 10 | --- 11 | src/components/views/rooms/LegacyRoomList.tsx | 39 ++++++++++++++++++- 12 | src/settings/Settings.tsx | 8 ++++ 13 | src/stores/room-list/RoomListStore.ts | 19 ++++++++- 14 | src/stores/room-list/algorithms/Algorithm.ts | 20 ++++++++-- 15 | src/stores/room-list/models.ts | 2 + 16 | 5 files changed, 83 insertions(+), 5 deletions(-) 17 | 18 | diff --git a/src/components/views/rooms/LegacyRoomList.tsx b/src/components/views/rooms/LegacyRoomList.tsx 19 | index 6be226a172..dbb69d8f62 100644 20 | --- a/src/components/views/rooms/LegacyRoomList.tsx 21 | +++ b/src/components/views/rooms/LegacyRoomList.tsx 22 | @@ -83,11 +83,13 @@ interface IState { 23 | sublists: ITagMap; 24 | currentRoomId?: string; 25 | suggestedRooms: ISuggestedRoom[]; 26 | + unifiedRoomList: boolean; 27 | } 28 | 29 | export const TAG_ORDER: TagID[] = [ 30 | DefaultTagID.Invite, 31 | DefaultTagID.Favourite, 32 | + DefaultTagID.Unified, 33 | DefaultTagID.DM, 34 | DefaultTagID.Untagged, 35 | DefaultTagID.Conference, 36 | @@ -100,6 +102,7 @@ export const TAG_ORDER: TagID[] = [ 37 | // but we'd have to make sure that rooms you weren't in were hidden. 38 | ]; 39 | const ALWAYS_VISIBLE_TAGS: TagID[] = [DefaultTagID.DM, DefaultTagID.Untagged]; 40 | +const ALWAYS_VISIBLE_UNIFIED_TAGS: TagID[] = [DefaultTagID.Unified]; 41 | 42 | interface ITagAesthetics { 43 | sectionLabel: TranslationKey; 44 | @@ -377,6 +380,17 @@ const UntaggedAuxButton: React.FC = ({ tabIndex }) => { 45 | return null; 46 | }; 47 | 48 | +const UnifiedAuxButton: React.FC = (iAuxButtonProps: IAuxButtonProps) => { 49 | + return ( 50 | + <> 51 | + {/* eslint-disable-next-line new-cap */} 52 | + {DmAuxButton(iAuxButtonProps)} 53 | + {/* eslint-disable-next-line new-cap */} 54 | + {UntaggedAuxButton(iAuxButtonProps)} 55 | + 56 | + ); 57 | +}; 58 | + 59 | const TAG_AESTHETICS: TagAestheticsMap = { 60 | [DefaultTagID.Invite]: { 61 | sectionLabel: _td("action|invites_list"), 62 | @@ -394,6 +408,12 @@ const TAG_AESTHETICS: TagAestheticsMap = { 63 | defaultHidden: false, 64 | AuxButtonComponent: DmAuxButton, 65 | }, 66 | + [DefaultTagID.Unified]: { 67 | + sectionLabel: _td("Normal priority"), 68 | + isInvite: false, 69 | + defaultHidden: false, 70 | + AuxButtonComponent: UnifiedAuxButton, 71 | + }, 72 | [DefaultTagID.Conference]: { 73 | sectionLabel: _td("voip|metaspace_video_rooms|conference_room_section"), 74 | isInvite: false, 75 | @@ -432,6 +452,7 @@ const TAG_AESTHETICS: TagAestheticsMap = { 76 | 77 | export default class LegacyRoomList extends React.PureComponent { 78 | private dispatcherRef?: string; 79 | + private readonly unifiedRoomListWatcherRef: string; 80 | private treeRef = createRef(); 81 | 82 | public static contextType = MatrixClientContext; 83 | @@ -443,7 +464,14 @@ export default class LegacyRoomList extends React.PureComponent 84 | this.state = { 85 | sublists: {}, 86 | suggestedRooms: SpaceStore.instance.suggestedRooms, 87 | + unifiedRoomList: SettingsStore.getValue("unifiedRoomList"), 88 | }; 89 | + 90 | + this.unifiedRoomListWatcherRef = SettingsStore.watchSetting( 91 | + "unifiedRoomList", 92 | + null, 93 | + this.onUnifiedRoomListChange, 94 | + ); 95 | } 96 | 97 | public componentDidMount(): void { 98 | @@ -459,6 +487,7 @@ export default class LegacyRoomList extends React.PureComponent 99 | SpaceStore.instance.off(UPDATE_SUGGESTED_ROOMS, this.updateSuggestedRooms); 100 | RoomListStore.instance.off(LISTS_UPDATE_EVENT, this.updateLists); 101 | defaultDispatcher.unregister(this.dispatcherRef); 102 | + SettingsStore.unwatchSetting(this.unifiedRoomListWatcherRef); 103 | SdkContextClass.instance.roomViewStore.off(UPDATE_EVENT, this.onRoomViewStoreUpdate); 104 | LegacyCallHandler.instance.off(LegacyCallHandlerEvent.ProtocolSupport, this.updateProtocolSupport); 105 | } 106 | @@ -467,6 +496,12 @@ export default class LegacyRoomList extends React.PureComponent 107 | this.updateLists(); 108 | }; 109 | 110 | + private onUnifiedRoomListChange = (): void => { 111 | + this.setState({ 112 | + unifiedRoomList: SettingsStore.getValue("unifiedRoomList"), 113 | + }); 114 | + }; 115 | + 116 | private onRoomViewStoreUpdate = (): void => { 117 | this.setState({ 118 | currentRoomId: SdkContextClass.instance.roomViewStore.getRoomId() ?? undefined, 119 | @@ -605,7 +640,9 @@ export default class LegacyRoomList extends React.PureComponent 120 | const aesthetics = TAG_AESTHETICS[orderedTagId]; 121 | if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`); 122 | 123 | - let alwaysVisible = ALWAYS_VISIBLE_TAGS.includes(orderedTagId); 124 | + let alwaysVisible = ( 125 | + this.state.unifiedRoomList ? ALWAYS_VISIBLE_UNIFIED_TAGS : ALWAYS_VISIBLE_TAGS 126 | + ).includes(orderedTagId); 127 | if ( 128 | (this.props.activeSpace === MetaSpace.Favourites && orderedTagId !== DefaultTagID.Favourite) || 129 | (this.props.activeSpace === MetaSpace.People && orderedTagId !== DefaultTagID.DM) || 130 | diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx 131 | index 36030713ec..ac88f717d4 100644 132 | --- a/src/settings/Settings.tsx 133 | +++ b/src/settings/Settings.tsx 134 | @@ -359,6 +359,14 @@ export type BooleanSettingKey = Assignable> | Fe 135 | export type StringSettingKey = Assignable>; 136 | 137 | export const SETTINGS: Settings = { 138 | + // SC settings start 139 | + "unifiedRoomList": { 140 | + supportedLevels: LEVELS_ACCOUNT_SETTINGS, 141 | + displayName: _td("Show people and rooms in a combined list"), 142 | + default: true, 143 | + controller: new ReloadOnChangeController(), 144 | + }, 145 | + // SC settings end 146 | "feature_video_rooms": { 147 | isFeature: true, 148 | labsGroup: LabGroup.VoiceAndVideo, 149 | diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts 150 | index 2fc396b8b3..0739857b0b 100644 151 | --- a/src/stores/room-list/RoomListStore.ts 152 | +++ b/src/stores/room-list/RoomListStore.ts 153 | @@ -494,6 +494,9 @@ export class RoomListStoreClass extends AsyncStoreWithClient implem 154 | this.setAndPersistListOrder(tag, listOrder); 155 | } 156 | } 157 | + 158 | + // SC: Unified list for DMs and groups 159 | + this.algorithm.setUnifiedRoomList(SettingsStore.getValue("unifiedRoomList")); 160 | } 161 | 162 | private onAlgorithmListUpdated = (forceUpdate: boolean): void => { 163 | @@ -607,7 +610,21 @@ export class RoomListStoreClass extends AsyncStoreWithClient implem 164 | */ 165 | public getTagsForRoom(room: Room): TagID[] { 166 | const algorithmTags = this.algorithm.getTagsForRoom(room); 167 | - if (!algorithmTags) return [DefaultTagID.Untagged]; 168 | + if (!algorithmTags) { 169 | + if (SettingsStore.getValue("unifiedRoomList")) { 170 | + return [DefaultTagID.Unified]; 171 | + } else { 172 | + return [DefaultTagID.Untagged]; 173 | + } 174 | + } 175 | + const dmTagIndex = algorithmTags.indexOf(DefaultTagID.DM); 176 | + if (dmTagIndex !== -1) { 177 | + algorithmTags[dmTagIndex] = DefaultTagID.Unified; 178 | + } 179 | + const untaggedTagIndex = algorithmTags.indexOf(DefaultTagID.Untagged); 180 | + if (untaggedTagIndex !== -1) { 181 | + algorithmTags[untaggedTagIndex] = DefaultTagID.Unified; 182 | + } 183 | return algorithmTags; 184 | } 185 | 186 | diff --git a/src/stores/room-list/algorithms/Algorithm.ts b/src/stores/room-list/algorithms/Algorithm.ts 187 | index 25d6b78fde..f3fc3899d0 100644 188 | --- a/src/stores/room-list/algorithms/Algorithm.ts 189 | +++ b/src/stores/room-list/algorithms/Algorithm.ts 190 | @@ -75,6 +75,7 @@ export class Algorithm extends EventEmitter { 191 | * Set to true to suspend emissions of algorithm updates. 192 | */ 193 | public updatesInhibited = false; 194 | + private unifiedRoomList: boolean = true; 195 | 196 | public start(): void { 197 | CallStore.instance.on(CallStoreEvent.ConnectedCalls, this.onConnectedCalls); 198 | @@ -106,6 +107,10 @@ export class Algorithm extends EventEmitter { 199 | return this._cachedRooms; 200 | } 201 | 202 | + public setUnifiedRoomList(unifiedRoomList: boolean): void { 203 | + this.unifiedRoomList = unifiedRoomList; 204 | + } 205 | + 206 | /** 207 | * Awaitable version of the sticky room setter. 208 | * @param val The new room to sticky. 209 | @@ -513,7 +518,10 @@ export class Algorithm extends EventEmitter { 210 | } 211 | 212 | if (!inTag) { 213 | - if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) { 214 | + if (this.unifiedRoomList) { 215 | + // SC: Unified room list for DMs and groups 216 | + newTags[DefaultTagID.Unified].push(room); 217 | + } else if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) { 218 | newTags[DefaultTagID.DM].push(room); 219 | } else { 220 | newTags[DefaultTagID.Untagged].push(room); 221 | @@ -557,7 +565,13 @@ export class Algorithm extends EventEmitter { 222 | tags.push(...this.getTagsOfJoinedRoom(room)); 223 | } 224 | 225 | - if (!tags.length) tags.push(DefaultTagID.Untagged); 226 | + if (!tags.length) { 227 | + if (this.unifiedRoomList) { 228 | + tags.push(DefaultTagID.Unified); 229 | + } else { 230 | + tags.push(DefaultTagID.Untagged); 231 | + } 232 | + } 233 | 234 | return tags; 235 | } 236 | @@ -567,7 +581,7 @@ export class Algorithm extends EventEmitter { 237 | 238 | if (tags.length === 0) { 239 | // Check to see if it's a DM if it isn't anything else 240 | - if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) { 241 | + if (DMRoomMap.shared().getUserIdForRoomId(room.roomId) && !this.unifiedRoomList) { 242 | tags = [DefaultTagID.DM]; 243 | } 244 | } 245 | diff --git a/src/stores/room-list/models.ts b/src/stores/room-list/models.ts 246 | index 78823cbc42..00883e2ad6 100644 247 | --- a/src/stores/room-list/models.ts 248 | +++ b/src/stores/room-list/models.ts 249 | @@ -13,6 +13,7 @@ export enum DefaultTagID { 250 | LowPriority = "m.lowpriority", 251 | Favourite = "m.favourite", 252 | DM = "im.vector.fake.direct", 253 | + Unified = "chat.schildi.fake.unified", 254 | Conference = "im.vector.fake.conferences", 255 | ServerNotice = "m.server_notice", 256 | Suggested = "im.vector.fake.suggested", 257 | @@ -21,6 +22,7 @@ export enum DefaultTagID { 258 | export const OrderedDefaultTagIDs = [ 259 | DefaultTagID.Invite, 260 | DefaultTagID.Favourite, 261 | + DefaultTagID.Unified, 262 | DefaultTagID.DM, 263 | DefaultTagID.Conference, 264 | DefaultTagID.Untagged, 265 | -- 266 | 2.49.0 267 | 268 | -------------------------------------------------------------------------------- /patches/element-web/0008-Don-t-sort-muted-rooms-to-bottom-I-still-want-to-see.patch: -------------------------------------------------------------------------------- 1 | From 96ffbb0a509f1916637245c761f9dfa2dbe8b4a2 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 17 Dec 2023 11:11:58 +0100 4 | Subject: Don't sort muted rooms to bottom, I still want to see them. 5 | 6 | --- 7 | .../room-list/algorithms/list-ordering/OrderingAlgorithm.ts | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts b/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts 11 | index 0f95fe78c2..2de554c357 100644 12 | --- a/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts 13 | +++ b/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts 14 | @@ -38,7 +38,7 @@ export abstract class OrderingAlgorithm { 15 | } 16 | 17 | public get isMutedToBottom(): boolean { 18 | - return this.sortingAlgorithm === SortAlgorithm.Recent; 19 | + return this.sortingAlgorithm === SortAlgorithm.Recent && false; 20 | } 21 | 22 | /** 23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0009-Don-t-preview-reactions.patch: -------------------------------------------------------------------------------- 1 | From e8ab76d04fbad97adc20e0678acab24ef79340d5 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Thu, 14 Dec 2023 10:32:10 +0100 4 | Subject: Don't preview reactions 5 | 6 | --- 7 | src/stores/room-list/MessagePreviewStore.ts | 2 ++ 8 | 1 file changed, 2 insertions(+) 9 | 10 | diff --git a/src/stores/room-list/MessagePreviewStore.ts b/src/stores/room-list/MessagePreviewStore.ts 11 | index 51e413940d..7775d1e52a 100644 12 | --- a/src/stores/room-list/MessagePreviewStore.ts 13 | +++ b/src/stores/room-list/MessagePreviewStore.ts 14 | @@ -63,10 +63,12 @@ const PREVIEWS: Record< 15 | isState: false, 16 | previewer: new StickerEventPreview(), 17 | }, 18 | + /* 19 | "m.reaction": { 20 | isState: false, 21 | previewer: new ReactionEventPreview(), 22 | }, 23 | + */ 24 | [M_POLL_START.name]: { 25 | isState: false, 26 | previewer: new PollStartEventPreview(), 27 | -- 28 | 2.49.0 29 | 30 | -------------------------------------------------------------------------------- /patches/element-web/0010-Hide-the-mute-notification-state-the-same-way-as-the.patch: -------------------------------------------------------------------------------- 1 | From 44c5f7c1d38c93987ffaa4bdd3be575f5103627d Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Wed, 17 Nov 2021 12:50:25 +0100 4 | Subject: Hide the "mute" notification state the same way as the other states 5 | 6 | This can get in the way of the "marked as unread" icon otherwise. 7 | Furthermore, I didn't really like it showing there persistently either 8 | way. 9 | --- 10 | src/components/views/rooms/RoomTile.tsx | 4 +++- 11 | 1 file changed, 3 insertions(+), 1 deletion(-) 12 | 13 | diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx 14 | index 3eafb671cb..c9dcd00fd0 100644 15 | --- a/src/components/views/rooms/RoomTile.tsx 16 | +++ b/src/components/views/rooms/RoomTile.tsx 17 | @@ -300,7 +300,9 @@ class RoomTile extends React.PureComponent { 18 | 19 | // Only show the icon by default if the room is overridden to muted. 20 | // TODO: [FTUE Notifications] Probably need to detect global mute state 21 | - mx_RoomTile_notificationsButton_show: state === RoomNotifState.Mute, 22 | + //mx_RoomTile_notificationsButton_show: state === RoomNotifState.Mute, 23 | + // SchildiChat: never show the icon by default. This gets in the way of the "marked as unread" icon. 24 | + mx_RoomTile_notificationsButton_show: false, 25 | }); 26 | 27 | return ( 28 | -- 29 | 2.49.0 30 | 31 | -------------------------------------------------------------------------------- /patches/element-web/0011-Allow-muted-rooms-to-render-as-unread.patch: -------------------------------------------------------------------------------- 1 | From e92a08cfdf9d518c2f5a23b5cfdc67a0faa4dfdd Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Fri, 10 May 2024 18:58:32 +0200 4 | Subject: Allow muted rooms to render as unread 5 | 6 | --- 7 | src/RoomNotifs.ts | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/RoomNotifs.ts b/src/RoomNotifs.ts 11 | index d5254d523d..9cb1e24d1d 100644 12 | --- a/src/RoomNotifs.ts 13 | +++ b/src/RoomNotifs.ts 14 | @@ -255,7 +255,7 @@ export function determineUnreadState( 15 | return { symbol: "!", count: 1, level: NotificationLevel.Highlight, invited: false }; 16 | } 17 | 18 | - if (getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) { 19 | + if (false && getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) { 20 | return { symbol: null, count: 0, level: NotificationLevel.None, invited: false }; 21 | } 22 | 23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0012-Increase-default-visible-tiles.patch: -------------------------------------------------------------------------------- 1 | From 520670ce0c83b74a28a1992a3a184832ce89dda0 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 30 Aug 2020 15:33:01 +0200 4 | Subject: Increase default visible tiles 5 | 6 | --- 7 | src/stores/room-list/ListLayout.ts | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/stores/room-list/ListLayout.ts b/src/stores/room-list/ListLayout.ts 11 | index a4468dfffe..a4ae9bbc1d 100644 12 | --- a/src/stores/room-list/ListLayout.ts 13 | +++ b/src/stores/room-list/ListLayout.ts 14 | @@ -74,7 +74,7 @@ export class ListLayout { 15 | 16 | public get defaultVisibleTiles(): number { 17 | // This number is what "feels right", and mostly subject to design's opinion. 18 | - return 8; 19 | + return 50; 20 | } 21 | 22 | public tilesWithPadding(n: number, paddingPx: number): number { 23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0013-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch: -------------------------------------------------------------------------------- 1 | From 7e65c9ffe978d6e35ad300322f03a2b9fb90bdc8 Mon Sep 17 00:00:00 2001 2 | From: su-ex 3 | Date: Sun, 26 May 2024 10:43:36 +0200 4 | Subject: Bring back showSpaceDMBadges setting, force-enabled for now 5 | 6 | TODO settings UI 7 | 8 | Co-authored-by: SpiritCroc 9 | --- 10 | src/settings/Settings.tsx | 5 +++++ 11 | src/stores/spaces/SpaceStore.ts | 25 +++++++++++++++++++++++++ 12 | 2 files changed, 30 insertions(+) 13 | 14 | diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx 15 | index ac88f717d4..7295b716b8 100644 16 | --- a/src/settings/Settings.tsx 17 | +++ b/src/settings/Settings.tsx 18 | @@ -366,6 +366,11 @@ export const SETTINGS: Settings = { 19 | default: true, 20 | controller: new ReloadOnChangeController(), 21 | }, 22 | + "Spaces.showSpaceDMBadges": { 23 | + displayName: _td("Show notification badges for People in Spaces"), 24 | + supportedLevels: LEVELS_ACCOUNT_SETTINGS, 25 | + default: true, 26 | + }, 27 | // SC settings end 28 | "feature_video_rooms": { 29 | isFeature: true, 30 | diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts 31 | index 015c9fa0fd..c5c34c4e14 100644 32 | --- a/src/stores/spaces/SpaceStore.ts 33 | +++ b/src/stores/spaces/SpaceStore.ts 34 | @@ -154,9 +154,17 @@ export class SpaceStoreClass extends AsyncStoreWithClient { 35 | private _msc3946ProcessDynamicPredecessor: boolean = SettingsStore.getValue("feature_dynamic_room_predecessors"); 36 | private _storeReadyDeferred = Promise.withResolvers(); 37 | 38 | + // SC start 39 | + private _showSpaceDMBadges = true; 40 | + // SC end 41 | + 42 | public constructor() { 43 | super(defaultDispatcher, {}); 44 | 45 | + // SC start 46 | + SettingsStore.monitorSetting("Spaces.showSpaceDMBadges", null); 47 | + // SC end 48 | + 49 | SettingsStore.monitorSetting("Spaces.allRoomsInHome", null); 50 | SettingsStore.monitorSetting("Spaces.enabledMetaSpaces", null); 51 | SettingsStore.monitorSetting("Spaces.showPeopleInSpace", null); 52 | @@ -214,6 +222,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient { 53 | return this._allRoomsInHome; 54 | } 55 | 56 | + public get showSpaceDMBadges(): boolean { // SC 57 | + return this._showSpaceDMBadges; 58 | + } 59 | + 60 | public setActiveRoomInSpace(space: SpaceKey): void { 61 | if (!isMetaSpace(space) && !this.matrixClient?.getRoom(space)?.isSpaceRoom()) return; 62 | if (space !== this.activeSpace) this.setActiveSpace(space, false); 63 | @@ -734,6 +746,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient { 64 | 65 | if (room.isSpaceRoom() || !flattenedRoomsForSpace.has(room.roomId)) return false; 66 | 67 | + if (this.showSpaceDMBadges) { // SC 68 | + return true; 69 | + } 70 | + 71 | if (dmBadgeSpace && DMRoomMap.shared().getUserIdForRoomId(room.roomId)) { 72 | return s === dmBadgeSpace; 73 | } 74 | @@ -1311,6 +1327,15 @@ export class SpaceStoreClass extends AsyncStoreWithClient { 75 | break; 76 | } 77 | 78 | + case "Spaces.showSpaceDMBadges": { // SC 79 | + const newValue = SettingsStore.getValue("Spaces.showSpaceDMBadges"); 80 | + if (this.showSpaceDMBadges !== newValue) { 81 | + this._showSpaceDMBadges = newValue; 82 | + this.rebuildSpaceHierarchy(); // rebuild everything 83 | + } 84 | + break; 85 | + } 86 | + 87 | case "Spaces.enabledMetaSpaces": { 88 | const newValue = SettingsStore.getValue("Spaces.enabledMetaSpaces"); 89 | const enabledMetaSpaces = this.metaSpaceOrder.filter((k) => newValue[k]); 90 | -- 91 | 2.49.0 92 | 93 | -------------------------------------------------------------------------------- /patches/element-web/0014-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch: -------------------------------------------------------------------------------- 1 | From 950bcc4a75cf69739772982994d298b1f0ed19d9 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Wed, 29 May 2024 19:32:42 +0200 4 | Subject: Squashed: Freeform reactions from tadzik/freeform-reactions-upstream 5 | MIME-Version: 1.0 6 | Content-Type: text/plain; charset=UTF-8 7 | Content-Transfer-Encoding: 8bit 8 | 9 | commit 9eea56b0080db3720efa49b457707bcde3be6474 10 | Merge: 06f81c9662 8570f16e31 11 | Author: Tadeusz Sośnierz 12 | Date: Tue Jun 20 09:57:19 2023 +0200 13 | 14 | Merge branch 'develop' into tadzik/freeform-reactions-upstream 15 | 16 | commit 06f81c9662fbe033b4eac859d7e14e0ab24a6e91 17 | Merge: ad4fef85b1 0d6a550c33 18 | Author: Michael Telatynski <7t3chguy@gmail.com> 19 | Date: Wed Aug 31 09:06:49 2022 +0100 20 | 21 | Merge branch 'develop' into tadzik/freeform-reactions 22 | 23 | commit ad4fef85b160087b8017b9ae9cf9aebfd5348f41 24 | Merge: 689b57c0b9 5aae974e93 25 | Author: Tadeusz Sośnierz 26 | Date: Sun Aug 28 10:11:48 2022 +0200 27 | 28 | Merge branch 'develop' into tadzik/freeform-reactions 29 | 30 | commit 689b57c0b91e12907a8dbc3fac3ed10302a11e4a 31 | Author: Tadeusz Sośnierz 32 | Date: Fri May 20 10:35:06 2022 +0200 33 | 34 | Fix conflict resolution fail in EmojiPicker 35 | 36 | commit 70a8e212b748584949b37bc99b72acffce2fd148 37 | Merge: 215df55f13 a0cdc93642 38 | Author: Tadeusz Sośnierz 39 | Date: Fri May 20 10:25:17 2022 +0200 40 | 41 | Merge branch 'develop' into tadzik/freeform-reactions-upstream 42 | 43 | commit 215df55f13162bdc8eb13da5219763c56f560dd0 44 | Author: Tadeusz Sośnierz 45 | Date: Tue Aug 17 16:30:06 2021 +0200 46 | 47 | Disable freeform emoji reactions in the message composer 48 | 49 | commit 6bb8263007e077d22929fcc1fb439d94a4f15c6f 50 | Author: Tadeusz Sośnierz 51 | Date: Tue Aug 17 12:12:28 2021 +0200 52 | 53 | Add more typing to EmojiPicker 54 | 55 | commit b2a1728318a8a5496345797995c1ec09ae3f88e6 56 | Author: Tadeusz Sośnierz 57 | Date: Tue Aug 17 11:52:35 2021 +0200 58 | 59 | Make free-form reaction button translatable 60 | 61 | commit f4adaf00b805baba454fbceb41cc5c081ec886a7 62 | Author: Tadeusz Sośnierz 63 | Date: Tue Aug 17 11:29:22 2021 +0200 64 | 65 | Allow sending free-form reactions 66 | 67 | Signed-off-by: Tadeusz Sośnierz 68 | --- 69 | src/components/views/emojipicker/EmojiPicker.tsx | 16 ++++++++++++++++ 70 | .../views/emojipicker/ReactionPicker.tsx | 1 + 71 | 2 files changed, 17 insertions(+) 72 | 73 | diff --git a/src/components/views/emojipicker/EmojiPicker.tsx b/src/components/views/emojipicker/EmojiPicker.tsx 74 | index 71659d579b..4acbfd1fcb 100644 75 | --- a/src/components/views/emojipicker/EmojiPicker.tsx 76 | +++ b/src/components/views/emojipicker/EmojiPicker.tsx 77 | @@ -29,6 +29,8 @@ import { Key } from "../../../Keyboard"; 78 | import { clamp } from "../../../utils/numbers"; 79 | import { type ButtonEvent } from "../elements/AccessibleButton"; 80 | 81 | +import AccessibleButton from '../elements/AccessibleButton'; 82 | + 83 | export const CATEGORY_HEADER_HEIGHT = 20; 84 | export const EMOJI_HEIGHT = 35; 85 | export const EMOJIS_PER_ROW = 8; 86 | @@ -36,6 +38,7 @@ export const EMOJIS_PER_ROW = 8; 87 | const ZERO_WIDTH_JOINER = "\u200D"; 88 | 89 | interface IProps { 90 | + allowUnlisted?: boolean; 91 | selectedEmojis?: Set; 92 | onChoose(unicode: string): boolean; 93 | onFinished(): void; 94 | @@ -337,6 +340,10 @@ class EmojiPicker extends React.Component { 95 | } 96 | }; 97 | 98 | + private reactWith = (reaction: string): void => { 99 | + this.props.onChoose(reaction); 100 | + }; 101 | + 102 | private static categoryHeightForEmojiCount(count: number): number { 103 | if (count === 0) { 104 | return 0; 105 | @@ -392,6 +399,15 @@ class EmojiPicker extends React.Component { 106 | return categoryElement; 107 | })} 108 | 109 | + { 110 | + (this.props.allowUnlisted && this.state.filter) && 111 | + this.reactWith(this.state.filter)} 114 | + > 115 | + { _t('React with "%(reaction)s"', { reaction: this.state.filter }) } 116 | + 117 | + } 118 | {this.state.previewEmoji ? ( 119 | 120 | ) : ( 121 | diff --git a/src/components/views/emojipicker/ReactionPicker.tsx b/src/components/views/emojipicker/ReactionPicker.tsx 122 | index 11b3d9468a..7d369945fe 100644 123 | --- a/src/components/views/emojipicker/ReactionPicker.tsx 124 | +++ b/src/components/views/emojipicker/ReactionPicker.tsx 125 | @@ -126,6 +126,7 @@ class ReactionPicker extends React.Component { 126 | public render(): React.ReactNode { 127 | return ( 128 | 3 | Date: Sat, 22 Apr 2023 12:15:18 +0200 4 | Subject: Allow reactions to take more space 5 | 6 | --- 7 | res/css/views/messages/_ReactionsRowButton.pcss | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/res/css/views/messages/_ReactionsRowButton.pcss b/res/css/views/messages/_ReactionsRowButton.pcss 11 | index 917bcfbb84..75ec572c9e 100644 12 | --- a/res/css/views/messages/_ReactionsRowButton.pcss 13 | +++ b/res/css/views/messages/_ReactionsRowButton.pcss 14 | @@ -14,6 +14,7 @@ Please see LICENSE files in the repository root for full details. 15 | background-color: var(--cpd-color-gray-200); 16 | user-select: none; 17 | align-items: center; 18 | + max-width: calc(100% - 40px);; 19 | 20 | &.mx_ReactionsRowButton_selected { 21 | background-color: $accent-300; 22 | @@ -25,7 +26,6 @@ Please see LICENSE files in the repository root for full details. 23 | } 24 | 25 | .mx_ReactionsRowButton_content { 26 | - max-width: 100px; 27 | overflow: hidden; 28 | white-space: nowrap; 29 | text-overflow: ellipsis; 30 | -- 31 | 2.49.0 32 | 33 | -------------------------------------------------------------------------------- /patches/element-web/0016-On-space-switch-don-t-automatically-show-last-opened.patch: -------------------------------------------------------------------------------- 1 | From d6cecb5cb16ce466b441c09c2c93e342a3b84a5b Mon Sep 17 00:00:00 2001 2 | From: su-ex 3 | Date: Thu, 30 May 2024 14:35:16 +0200 4 | Subject: On space switch don't automatically show last opened room 5 | 6 | --- 7 | src/components/structures/MatrixChat.tsx | 18 +++++++++++++++++- 8 | src/settings/Settings.tsx | 6 ++++++ 9 | src/stores/spaces/SpaceStore.ts | 1 + 10 | 3 files changed, 24 insertions(+), 1 deletion(-) 11 | 12 | diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx 13 | index 761b7cf0e0..eef747d529 100644 14 | --- a/src/components/structures/MatrixChat.tsx 15 | +++ b/src/components/structures/MatrixChat.tsx 16 | @@ -1413,7 +1413,15 @@ export default class MatrixChat extends React.PureComponent { 17 | if (this.screenAfterLogin && this.screenAfterLogin.screen) { 18 | this.showScreen(this.screenAfterLogin.screen, this.screenAfterLogin.params); 19 | this.screenAfterLogin = undefined; 20 | - } else if (localStorage && localStorage.getItem("mx_last_room_id")) { 21 | + } else if ( 22 | + !SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && 23 | + localStorage && 24 | + localStorage.getItem("mx_active_space") && 25 | + localStorage.getItem("mx_active_space")[0] === "!" 26 | + ) { 27 | + // SC: Show the last viewed space 28 | + this.viewLastSpace(); 29 | + } else if (SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && localStorage && localStorage.getItem("mx_last_room_id")) { 30 | // Before defaulting to directory, show the last viewed room 31 | this.viewLastRoom(); 32 | } else { 33 | @@ -1425,6 +1433,14 @@ export default class MatrixChat extends React.PureComponent { 34 | } 35 | } 36 | 37 | + private viewLastSpace(): void { // SC 38 | + // SC-ToDo: Make this work for meta spaces 39 | + dis.dispatch({ 40 | + action: Action.ViewRoom, 41 | + room_id: localStorage.getItem("mx_active_space"), 42 | + }); 43 | + } 44 | + 45 | private viewLastRoom(): void { 46 | dis.dispatch({ 47 | action: Action.ViewRoom, 48 | diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx 49 | index 7295b716b8..cab6622f9a 100644 50 | --- a/src/settings/Settings.tsx 51 | +++ b/src/settings/Settings.tsx 52 | @@ -371,6 +371,12 @@ export const SETTINGS: Settings = { 53 | supportedLevels: LEVELS_ACCOUNT_SETTINGS, 54 | default: true, 55 | }, 56 | + "Spaces.returnToPreviouslyOpenedRoom": { 57 | + displayName: _td("Return to the room previously opened in a space"), 58 | + description: _td("If disabled, the space overview will be shown when switching to another space."), 59 | + supportedLevels: LEVELS_ACCOUNT_SETTINGS, 60 | + default: false, 61 | + }, 62 | // SC settings end 63 | "feature_video_rooms": { 64 | isFeature: true, 65 | diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts 66 | index c5c34c4e14..9c0090d9cc 100644 67 | --- a/src/stores/spaces/SpaceStore.ts 68 | +++ b/src/stores/spaces/SpaceStore.ts 69 | @@ -287,6 +287,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { 70 | // else if the last viewed room in this space is joined then view that 71 | // else view space home or home depending on what is being clicked on 72 | if ( 73 | + SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && 74 | roomId && 75 | cliSpace?.getMyMembership() !== KnownMembership.Invite && 76 | this.matrixClient.getRoom(roomId)?.getMyMembership() === KnownMembership.Join && 77 | -- 78 | 2.49.0 79 | 80 | -------------------------------------------------------------------------------- /patches/element-web/0017-Exclude-spaces-from-breadcrumbs.patch: -------------------------------------------------------------------------------- 1 | From 787190d19f185c011418cd175962fba6b4de719f Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Tue, 9 Aug 2022 09:32:19 +0200 4 | Subject: Exclude spaces from breadcrumbs 5 | 6 | --- 7 | src/stores/BreadcrumbsStore.ts | 1 + 8 | 1 file changed, 1 insertion(+) 9 | 10 | diff --git a/src/stores/BreadcrumbsStore.ts b/src/stores/BreadcrumbsStore.ts 11 | index e3b01cae0b..02f6c286f2 100644 12 | --- a/src/stores/BreadcrumbsStore.ts 13 | +++ b/src/stores/BreadcrumbsStore.ts 14 | @@ -137,6 +137,7 @@ export class BreadcrumbsStore extends AsyncStoreWithClient { 15 | } 16 | 17 | private async appendRoom(room: Room): Promise { 18 | + if (room.isSpaceRoom()) return; 19 | let updated = false; 20 | const rooms = (this.state.rooms || []).slice(); // cheap clone 21 | const msc3946ProcessDynamicPredecessor = SettingsStore.getValue("feature_dynamic_room_predecessors"); 22 | -- 23 | 2.49.0 24 | 25 | -------------------------------------------------------------------------------- /patches/element-web/0018-Stop-the-search-bar-wobble.patch: -------------------------------------------------------------------------------- 1 | From de1b48dfa614375c23d256e693818fb292298304 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Mon, 19 Aug 2024 20:27:33 +0200 4 | Subject: Stop the search bar wobble 5 | 6 | --- 7 | res/css/_common.pcss | 1 + 8 | 1 file changed, 1 insertion(+) 9 | 10 | diff --git a/res/css/_common.pcss b/res/css/_common.pcss 11 | index 75180013f6..e55eadaaf7 100644 12 | --- a/res/css/_common.pcss 13 | +++ b/res/css/_common.pcss 14 | @@ -181,6 +181,7 @@ input[type="search"].mx_textinput_icon { 15 | padding-left: 36px; 16 | background-repeat: no-repeat; 17 | background-position: 10px center; 18 | + min-height: 33px; 19 | } 20 | 21 | /* FIXME THEME - Tint by CSS rather than referencing a duplicate asset */ 22 | -- 23 | 2.49.0 24 | 25 | -------------------------------------------------------------------------------- /patches/element-web/0019-Import-SC-compound-theme-overrides.patch: -------------------------------------------------------------------------------- 1 | From 5f448e590304b0ee06b7fbbfd80891bca813b152 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 13 Oct 2024 11:23:54 +0200 4 | Subject: Import SC compound theme overrides 5 | 6 | --- 7 | res/css/_common.pcss | 1 + 8 | 1 file changed, 1 insertion(+) 9 | 10 | diff --git a/res/css/_common.pcss b/res/css/_common.pcss 11 | index e55eadaaf7..21d0f1d83a 100644 12 | --- a/res/css/_common.pcss 13 | +++ b/res/css/_common.pcss 14 | @@ -11,6 +11,7 @@ Please see LICENSE files in the repository root for full details. 15 | 16 | @import url("@vector-im/compound-design-tokens/assets/web/css/compound-design-tokens.css") layer(compound); 17 | @import url("@vector-im/compound-web/dist/style.css"); 18 | +@import "./sc-cpd-overrides.css"; 19 | @import "./_font-sizes.pcss"; 20 | @import "./_animations.pcss"; 21 | @import "./_spacing.pcss"; 22 | -- 23 | 2.49.0 24 | 25 | -------------------------------------------------------------------------------- /patches/element-web/0020-No-damn-avatar-background-in-room-list.patch: -------------------------------------------------------------------------------- 1 | From 92d6b80e0dac474eee6e68bbed983e461e831ca5 Mon Sep 17 00:00:00 2001 2 | From: su-ex 3 | Date: Tue, 7 Sep 2021 19:41:52 +0200 4 | Subject: No damn avatar background in room list 5 | 6 | --- 7 | src/components/structures/BackdropPanel.tsx | 3 +++ 8 | 1 file changed, 3 insertions(+) 9 | 10 | diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx 11 | index f3a44521fa..396601ba6e 100644 12 | --- a/src/components/structures/BackdropPanel.tsx 13 | +++ b/src/components/structures/BackdropPanel.tsx 14 | @@ -13,6 +13,9 @@ interface IProps { 15 | } 16 | 17 | export const BackdropPanel: React.FC = ({ backgroundImage, blurMultiplier }) => { 18 | + // SC: no damn avatar background in room list 19 | + return null; 20 | + 21 | if (!backgroundImage) return null; 22 | 23 | const styles: CSSProperties = {}; 24 | -- 25 | 2.49.0 26 | 27 | -------------------------------------------------------------------------------- /patches/element-web/0021-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch: -------------------------------------------------------------------------------- 1 | From 7b10f28aeaabb8a4536c7d9cbca4a59c2f99672a Mon Sep 17 00:00:00 2001 2 | From: su-ex 3 | Date: Tue, 22 Dec 2020 19:16:28 +0100 4 | Subject: No red messages in 1:1 chats Close SchildiChat/schildichat-desktop#13 5 | 6 | --- 7 | src/components/views/rooms/EventTile.tsx | 6 ++++++ 8 | 1 file changed, 6 insertions(+) 9 | 10 | diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx 11 | index 2c10d0afd9..d46320e8c3 100644 12 | --- a/src/components/views/rooms/EventTile.tsx 13 | +++ b/src/components/views/rooms/EventTile.tsx 14 | @@ -681,6 +681,12 @@ export class UnwrappedEventTile extends React.Component 15 | return false; 16 | } 17 | 18 | + // don't show highlights in 1:1 rooms 19 | + const room = cli.getRoom(this.props.mxEvent.getRoomId()); 20 | + if (room && room.currentState.getJoinedMemberCount() === 2) { 21 | + return false; 22 | + } 23 | + 24 | return !!(actions?.tweaks.highlight || previousActions?.tweaks.highlight); 25 | } 26 | 27 | -- 28 | 2.49.0 29 | 30 | -------------------------------------------------------------------------------- /patches/element-web/0022-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch: -------------------------------------------------------------------------------- 1 | From 9b372342b6ed5b46c81de8a31f7acd59b73d37be Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 13 Oct 2024 13:26:16 +0200 4 | Subject: Always apply corner radius to all edges of the bubble 5 | 6 | --- 7 | res/css/views/rooms/_EventBubbleTile.pcss | 10 ++++++---- 8 | 1 file changed, 6 insertions(+), 4 deletions(-) 9 | 10 | diff --git a/res/css/views/rooms/_EventBubbleTile.pcss b/res/css/views/rooms/_EventBubbleTile.pcss 11 | index 1607c45924..aa69fbf07f 100644 12 | --- a/res/css/views/rooms/_EventBubbleTile.pcss 13 | +++ b/res/css/views/rooms/_EventBubbleTile.pcss 14 | @@ -283,6 +283,8 @@ Please see LICENSE files in the repository root for full details. 15 | margin-inline: var(--EventTile_bubble_line-margin-inline-start) var(--EventTile_bubble_line-margin-inline-end); 16 | border-top-left-radius: var(--cornerRadius); 17 | border-top-right-radius: var(--cornerRadius); 18 | + border-bottom-left-radius: var(--cornerRadius); 19 | + border-bottom-right-radius: var(--cornerRadius); 20 | 21 | /* the selector here is quite weird because timestamps can appear linked & unlinked and in different places */ 22 | /* in the DOM depending on the specific rendering context */ 23 | @@ -376,7 +378,7 @@ Please see LICENSE files in the repository root for full details. 24 | } 25 | 26 | &.mx_EventTile_continuation[data-self="false"] .mx_EventTile_line { 27 | - border-top-left-radius: 0; 28 | + //border-top-left-radius: 0; 29 | 30 | .mx_MImageBody .mx_MImageBody_thumbnail_container, 31 | .mx_MVideoBody .mx_MVideoBody_container, 32 | @@ -384,7 +386,7 @@ Please see LICENSE files in the repository root for full details. 33 | .mx_MediaBody, 34 | .mx_MLocationBody_map, 35 | .mx_MBeaconBody { 36 | - border-top-left-radius: 0; 37 | + //border-top-left-radius: 0; 38 | } 39 | } 40 | &.mx_EventTile_lastInSection[data-self="false"] .mx_EventTile_line { 41 | @@ -401,7 +403,7 @@ Please see LICENSE files in the repository root for full details. 42 | } 43 | 44 | &.mx_EventTile_continuation[data-self="true"] .mx_EventTile_line { 45 | - border-top-right-radius: 0; 46 | + //border-top-right-radius: 0; 47 | 48 | .mx_MImageBody .mx_MImageBody_thumbnail_container, 49 | .mx_MVideoBody .mx_MVideoBody_container, 50 | @@ -409,7 +411,7 @@ Please see LICENSE files in the repository root for full details. 51 | .mx_MediaBody, 52 | .mx_MLocationBody_map, 53 | .mx_MBeaconBody { 54 | - border-top-right-radius: 0; 55 | + //border-top-right-radius: 0; 56 | } 57 | } 58 | &.mx_EventTile_lastInSection[data-self="true"] .mx_EventTile_line { 59 | -- 60 | 2.49.0 61 | 62 | -------------------------------------------------------------------------------- /patches/element-web/0023-Always-show-timestamps-by-default.patch: -------------------------------------------------------------------------------- 1 | From c829676d1bf57cb045a14236572b8052063e7b38 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 13 Oct 2024 13:53:07 +0200 4 | Subject: Always show timestamps by default 5 | 6 | --- 7 | src/settings/Settings.tsx | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx 11 | index cab6622f9a..01cb113acb 100644 12 | --- a/src/settings/Settings.tsx 13 | +++ b/src/settings/Settings.tsx 14 | @@ -801,7 +801,7 @@ export const SETTINGS: Settings = { 15 | "alwaysShowTimestamps": { 16 | supportedLevels: LEVELS_ACCOUNT_SETTINGS, 17 | displayName: _td("settings|always_show_message_timestamps"), 18 | - default: false, 19 | + default: true, 20 | }, 21 | "userTimezone": { 22 | supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, 23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0024-Enable-custom-emote-rendering-by-default.patch: -------------------------------------------------------------------------------- 1 | From c75d62249708ea59f8ca30f251755578eae9f686 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Thu, 17 Oct 2024 19:40:51 +0200 4 | Subject: Enable custom emote rendering by default 5 | 6 | --- 7 | src/settings/Settings.tsx | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx 11 | index 01cb113acb..cd946a7eb5 100644 12 | --- a/src/settings/Settings.tsx 13 | +++ b/src/settings/Settings.tsx 14 | @@ -656,7 +656,7 @@ export const SETTINGS: Settings = { 15 | description: _td("labs|render_reaction_images_description"), 16 | supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG_PRIORITISED, 17 | supportedLevelsAreOrdered: true, 18 | - default: false, 19 | + default: true, 20 | }, 21 | "feature_new_room_list": { 22 | supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG_PRIORITISED, 23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0025-Enable-chat-previews-by-default.patch: -------------------------------------------------------------------------------- 1 | From 33c51f4c3cb9d768560a267b98639c6e82b4a357 Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sun, 27 Oct 2024 19:24:26 +0100 4 | Subject: Enable chat previews by default 5 | 6 | --- 7 | src/stores/room-list/ListLayout.ts | 2 +- 8 | 1 file changed, 1 insertion(+), 1 deletion(-) 9 | 10 | diff --git a/src/stores/room-list/ListLayout.ts b/src/stores/room-list/ListLayout.ts 11 | index a4ae9bbc1d..227c918457 100644 12 | --- a/src/stores/room-list/ListLayout.ts 13 | +++ b/src/stores/room-list/ListLayout.ts 14 | @@ -18,7 +18,7 @@ interface ISerializedListLayout { 15 | 16 | export class ListLayout { 17 | private _n = 0; 18 | - private _previews = false; 19 | + private _previews = true; 20 | private _collapsed = false; 21 | 22 | public constructor(public readonly tagId: TagID) { 23 | -- 24 | 2.49.0 25 | 26 | -------------------------------------------------------------------------------- /patches/element-web/0026-Disable-showing-people-in-spaces-by-default.patch: -------------------------------------------------------------------------------- 1 | From 92e50fac82ead9ed33077ab28cd9ef25e839f05b Mon Sep 17 00:00:00 2001 2 | From: SpiritCroc 3 | Date: Sat, 30 Nov 2024 19:42:44 +0100 4 | Subject: Disable showing people in spaces by default 5 | 6 | --- 7 | src/settings/Settings.tsx | 2 +- 8 | src/stores/room-list/filters/SpaceFilterCondition.ts | 2 +- 9 | 2 files changed, 2 insertions(+), 2 deletions(-) 10 | 11 | diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx 12 | index cd946a7eb5..fa840e88ca 100644 13 | --- a/src/settings/Settings.tsx 14 | +++ b/src/settings/Settings.tsx 15 | @@ -1229,7 +1229,7 @@ export const SETTINGS: Settings = { 16 | }, 17 | "Spaces.showPeopleInSpace": { 18 | supportedLevels: [SettingLevel.ROOM_ACCOUNT], 19 | - default: true, 20 | + default: false, 21 | }, 22 | "developerMode": { 23 | displayName: _td("devtools|developer_mode"), 24 | diff --git a/src/stores/room-list/filters/SpaceFilterCondition.ts b/src/stores/room-list/filters/SpaceFilterCondition.ts 25 | index 02e20e9103..2b49711c8e 100644 26 | --- a/src/stores/room-list/filters/SpaceFilterCondition.ts 27 | +++ b/src/stores/room-list/filters/SpaceFilterCondition.ts 28 | @@ -25,7 +25,7 @@ import SettingsStore from "../../../settings/SettingsStore"; 29 | export class SpaceFilterCondition extends EventEmitter implements IFilterCondition, IDestroyable { 30 | private roomIds = new Set(); 31 | private userIds = new Set(); 32 | - private showPeopleInSpace = true; 33 | + private showPeopleInSpace = false; 34 | private space: SpaceKey = MetaSpace.Home; 35 | 36 | public isVisible(room: Room): boolean { 37 | -- 38 | 2.49.0 39 | 40 | -------------------------------------------------------------------------------- /patches/element-web/0027-Improve-IRC-layout-for-SchildiChat.patch: -------------------------------------------------------------------------------- 1 | From 6974c864203cb0ed80c0322356e88ba9feaa8393 Mon Sep 17 00:00:00 2001 2 | From: Suguru Hirahara 3 | Date: Thu, 31 Oct 2024 13:44:20 -0400 4 | Subject: Improve IRC layout for SchildiChat 5 | 6 | Signed-off-by: Suguru Hirahara 7 | 8 | Squashed: 9 | 10 | Author: Suguru Hirahara 11 | Date: Thu Nov 28 10:01:43 2024 -0500 12 | 13 | Improve IRC layout for SchildiChat: fix placement of capital letters inside read receipts 14 | 15 | This is a follow-up to 18578fe4ac6838b2d70a4efb029a75ab24087dab. 16 | 17 | Signed-off-by: Suguru Hirahara 18 | --- 19 | .../elements/_GenericEventListSummary.pcss | 15 ++ 20 | res/css/views/rooms/_EventTile.pcss | 148 ++++++++++++++++-- 21 | res/css/views/rooms/_IRCLayout.pcss | 2 + 22 | 3 files changed, 155 insertions(+), 10 deletions(-) 23 | 24 | diff --git a/res/css/views/elements/_GenericEventListSummary.pcss b/res/css/views/elements/_GenericEventListSummary.pcss 25 | index f4aa0e6f0f..88bcb88f14 100644 26 | --- a/res/css/views/elements/_GenericEventListSummary.pcss 27 | +++ b/res/css/views/elements/_GenericEventListSummary.pcss 28 | @@ -1,5 +1,6 @@ 29 | /* 30 | Copyright 2024 New Vector Ltd. 31 | +Copyright 2024 Suguru Hirahara 32 | Copyright 2016 OpenMarket Ltd 33 | 34 | SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial 35 | @@ -36,6 +37,20 @@ Please see LICENSE files in the repository root for full details. 36 | } 37 | } 38 | 39 | + &[data-layout="irc"] { 40 | + .mx_GenericEventListSummary_avatars { 41 | + vertical-align: text-bottom; /* Align with mx_GenericEventListSummary_summary */ 42 | + 43 | + > * { 44 | + line-height: inherit; /* Same size as avatar height */ 45 | + } 46 | + } 47 | + 48 | + .mx_GenericEventListSummary_summary { 49 | + line-height: var(--irc-line-height); /* Override the declaration by mx_TextualEvent */ 50 | + } 51 | + } 52 | + 53 | &[data-layout="group"] { 54 | margin-top: $spacing-8; 55 | } 56 | diff --git a/res/css/views/rooms/_EventTile.pcss b/res/css/views/rooms/_EventTile.pcss 57 | index b4172fc003..c8538a6c32 100644 58 | --- a/res/css/views/rooms/_EventTile.pcss 59 | +++ b/res/css/views/rooms/_EventTile.pcss 60 | @@ -1,5 +1,6 @@ 61 | /* 62 | Copyright 2024 New Vector Ltd. 63 | +Copyright 2024 Suguru Hirahara 64 | Copyright 2020, 2021 The Matrix.org Foundation C.I.C. 65 | Copyright 2015, 2016 OpenMarket Ltd 66 | 67 | @@ -273,6 +274,10 @@ $left-gutter: 64px; 68 | align-items: flex-start; 69 | padding-top: 0; 70 | 71 | + * { 72 | + line-height: var(--line-height); /* Unify the line-height value for IRC layout. The value is applied by default to everything under data-layout="irc", enabling declarations with more specificity to override the value as this is not enforced with "!important" */ 73 | + } 74 | + 75 | > a { 76 | text-decoration: none; /* timestamps are links which shouldn't be underlined */ 77 | min-width: var(--MessageTimestamp-width); /* ensure space for EventTile without timestamp */ 78 | @@ -280,6 +285,7 @@ $left-gutter: 64px; 79 | 80 | > * { 81 | margin-right: var(--right-padding); 82 | + padding-block: var(--EventTile_irc_line-padding-block); /* Unify block padding value of anything directly under mx_EventTile */ 83 | } 84 | 85 | .mx_EventTile_avatar, 86 | @@ -315,17 +321,46 @@ $left-gutter: 64px; 87 | width: var(--name-width); 88 | margin-inline-end: 0; /* override mx_EventTile > * */ 89 | 90 | + /* Align elements to the end side */ 91 | + display: block; 92 | + text-align: end; 93 | + 94 | + --sc-border-radius-8px: 8px; /* TODO: customize the variable per out taste */ 95 | + border-start-start-radius: var(--sc-border-radius-8px, 3px); 96 | + border-end-start-radius: var(--sc-border-radius-8px, 3px); 97 | + 98 | + /* Set $accent as default color, in order to make ellipsis rendered with the accent color (green, by default) */ 99 | + color: $accent; 100 | + 101 | + &:hover { 102 | + background-color: $event-selected-color; 103 | + 104 | + /* This removes top left and bottom left corders from mx_EventTile_line, if just mx_DisambiguatedProfile is hovered. This enables the highlight line to be rendered straight without being dent by those corners. Please note that they do appear if just mx_EventTile_line is hovered. */ 105 | + & ~ .mx_EventTile_line { 106 | + border-start-start-radius: 0; 107 | + border-end-start-radius: 0; 108 | + } 109 | + } 110 | + 111 | > .mx_DisambiguatedProfile_displayName { 112 | width: 100%; 113 | text-align: end; 114 | overflow: hidden; 115 | text-overflow: ellipsis; 116 | + padding-inline-end: var(--right-padding); /* Add padding between displayName and mx_EventTile_line */ 117 | } 118 | 119 | > .mx_DisambiguatedProfile_mxid { 120 | - visibility: collapse; 121 | + /* On the upstream, appearance of mxid on disambiguatedProfile is managed by 122 | + "visibility" property. Since it renders mxid hiding it and pushes 123 | + displayName to the left side, we need to use display property instead. */ 124 | + display: none; 125 | + 126 | margin-left: 0; /* Override the inherited margin. */ 127 | padding: 0 5px; 128 | + padding-inline-start: 0; /* Remove the value specified on upstream since var(--right-padding) is specified for mx_DisambiguatedProfile_displayName above */ 129 | + 130 | + color: $primary-content; /* Override the color specified above to make the mxid rendered as $primary-content (black, by default) */ 131 | } 132 | 133 | &:hover { 134 | @@ -337,17 +372,68 @@ $left-gutter: 64px; 135 | display: inline; 136 | background-color: $event-selected-color; 137 | border-radius: 8px 0 0 8px; 138 | - padding-right: $spacing-8; 139 | + padding-inline-end: var(--right-padding); 140 | } 141 | 142 | > .mx_DisambiguatedProfile_mxid { 143 | - visibility: visible; 144 | + display: inline-block; /* Make var(--irc-line-height) work */ 145 | + 146 | opacity: 1; 147 | background-color: $event-selected-color; 148 | } 149 | } 150 | } 151 | 152 | + /* Need to use important to override the js provided height and width values. */ 153 | + .mx_BaseAvatar, 154 | + .mx_BaseAvatar > * { 155 | + height: $font-14px !important; 156 | + width: $font-14px !important; 157 | + line-height: $font-14px; /* override wildcard; fix alignment of capital letter inside read receipts */ 158 | + flex-shrink: 0; /* Prevents the avatar from shrinking (when mx_DisambiguatedProfile_displayName is long) */ 159 | + } 160 | + 161 | + /* Fill the pill with the avatar */ 162 | + /* TODO: Adjust the size for IRC layout */ 163 | + .mx_Pill { 164 | + .mx_BaseAvatar, 165 | + .mx_BaseAvatar > * { 166 | + height: $font-16px !important; /* override the value specified above */ 167 | + width: $font-16px !important; /* override the value specified above */ 168 | + line-height: $font-16px; /* override wildcard; fix alignment of capital letter inside read receipts */ 169 | + } 170 | + } 171 | + 172 | + .mx_EventTile_bigEmoji { 173 | + line-height: initial; /* Reset global line-height value inside IRC EventTile */ 174 | + 175 | + .mx_Emoji { 176 | + line-height: unset; 177 | + } 178 | + } 179 | + 180 | + .mx_EventTile_content { 181 | + .markdown-body { 182 | + > * { 183 | + margin-bottom: 4px; /* Unify block end margin for elements like blockquote */ 184 | + } 185 | + 186 | + > p { 187 | + margin-bottom: 1rem; /* Re-add block end margin to unify the margin for paragraphs with or without annotation */ 188 | + } 189 | + 190 | + code:not(pre *) { 191 | + padding-block: 0; /* Remove block padding to avoid line height overflow */ 192 | + } 193 | + 194 | + .mx_EventTile_pre_container { 195 | + pre { 196 | + margin-bottom: 0; /* Remove default block end margin */ 197 | + } 198 | + } 199 | + } 200 | + } 201 | + 202 | .mx_EventTile_e2eIcon { 203 | padding: 0; 204 | flex-grow: 0; 205 | @@ -359,9 +445,8 @@ $left-gutter: 64px; 206 | .mx_TextualEvent, 207 | .mx_ViewSourceEvent, 208 | .mx_MTextBody { 209 | - /* add a 1px padding top and bottom because our larger 210 | - emoji font otherwise gets cropped by anti-zalgo */ 211 | - padding: var(--EventTile_irc_line-padding-block) 0; 212 | + /* Cancel the padding specified by the upstream as it is taken care of by padding var(--EventTile_irc_line-padding-block) */ 213 | + padding: unset; 214 | } 215 | 216 | .mx_EventTile_e2eIcon, 217 | @@ -399,8 +484,36 @@ $left-gutter: 64px; 218 | } 219 | } 220 | 221 | - .mx_ReplyChain { 222 | - margin: 0; 223 | + .mx_ReplyChain_wrapper { 224 | + .mx_ReplyChain { 225 | + margin: 0; 226 | + 227 | + .mx_ReplyTile { 228 | + padding-block: unset; /* Unset the inherited value */ 229 | + } 230 | + 231 | + .mx_DisambiguatedProfile { 232 | + line-height: var(--irc-line-height); 233 | + 234 | + /* Stop mxid from moving avatar up on ReplyChain by resetting display 235 | + value "none" specified above */ 236 | + /* Mind the difference of avatar placement between on upstream's 237 | + mx_EventTile and mx_ReplyTile_sender */ 238 | + > .mx_DisambiguatedProfile_mxid { 239 | + display: unset; 240 | + } 241 | + 242 | + &:hover { 243 | + overflow: hidden; /* Override "overflow: visible" specified by the upstream */ 244 | + } 245 | + } 246 | + } 247 | + 248 | + /* Align avatar inside ReplyChain (ReplyTile) */ 249 | + /* "In reply to" line */ 250 | + div:first-of-type blockquote.mx_ReplyChain { 251 | + padding-bottom: 2px; /* Add padding between "In reply to" line and the replied content */ 252 | + } 253 | } 254 | 255 | .mx_MessageTimestamp { 256 | @@ -453,8 +566,14 @@ $left-gutter: 64px; 257 | 258 | &.mx_EventTile_emote { 259 | .mx_EventTile_avatar { 260 | - /* add --right-padding value of MessageTimestamp only */ 261 | - margin-left: calc(var(--name-width) + var(--icon-width) + 1 * var(--right-padding)); 262 | + /* Required for the avatar to reserve spacing between timestamp and the avatar */ 263 | + margin-left: var(--name-width); /* Align emote with other EventTile */ 264 | + } 265 | + 266 | + &.mx_EventTile_info { 267 | + .mx_EventTile_avatar { 268 | + margin-left: unset; /* Required for hidden events for emote */ 269 | + } 270 | } 271 | } 272 | 273 | @@ -636,6 +755,15 @@ $left-gutter: 64px; 274 | var(--name-width) + var(--icon-width) + var(--MessageTimestamp-width) + 2 * var(--right-padding) 275 | ); 276 | } 277 | + 278 | + .mx_EventTile_line .mx_RedactedBody { 279 | + line-height: var(--line-height); /* Unify the line-height value for IRC layout by overwriting the line-height value specified on upstream _EventTile.pcss */ 280 | + 281 | + &::before { 282 | + height: var(--line-height); /* Set the line height value to the trash icon */ 283 | + top: 0px; /* Remove the value specified by the upstream as this is no longer needed */ 284 | + } 285 | + } 286 | } 287 | 288 | &[data-layout="group"] { 289 | diff --git a/res/css/views/rooms/_IRCLayout.pcss b/res/css/views/rooms/_IRCLayout.pcss 290 | index 953a0c941f..3326d0c0ff 100644 291 | --- a/res/css/views/rooms/_IRCLayout.pcss 292 | +++ b/res/css/views/rooms/_IRCLayout.pcss 293 | @@ -1,5 +1,6 @@ 294 | /* 295 | Copyright 2024 New Vector Ltd. 296 | +Copyright 2024 Suguru Hirahara 297 | Copyright 2020 The Matrix.org Foundation C.I.C. 298 | 299 | SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial 300 | @@ -15,6 +16,7 @@ Please see LICENSE files in the repository root for full details. 301 | --icon-width: 14px; 302 | --line-height: var(--irc-line-height); 303 | --right-padding: 5px; 304 | + --cpd-font-line-height-regular: var(--irc-line-height); /* Unify the line-height value for IRC layout */ 305 | 306 | line-height: var(--line-height) !important; 307 | 308 | -- 309 | 2.49.0 310 | 311 | -------------------------------------------------------------------------------- /push_current_sc_branches.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | pushd "$mydir" > /dev/null 7 | 8 | source ./merge_helpers.sh 9 | 10 | get_branch_of() { 11 | local repo="$1" 12 | pushd "$repo" > /dev/null 13 | local b=`git branch --show-current` 14 | if [[ "$b" = sc_v* ]]; then 15 | echo "$b" 16 | else 17 | >&2 echo "Unexpected branch name for $repo: $b" 18 | exit 1 19 | fi 20 | popd > /dev/null 21 | } 22 | 23 | b_js=`get_branch_of matrix-js-sdk` 24 | b_web=`get_branch_of element-web` 25 | b_desktop=`get_branch_of element-desktop` 26 | 27 | if [ "$b_js" != "$b_web" ] || [ "$b_web" != "$b_desktop" ]; then 28 | echo "Detected branch name mismatch!" 29 | echo "js-sdk: $b_js" 30 | echo "element-web: $b_web" 31 | echo "element-desktop: $b_desktop" 32 | exit 1 33 | fi 34 | 35 | branch="$b_js" 36 | 37 | echo "Pushing to all repos: $branch" 38 | for_main_repos git push --set-upstream origin "$branch" "$@" 39 | -------------------------------------------------------------------------------- /regenerate_i18n.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mydir="$(dirname "$(realpath "$0")")" 6 | branch=${BRANCH:-"sc"} 7 | 8 | pushd "$mydir" > /dev/null 9 | 10 | source ./merge_helpers.sh 11 | 12 | # Fetch to get upstream strings for current version 13 | forall_repos git fetch upstream 14 | 15 | # Check branch 16 | check_branch $branch 17 | forall_repos check_branch $branch 18 | 19 | # Ensure clean git state 20 | forall_repos check_clean_git 21 | 22 | # Automatic i18n reversion 23 | automatic_i18n_reversion y 24 | 25 | # Automatic i18n adjustment 26 | automatic_i18n_adjustment 27 | 28 | popd > /dev/null 29 | -------------------------------------------------------------------------------- /res/css/sc-cpd-overrides.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Upstream file for reference: 3 | * - Dark: https://github.com/element-hq/compound-design-tokens/blob/main/assets/web/css/cpd-theme-dark-base.css 4 | * - Light: https://github.com/element-hq/compound-design-tokens/blob/main/assets/web/css/cpd-theme-light-base.css 5 | */ 6 | 7 | .cpd-theme-dark.cpd-theme-dark { 8 | --cpd-color-text-primary: rgba(255, 255, 255, 0.9); 9 | --cpd-color-text-secondary: rgba(255, 255, 255, 0.65); 10 | /* TODO? 11 | --cpd-color-alpha-green-1400: hsla(152, 88%, 94%, 0.96); 12 | --cpd-color-alpha-green-1300: hsla(152, 93%, 88%, 0.91); 13 | --cpd-color-alpha-green-1200: hsla(156, 97%, 76%, 0.83); 14 | --cpd-color-alpha-green-1100: hsla(162, 98%, 57%, 0.74); 15 | --cpd-color-alpha-green-1000: hsla(163, 99%, 55%, 0.65); 16 | --cpd-color-alpha-green-900: hsla(164, 98%, 53%, 0.58); 17 | --cpd-color-alpha-green-800: hsl(168, 100%, 24%, 1); 18 | --cpd-color-alpha-green-700: hsl(165, 100%, 18%, 1); 19 | --cpd-color-alpha-green-600: hsl(162, 100%, 14%, 1); 20 | --cpd-color-alpha-green-500: hsl(160, 100%, 12%, 1); 21 | --cpd-color-alpha-green-400: hsl(155, 100%, 9%, 1); 22 | --cpd-color-alpha-green-300: hsl(151, 100%, 7%, 1); 23 | --cpd-color-alpha-green-200: hsl(147, 100%, 6%, 1); 24 | --cpd-color-alpha-green-100: hsl(144, 100%, 6%, 1); 25 | 26 | --cpd-color-alpha-gray-1400: hsla(214, 78%, 98%, 0.95); 27 | --cpd-color-alpha-gray-1300: hsla(213, 73%, 97%, 0.89); 28 | --cpd-color-alpha-gray-1200: hsla(215, 74%, 96%, 0.79); 29 | --cpd-color-alpha-gray-1100: hsla(215, 92%, 95%, 0.68); 30 | --cpd-color-alpha-gray-1000: hsla(213, 93%, 94%, 0.61); 31 | --cpd-color-alpha-gray-900: hsla(211, 94%, 94%, 0.54); 32 | --cpd-color-alpha-gray-800: hsla(216, 100%, 94%, 0.41); 33 | --cpd-color-alpha-gray-700: hsla(213, 85%, 95%, 0.27); 34 | --cpd-color-alpha-gray-600: hsla(225, 46%, 95%, 0.2); 35 | --cpd-color-alpha-gray-500: hsla(214, 41%, 97%, 0.15); 36 | --cpd-color-alpha-gray-400: hsla(270, 37%, 93%, 0.1); 37 | --cpd-color-alpha-gray-200: hsla(286, 31%, 82%, 0.04); 38 | --cpd-color-alpha-gray-100: hsla(214, 10%, 86%, 0.02); 39 | */ 40 | /* Hover of room list items, search bar bg, space icon bg */ 41 | --cpd-color-alpha-gray-300: rgba(255, 255, 255, 0.06); 42 | 43 | /* TODO more accent variants? */ 44 | --cpd-color-green-1400: #F1F8E9; 45 | --cpd-color-green-1300: #DCEDC8; 46 | --cpd-color-green-1200: #C5E1A5; 47 | --cpd-color-green-1100: #AED581; 48 | --cpd-color-green-1000: #9CCC65; 49 | --cpd-color-green-900: #8BC34A; 50 | --cpd-color-green-800: #8BC34A; 51 | --cpd-color-green-700: #8BC34A; 52 | --cpd-color-green-600: #8BC34A; 53 | --cpd-color-green-500: #8BC34A; 54 | --cpd-color-green-400: #689F38; 55 | --cpd-color-green-300: #33691E; 56 | --cpd-color-green-200: #33691E; 57 | --cpd-color-green-100: #33691E; 58 | 59 | /* TODO 60 | --cpd-color-red-1400: #ffe9e6; 61 | --cpd-color-red-1300: #ffd4cd; 62 | --cpd-color-red-1200: #ffaea4; 63 | --cpd-color-red-1100: #ff877c; 64 | --cpd-color-red-1000: #ff665d; 65 | --cpd-color-red-900: #fd3e3c; 66 | --cpd-color-red-800: #d1212a; 67 | --cpd-color-red-700: #9f0d1e; 68 | --cpd-color-red-600: #830009; 69 | --cpd-color-red-500: #710000; 70 | --cpd-color-red-400: #590000; 71 | --cpd-color-red-300: #470000; 72 | --cpd-color-red-200: #3e0000; 73 | --cpd-color-red-100: #370000; 74 | */ 75 | 76 | --cpd-color-gray-1400: #eeeeee; 77 | --cpd-color-gray-1300: #e0e0e0; 78 | --cpd-color-gray-1200: #b3b3b3; 79 | --cpd-color-gray-1100: #aaaaaa; 80 | --cpd-color-gray-1000: #9e9e9e; 81 | --cpd-color-gray-900: #808080; 82 | --cpd-color-gray-800: #757575; 83 | --cpd-color-gray-700: #424242; 84 | --cpd-color-gray-600: #424242; 85 | --cpd-color-gray-500: #424242; 86 | --cpd-color-gray-400: #303030; 87 | --cpd-color-gray-300: #212121; 88 | --cpd-color-gray-200: #212121; 89 | --cpd-color-gray-100: #171717; 90 | --cpd-color-theme-bg: #171717; 91 | --cpd-color-tooltip-bg: #424242; 92 | } 93 | 94 | .cpd-theme-light.cpd-theme-light { 95 | /* TODO? 96 | --cpd-color-alpha-gray-1400: hsla(223, 64%, 2%, 0.9); 97 | --cpd-color-alpha-gray-1300: hsla(225, 57%, 3%, 0.84); 98 | --cpd-color-alpha-gray-1200: hsla(213, 73%, 3%, 0.77); 99 | --cpd-color-alpha-gray-1100: hsla(215, 74%, 5%, 0.71); 100 | --cpd-color-alpha-gray-1000: hsla(218, 79%, 6%, 0.66); 101 | --cpd-color-alpha-gray-900: hsla(213, 83%, 7%, 0.61); 102 | --cpd-color-alpha-gray-800: hsla(213, 87%, 9%, 0.5); 103 | --cpd-color-alpha-gray-700: hsla(215, 96%, 10%, 0.35); 104 | --cpd-color-alpha-gray-600: hsla(212, 97%, 12%, 0.26); 105 | --cpd-color-alpha-gray-500: hsla(212, 87%, 15%, 0.2); 106 | --cpd-color-alpha-gray-400: hsla(213, 90%, 20%, 0.12); 107 | --cpd-color-alpha-gray-300: hsla(216, 89%, 18%, 0.06); 108 | --cpd-color-alpha-gray-200: hsla(200, 41%, 36%, 0.04); 109 | --cpd-color-alpha-gray-100: hsla(210, 48%, 41%, 0.02); 110 | 111 | --cpd-color-alpha-green-1400: hsl(149, 100%, 7%, 1); 112 | --cpd-color-alpha-green-1300: hsl(157, 100%, 10%, 1); 113 | --cpd-color-alpha-green-1200: hsl(162, 100%, 14%, 1); 114 | --cpd-color-alpha-green-1100: hsl(165, 100%, 18%, 1); 115 | --cpd-color-alpha-green-1000: hsl(166, 100%, 21%, 1); 116 | --cpd-color-alpha-green-900: hsl(168, 100%, 24%, 1); 117 | --cpd-color-alpha-green-800: hsl(166, 100%, 30%, 1); 118 | --cpd-color-alpha-green-700: hsla(163, 99%, 38%, 0.96); 119 | --cpd-color-alpha-green-600: hsla(156, 99%, 36%, 0.56); 120 | --cpd-color-alpha-green-500: hsla(154, 96%, 37%, 0.41); 121 | --cpd-color-alpha-green-400: hsla(151, 93%, 37%, 0.23); 122 | --cpd-color-alpha-green-300: hsla(150, 100%, 36%, 0.11); 123 | --cpd-color-alpha-green-200: hsla(150, 79%, 41%, 0.06); 124 | --cpd-color-alpha-green-100: hsla(156, 79%, 41%, 0.03); 125 | */ 126 | 127 | /* TODO accent variants? */ 128 | --cpd-color-green-1400: #33691E; 129 | --cpd-color-green-1300: #33691E; 130 | --cpd-color-green-1200: #33691E; 131 | --cpd-color-green-1100: #33691E; 132 | --cpd-color-green-1000: #33691E; 133 | --cpd-color-green-900: #33691E; 134 | --cpd-color-green-800: #33691E; 135 | --cpd-color-green-700: #8BC34A; 136 | --cpd-color-green-600: #8BC34A; 137 | --cpd-color-green-500: #8BC34A; 138 | --cpd-color-green-400: #8BC34A; 139 | --cpd-color-green-300: #C5E1A5; 140 | --cpd-color-green-200: #DCEDC8; 141 | --cpd-color-green-100: #F1F8E9; 142 | 143 | /* TODO 144 | --cpd-color-red-1400: #450000; 145 | --cpd-color-red-1300: #620000; 146 | --cpd-color-red-1200: #850006; 147 | --cpd-color-red-1100: #a4041d; 148 | --cpd-color-red-1000: #bc0f22; 149 | --cpd-color-red-900: #d51928; 150 | --cpd-color-red-800: #ff3d3d; 151 | --cpd-color-red-700: #ff8c81; 152 | --cpd-color-red-600: #ffafa5; 153 | --cpd-color-red-500: #ffc5bc; 154 | --cpd-color-red-400: #ffdfda; 155 | --cpd-color-red-300: #ffefec; 156 | --cpd-color-red-200: #fff7f6; 157 | --cpd-color-red-100: #fffaf9; 158 | */ 159 | 160 | --cpd-color-gray-1400: #212121; 161 | --cpd-color-gray-1300: #212121; 162 | --cpd-color-gray-1200: #424242; 163 | --cpd-color-gray-1100: #424242; 164 | --cpd-color-gray-1000: #616161; 165 | --cpd-color-gray-900: #616161; 166 | --cpd-color-gray-800: #808080; 167 | --cpd-color-gray-700: #b3b3b3; 168 | --cpd-color-gray-600: #b3b3b3; 169 | --cpd-color-gray-500: #cdd3da; 170 | --cpd-color-gray-400: #e0e0e0; 171 | --cpd-color-gray-300: #f5f5f5; 172 | --cpd-color-gray-200: #f5f5f5; 173 | --cpd-color-gray-100: #fafafa; 174 | --cpd-color-theme-bg: #ffffff; 175 | --cpd-color-tooltip-bg: #f5f5f5; 176 | } 177 | -------------------------------------------------------------------------------- /screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SchildiChat/schildichat-desktop/b601d43d8893d1b60f76ab472dc0806b603d5e1d/screenshots/1.png -------------------------------------------------------------------------------- /screenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SchildiChat/schildichat-desktop/b601d43d8893d1b60f76ab472dc0806b603d5e1d/screenshots/2.png -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | yarn=yarnpkg 6 | 7 | pushd matrix-js-sdk 8 | $yarn unlink &>/dev/null || true 9 | $yarn link 10 | $yarn install 11 | popd 12 | 13 | pushd compound-web 14 | $yarn unlink &>/dev/null || true 15 | $yarn link 16 | $yarn install 17 | popd 18 | 19 | pushd element-web 20 | $yarn link matrix-js-sdk 21 | $yarn link @vector-im/compound-web 22 | $yarn install 23 | popd 24 | 25 | pushd element-desktop 26 | $yarn install 27 | # Seshat: compare https://github.com/element-hq/element-desktop/blob/develop/docs/native-node-modules.md#adding-seshat-for-search-in-e2e-encrypted-rooms 28 | $yarn add matrix-seshat 29 | #$yarn add electron-build-env 30 | #$yarn run electron-build-env -- --electron "$electron_version" -- neon build matrix-seshat --release 31 | popd 32 | 33 | pushd i18n-helper 34 | $yarn install 35 | popd 36 | 37 | # CSS overrides 38 | cp res/css/* element-web/res/css/ 39 | 40 | # Ensure appropriate .gitignore to avoid unnecessary dirty repos 41 | # when re-running setup. merge_upstream.sh will include this into the 42 | # "Automatic setup commit". 43 | if grep -q res/css/sc- element-web/.gitignore; then 44 | echo "Skip updating .gitignore, already looks ok" 45 | else 46 | echo "Updating .gitignore" 47 | echo -e "\nres/css/sc-*.css" >> element-web/.gitignore 48 | fi 49 | -------------------------------------------------------------------------------- /theme.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | shopt -s globstar 5 | 6 | mydir="$(dirname "$(realpath "$0")")" 7 | automatic_commit="$1" 8 | 9 | pushd "$mydir/element-web" > /dev/null 10 | 11 | if [[ "$automatic_commit" == [Yy]* ]]; then 12 | # Require clean git state 13 | uncommitted=`git status --porcelain` 14 | if [ ! -z "$uncommitted" ]; then 15 | echo "Uncommitted changes are present, please commit first!" 16 | exit 1 17 | fi 18 | fi 19 | 20 | M_ACCENT="#8bc34a" 21 | M_ACCENT_DEC="139, 195, 74" 22 | M_ACCENT_DARK="#33691e" 23 | M_ACCENT_LIGHT="#dcedc8" 24 | M_ALERT="#e53935" 25 | M_LINK="#368bd6" 26 | 27 | replace_colors() { 28 | local f="$1" 29 | if [[ "$f" =~ "dark" ]]; then 30 | echo "Replacing colors (dark) for $f..." 31 | BG_ACCENT="$M_ACCENT_DARK" 32 | CODEBLOCK_BORDER_COLOR="#121212" 33 | CODEBLOCK_BACKGROUND_COLOR="#121212" 34 | PILL_COLOR="rgba(255, 255, 255, 0.15)" 35 | PILL_HOVER_COLOR="rgba(255, 255, 255, 0.18)" 36 | PRESENCE_OFFLINE="#e0e0e0" # not applied because not existing specifically for dark 37 | MESSAGE_BUBBLE_BACKGROUND="#424242" 38 | MESSAGE_BUBBLE_BACKGROUND_SELF="#303030" 39 | MESSAGE_BUBBLE_BACKGROUND_SELECTED="#212121" 40 | ROOMLIST_BG_COLOR="#303030" 41 | SPACELIST_BG_COLOR="#424242" 42 | else 43 | echo "Replacing colors (light) for $f..." 44 | BG_ACCENT="$M_ACCENT_LIGHT" 45 | CODEBLOCK_BORDER_COLOR="#00000010" 46 | CODEBLOCK_BACKGROUND_COLOR="#00000010" 47 | PILL_COLOR="rgba(0, 0, 0, 0.13)" 48 | PILL_HOVER_COLOR="rgba(0, 0, 0, 0.1)" 49 | PRESENCE_OFFLINE="#bdbdbd" # for light this should actually be darker 50 | MESSAGE_BUBBLE_BACKGROUND="#eeeeee" 51 | MESSAGE_BUBBLE_BACKGROUND_SELF="#f1f8e9" 52 | MESSAGE_BUBBLE_BACKGROUND_SELECTED="#e0e0e0" 53 | ROOMLIST_BG_COLOR="#eeeeee" 54 | SPACELIST_BG_COLOR="#fafafa" 55 | fi 56 | # Neutral colors 57 | sed -i 's|#15171b|#212121|gi' "$f" 58 | sed -i 's|#15191E|#212121|gi' "$f" 59 | sed -i 's|#2e2f32|#212121|gi' "$f" 60 | sed -i 's|#232f32|#212121|gi' "$f" 61 | sed -i 's|#27303a|#212121|gi' "$f" 62 | sed -i 's|#17191C|#212121|gi' "$f" 63 | sed -i 's|#181b21|#303030|gi' "$f" 64 | sed -i 's|#1A1D23|#303030|gi' "$f" 65 | sed -i 's|#20252B|#303030|gi' "$f" 66 | sed -i 's|#20252c|#303030|gi' "$f" 67 | sed -i 's|#21262c|#383838|gi' "$f" # selection/hover color 68 | sed -i 's|#238cf5|#303030|gi' "$f" 69 | sed -i 's|#25271F|#303030|gi' "$f" 70 | sed -i 's|#272c35|#303030|gi' "$f" 71 | sed -i 's|#2a3039|#303030|gi' "$f" 72 | sed -i 's|#343a46|#424242|gi' "$f" 73 | sed -i 's|#3c4556|#424242|gi' "$f" 74 | sed -i 's|#3d3b39|#424242|gi' "$f" 75 | sed -i 's|#45474a|#424242|gi' "$f" 76 | sed -i 's|#454545|#424242|gi' "$f" 77 | sed -i 's|#2e3649|#424242|gi' "$f" 78 | sed -i 's|#4e5054|#424242|gi' "$f" 79 | sed -i 's|#394049|#424242|gi' "$f" 80 | sed -i 's|#3e444c|#424242|gi' "$f" 81 | sed -i 's|#61708b|#616161|gi' "$f" 82 | sed -i 's|#616b7f|#616161|gi' "$f" 83 | sed -i 's|#5c6470|#616161|gi' "$f" 84 | sed -i 's|#545a66|#616161|gi' "$f" # pill hover bg color 85 | sed -i 's|#737D8C|#757575|gi' "$f" 86 | sed -i 's|#6F7882|#757575|gi' "$f" 87 | sed -i 's|#91A1C0|#757575|gi' "$f" # icon in button color 88 | sed -i 's|#8D99A5|#808080|gi' "$f" 89 | sed -i 's|#8E99A4|#808080|gi' "$f" # maybe use #9e9e9e instead 90 | sed -i 's|#8D97A5|#808080|gi' "$f" 91 | sed -i 's|#a2a2a2|#9e9e9e|gi' "$f" 92 | sed -i 's|#9fa9ba|#aaaaaa|gi' "$f" # maybe use #9e9e9e instead 93 | sed -i 's|#acacac|#aaaaaa|gi' "$f" # maybe use #9e9e9e instead 94 | sed -i 's|#B9BEC6|#b3b3b3|gi' "$f" # maybe use #bdbdbd instead 95 | sed -i 's|#a1b2d1|#b3b3b3|gi' "$f" 96 | sed -i 's|#A9B2BC|#b3b3b3|gi' "$f" 97 | sed -i 's|#C1C6CD|#bdbdbd|gi' "$f" 98 | sed -i 's|#c1c9d6|#bdbdbd|gi' "$f" 99 | sed -i 's|#c8c8cd|#cccccc|gi' "$f" # maybe use #bdbdbd instead 100 | # sed -i 's|#dddddd|#e0e0e0|gi' "$f" # really? 101 | sed -i 's|#e7e7e7|#e0e0e0|gi' "$f" 102 | sed -i 's|#e3e8f0|#e0e0e0|gi' "$f" 103 | sed -i 's|#e9e9e9|#e0e0e0|gi' "$f" 104 | sed -i 's|#e9edf1|#e0e0e0|gi' "$f" 105 | sed -i 's|#e8eef5|#e0e0e0|gi' "$f" 106 | sed -i 's|#deddfd|#e0e0e0|gi' "$f" # $location-live-secondary-color, what to use really? 107 | sed -i 's|#edf3ff|#eeeeee|gi' "$f" 108 | sed -i 's|#f4f6fa|#f5f5f5|gi' "$f" 109 | sed -i 's|#f6f7f8|#f5f5f5|gi' "$f" 110 | sed -i 's|#f2f5f8|#f5f5f5|gi' "$f" 111 | sed -i 's|#f5f8fa|#f5f5f5|gi' "$f" 112 | sed -i 's|#f3f8fd|#fafafa|gi' "$f" 113 | sed -i 's|rgba(33, 38, 34,|rgba(48, 48, 48,|gi' "$f" 114 | sed -i 's|rgba(33, 38, 44,|rgba(48, 48, 48,|gi' "$f" 115 | sed -i 's|rgba(34, 38, 46,|rgba(48, 48, 48,|gi' "$f" 116 | sed -i 's|rgba(38, 39, 43,|rgba(48, 48, 48,|gi' "$f" 117 | sed -i 's|rgba(38, 40, 45,|rgba(48, 48, 48,|gi' "$f" 118 | sed -i 's|rgba(46, 48, 51,|rgba(48, 48, 48,|gi' "$f" 119 | sed -i 's|rgba(92, 100, 112,|rgba(97, 97, 97,|gi' "$f" 120 | sed -i 's|rgba(141, 151, 165,|rgba(144, 144, 144,|gi' "$f" 121 | sed -i 's|rgba(242, 245, 248,|rgba(248, 248, 248,|gi' "$f" 122 | 123 | sed -i "s|\\(\$event-highlight-bg-color: \\).*;|\\1transparent;|gi" "$f" 124 | sed -i "s|\\(\$preview-widget-bar-color: \\).*;|\\1#bdbdbd;|gi" "$f" 125 | sed -i "s|\\(\$blockquote-bar-color: \\).*;|\\1#bdbdbd;|gi" "$f" 126 | sed -i "s|\\(\$pill-bg-color: \\).*;|\\1$PILL_COLOR;|gi" "$f" 127 | sed -i "s|\\(\$pill-hover-bg-color: \\).*;|\\1$PILL_HOVER_COLOR;|gi" "$f" 128 | 129 | sed -i "s|\\(\$inlinecode-border-color: \\).*;|\\1$CODEBLOCK_BORDER_COLOR;|gi" "$f" 130 | sed -i "s|\\(\$inlinecode-background-color: \\).*;|\\1$CODEBLOCK_BACKGROUND_COLOR;|gi" "$f" 131 | sed -i "s|\\(\$codeblock-background-color: \\).*;|\\1$CODEBLOCK_BACKGROUND_COLOR;|gi" "$f" 132 | 133 | sed -i "s|\\(\$presence-offline: \\).*;|\\1$PRESENCE_OFFLINE;|gi" "$f" 134 | 135 | sed -i "s|\\(\$roomlist-bg-color: \\).*;|\\1$ROOMLIST_BG_COLOR;|gi" "$f" 136 | sed -i "s|\\(\$spacePanel-bg-color: \\).*;|\\1$SPACELIST_BG_COLOR;|gi" "$f" 137 | 138 | # Accent colors 139 | sed -i "s|#368bd6|$M_ACCENT|gi" "$f" 140 | sed -i "s|#ac3ba8|$M_ACCENT|gi" "$f" 141 | sed -i "s|#0DBD8B|$M_ACCENT|gi" "$f" 142 | sed -i "s|#e64f7a|$M_ACCENT|gi" "$f" 143 | sed -i "s|#ff812d|$M_ACCENT|gi" "$f" 144 | sed -i "s|#2dc2c5|$M_ACCENT|gi" "$f" 145 | sed -i "s|#5c56f5|$M_ACCENT|gi" "$f" 146 | sed -i "s|#74d12c|$M_ACCENT|gi" "$f" 147 | sed -i "s|#76CFA6|$M_ACCENT|gi" "$f" 148 | sed -i "s|#03b381|$M_ACCENT|gi" "$f" 149 | sed -i "s|rgba(3, 179, 129,|rgba($M_ACCENT_DEC,|gi" "$f" 150 | sed -i "s|#03b381|$M_ACCENT|gi" "$f" 151 | sed -i "s|#FF5B55|$M_ALERT|gi" "$f" 152 | sed -i "s|\\(\$accent-alt: \\).*;|\\1$M_LINK;|gi" "$f" 153 | #sed -i "s|\\(\$accent-darker: \\).*;|\\1$M_ACCENT_DARK;|gi" "$f" 154 | sed -i "s|\\(\$roomtile-default-badge-bg-color: \\).*;|\\1$M_ACCENT;|gi" "$f" 155 | #sed -i "s|\\(\$input-focused-border-color: \\).*;|\\1\$accent;|gi" "$f" # not existing anymore, need replacement? 156 | sed -i "s|\\(\$reaction-row-button-selected-bg-color: \\).*;|\\1$BG_ACCENT;|gi" "$f" 157 | 158 | # e2e colors 159 | sed -i "s|\\(\$e2e-verified-color: \\).*;|\\1$M_ACCENT;|gi" "$f" 160 | sed -i "s|\\(\$e2e-unknown-color: \\).*;|\\1#ffc107;|gi" "$f" 161 | sed -i "s|\\(\$e2e-unverified-color: \\).*;|\\1#ffc107;|gi" "$f" 162 | sed -i "s|\\(\$e2e-warning-color: \\).*;|\\1$M_ALERT;|gi" "$f" 163 | 164 | # Message bubbles 165 | sed -i "s|\\(\$eventbubble-self-bg: \\).*;|\$eventbubble-self-bg: $MESSAGE_BUBBLE_BACKGROUND_SELF;|gi" "$f" 166 | sed -i "s|\\(\$eventbubble-others-bg: \\).*;|\$eventbubble-others-bg: $MESSAGE_BUBBLE_BACKGROUND;|gi" "$f" 167 | sed -i "s|\\(\$eventbubble-bg-hover: \\).*;|\$eventbubble-bg-hover: $MESSAGE_BUBBLE_BACKGROUND_SELECTED;|gi" "$f" 168 | #sed -i "s|\\(\$eventbubble-reply-color: \\).*;$||gi" "$f" 169 | } 170 | 171 | replace_colors res/themes/light/css/light.pcss 172 | replace_colors res/themes/light/css/_light.pcss 173 | replace_colors res/themes/legacy-light/css/legacy-light.pcss 174 | replace_colors res/themes/legacy-light/css/_legacy-light.pcss 175 | replace_colors res/themes/dark/css/dark.pcss 176 | replace_colors res/themes/dark/css/_dark.pcss 177 | replace_colors res/themes/legacy-dark/css/legacy-dark.pcss 178 | replace_colors res/themes/legacy-dark/css/_legacy-dark.pcss 179 | for f in res/**/*.svg; do 180 | replace_colors "$f" 181 | done 182 | 183 | if [[ "$automatic_commit" == [Yy]* ]]; then 184 | # see: https://devops.stackexchange.com/a/5443 185 | git add -A 186 | git diff-index --quiet HEAD || git commit -m "Automatic theme update" 187 | fi 188 | 189 | popd > /dev/null 190 | -------------------------------------------------------------------------------- /windowsportable.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | portable_exe=$1 6 | dest_name=$2 7 | release_dir=$3 8 | version=$4 9 | 10 | dest_path=$release_dir/$dest_name/SchildiChat 11 | 12 | mkdir -p $dest_path/app 13 | cp "$portable_exe" $dest_path/app/dontclick.exe 14 | 15 | cat >$dest_path/SchildiChat_Portable.bat <nul 34 | set ALLUSERSPROFILE=%DATA_DIR%\AppData\Roaming>nul 35 | set PROGRAMDATA=%DATA_DIR%\AppData\Roaming>nul 36 | 37 | REM -- Start the application 38 | start "" /D"%CURRENT_DIR%\app" "dontclick.exe" 39 | EOL 40 | 41 | cat >$dest_path/README.txt < $dest_path/app/version 52 | else 53 | echo ${version} > $dest_path/app/version 54 | fi 55 | 56 | pushd $dest_path/.. 57 | zip -r ../$dest_name.zip * 58 | popd 59 | 60 | rm -r $release_dir/$dest_name 61 | 62 | echo 63 | echo "Packaged $release_dir/$dest_name.zip" 64 | --------------------------------------------------------------------------------