Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c3b688178 | |||
| 45973252bb | |||
| a7daa84054 | |||
| df9598ff6b | |||
| 93d1942728 | |||
| 84738fec6b | |||
| 1856f6f3e4 | |||
| c11022c52b | |||
| 5a7c49263c | |||
| 23a25f1dd3 | |||
| 7619f94eb2 | |||
| ab3fdf5723 | |||
| 8af54e1fd4 | |||
| 4d3e39788c | |||
| cdbb541fde | |||
| 52ab5aca3b | |||
| 2f8dbe7803 | |||
| c70e66beea | |||
| ff6b6a6296 | |||
| 8035b3a01a | |||
| ed14d7bbb3 | |||
| 7aab0d1a6d | |||
| b86b69d171 | |||
| e009496885 | |||
| 690692b494 | |||
| 5df8bdf932 | |||
| 030966c506 | |||
| 5a633a0ebb |
@@ -1,9 +1,7 @@
|
|||||||
name: Build and Push Matrix-to Docker Image
|
name: Build and Push Matrix-to Docker Image
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
workflow_dispatch: # Manueller Start
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -22,8 +20,16 @@ jobs:
|
|||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Generate Timestamp Tag
|
||||||
|
id: vars
|
||||||
|
run: echo "sha_short=$(date +%Y%m%d-%H%M)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v2
|
||||||
with:
|
with:
|
||||||
|
context: .
|
||||||
push: true
|
push: true
|
||||||
tags: domoel/matrix-to:latest
|
tags: |
|
||||||
|
domoel/matrix-to:latest
|
||||||
|
domoel/matrix-to:${{ steps.vars.outputs.sha_short }}
|
||||||
|
no-cache: true
|
||||||
|
|||||||
@@ -1,4 +1,30 @@
|
|||||||
# Matrix.to
|
<p align="center">
|
||||||
|
<a href="https://ztfr.eu/matrix">
|
||||||
|
<img src="assets/community-badge.png" alt="Join Zeitfresser Matrix Community" height="70" />
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h1 align="center">
|
||||||
|
Matrix.to Dracula Themed
|
||||||
|
</span>
|
||||||
|
<h4 align="center">
|
||||||
|
<span style="display:inline-flex; align-items:center; gap:12px;">
|
||||||
|
A simple stateless privacy-protecting URL redirecting service for Matrix Servers with an opinionated Dracula Theme
|
||||||
|
</span>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
<h6 align="center">
|
||||||
|
<a href="https://ztfr.eu">🏰 Website</a>
|
||||||
|
·
|
||||||
|
<a href="https://ztfr.eu/matrix">📰 Zeitfresser Matrix Community</a>
|
||||||
|
·
|
||||||
|
<a href="https://social.ztfr.eu/@dome">🐘 Mastodon</a>
|
||||||
|
·
|
||||||
|
<a href="https://look.ztfr.eu/#/#support:ztfr.eu">💬 Supportchat</a>
|
||||||
|
</h6>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
Matrix.to is a simple url redirection service for the Matrix.org ecosystem
|
Matrix.to is a simple url redirection service for the Matrix.org ecosystem
|
||||||
which lets users share links to matrix entities without being tied to a
|
which lets users share links to matrix entities without being tied to a
|
||||||
@@ -103,3 +129,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
- NODE_ENV=production
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 🛠 Development & Support
|
||||||
|
|
||||||
|
If you need to get support or want to participate in the active development of this software, you can <a href="https://ztfr.eu/matrix">join our Zeitfresser Matrix Community</a> or the <a href="https://look.ztfr.eu/#/#support:ztfr.eu">Development & Support Channel</a> on Matrix.
|
||||||
|
|||||||
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 277 KiB |
+56
-7
@@ -19,7 +19,7 @@
|
|||||||
.ClientView:hover {
|
.ClientView:hover {
|
||||||
background: #2f313d !important;
|
background: #2f313d !important;
|
||||||
border-left-color: var(--ztfr-purple) !important;
|
border-left-color: var(--ztfr-purple) !important;
|
||||||
transform: translateX(5px);
|
/* transform: translateX(5px); - Entfernt, damit die Kachel nicht mehr springt */
|
||||||
}
|
}
|
||||||
|
|
||||||
.ClientView.isPreferred {
|
.ClientView.isPreferred {
|
||||||
@@ -80,31 +80,80 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ClientView .actions a.badge {
|
.ClientView .actions a.badge {
|
||||||
height: auto !important; /* Erlaubt dem Bild, zu skalieren */
|
height: auto !important;
|
||||||
max-width: 100%; /* Verhindert das Rausragen */
|
max-width: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ClientView .actions img {
|
.ClientView .actions img {
|
||||||
max-width: 160px; /* Begrenzt die Breite der Store-Buttons (Google Play / F-Droid) */
|
max-width: 160px;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin: 5px auto;
|
margin: 5px auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --- ANPASSUNG FÜR DEN DEZENTEN LOOK DER BUTTONS --- */
|
||||||
|
|
||||||
|
.ClientView .actions .footer {
|
||||||
|
display: block !important;
|
||||||
|
text-align: center !important;
|
||||||
|
margin-top: 20px !important;
|
||||||
|
width: 100%;
|
||||||
|
line-height: 1.8 !important;
|
||||||
|
color: var(--sub-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset der Button-Styles: Macht aus den grauen Kästen einfachen Text mit unsichtbarem Rahmen für ruckelfreien Hover */
|
||||||
|
.ClientView .actions .footer button.change,
|
||||||
|
.ClientView .actions .footer button.custom,
|
||||||
|
.ClientView .actions .footer .custom,
|
||||||
|
.ClientView .actions .footer .custom button,
|
||||||
|
.PreviewView > .footer button.change
|
||||||
|
{
|
||||||
|
background: transparent !important;
|
||||||
|
border: none !important;
|
||||||
|
border-bottom: 1px solid transparent !important;
|
||||||
|
color: var(--sub-text) !important;
|
||||||
|
padding: 0 2px !important;
|
||||||
|
margin: 0 4px !important;
|
||||||
|
font-family: inherit !important;
|
||||||
|
font-size: inherit !important;
|
||||||
|
cursor: pointer !important;
|
||||||
|
display: inline !important;
|
||||||
|
transition: all 0.2s ease !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Der Hover-Effekt: Hellerer Text und lila Unterstrich */
|
||||||
|
.ClientView .actions .footer button.change:hover,
|
||||||
|
.ClientView .actions .footer button.custom:hover,
|
||||||
|
.ClientView .actions .footer .custom:hover,
|
||||||
|
.ClientView .actions .footer .custom button:hover,
|
||||||
|
.PreviewView > .footer button.change:hover
|
||||||
|
{
|
||||||
|
color: var(--foreground) !important;
|
||||||
|
border-bottom: 1px solid var(--ztfr-purple) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Layout-Anpassung für die Custom-Web-Instance-Zeile, damit sie sauber umbricht */
|
||||||
|
.ClientView .actions .footer .custom {
|
||||||
|
display: block !important;
|
||||||
|
margin-top: 6px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- MOBILE ANPASSUNGEN --- */
|
||||||
@media screen and (max-width: 480px) {
|
@media screen and (max-width: 480px) {
|
||||||
.ClientView {
|
.ClientView {
|
||||||
padding: 15px; /* Weniger Padding mobil */
|
padding: 15px;
|
||||||
margin: 8px 0;
|
margin: 8px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ClientView .header {
|
.ClientView .header {
|
||||||
flex-direction: column; /* Stapelt Icon und Text mobil untereinander */
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ClientView .clientIcon {
|
.ClientView .clientIcon {
|
||||||
margin: 0 0 15px 0; /* Icon zentrieren */
|
margin: 0 0 15px 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+65
-65
@@ -15,13 +15,13 @@ Modified 2026 for Zeitfresser Matrix Community Look & Mobile Fixes
|
|||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--app-background: #1e1f29; /* Tief-Anthrazit der Webseite */
|
--app-background: #1e1f29; /* Tief-Anthrazit */
|
||||||
--background: #282a36; /* Hintergrund der Card */
|
--background: #282a36; /* Card Hintergrund */
|
||||||
--foreground: #f7f7fa; /* Reines Highlight-Weiß */
|
--foreground: #f7f7fa; /* Weiß */
|
||||||
--font: #bdc3c7; /* Fließtext-Grau */
|
--font: #bdc3c7; /* Grau */
|
||||||
--grey: #64748b; /* Dunkles Grau für Identifier */
|
--grey: #64748b; /* Dunkles Grau */
|
||||||
--accent: #0dbd8b; /* Matrix-Green */
|
--accent: #0dbd8b; /* Matrix-Green */
|
||||||
--ztfr-purple: #bd93f9; /* Das Zeitfresser-Lila Akzent */
|
--ztfr-purple: #bd93f9; /* Zeitfresser-Lila */
|
||||||
--error: #ff5555;
|
--error: #ff5555;
|
||||||
--link: #f7f7fa;
|
--link: #f7f7fa;
|
||||||
--borders: #2f313d;
|
--borders: #2f313d;
|
||||||
@@ -89,7 +89,7 @@ button, input[type=submit] {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Buttons: Eckig & Kontrastreich */
|
/* --- GROSSE BUTTONS (z.B. Download, Continue) --- */
|
||||||
.primary, .secondary {
|
.primary, .secondary {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -99,8 +99,12 @@ button, input[type=submit] {
|
|||||||
display: block;
|
display: block;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
transition: all 0.2s ease;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
/* Simplifizierung: Nur Farbe, keine Bewegung */
|
||||||
|
transition: background-color 0.2s ease, filter 0.2s ease;
|
||||||
|
transform: none !important;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
|
|
||||||
.primary {
|
.primary {
|
||||||
@@ -125,7 +129,43 @@ button, input[type=submit] {
|
|||||||
background: rgba(255,255,255,0.05);
|
background: rgba(255,255,255,0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fix für Button-Container (entfernt versteckte Gaps) */
|
/* --- DEZENTE BUTTONS (Change, Custom Instance, Footer-Style) --- */
|
||||||
|
.ClientListView button.change,
|
||||||
|
.PreviewView button.change,
|
||||||
|
.ClientView button.custom,
|
||||||
|
.ClientView .footer button,
|
||||||
|
.CustomInstanceView .actions button.secondary,
|
||||||
|
.footer button,
|
||||||
|
.footer a {
|
||||||
|
background: none !important;
|
||||||
|
border: none !important;
|
||||||
|
color: var(--grey) !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
font-family: inherit !important;
|
||||||
|
font-size: inherit !important;
|
||||||
|
font-weight: normal !important;
|
||||||
|
text-transform: none !important;
|
||||||
|
letter-spacing: normal !important;
|
||||||
|
cursor: pointer !important;
|
||||||
|
display: inline !important;
|
||||||
|
width: auto !important;
|
||||||
|
border-bottom: 1px solid rgba(189, 195, 199, 0.3) !important;
|
||||||
|
transition: all 0.3s ease !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ClientListView button.change:hover,
|
||||||
|
.PreviewView button.change:hover,
|
||||||
|
.ClientView button.custom:hover,
|
||||||
|
.ClientView .footer button:hover,
|
||||||
|
.CustomInstanceView .actions button.secondary:hover,
|
||||||
|
.footer button:hover,
|
||||||
|
.footer a:hover {
|
||||||
|
color: var(--foreground) !important;
|
||||||
|
border-bottom-color: var(--ztfr-purple) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix für Button-Container */
|
||||||
.actions,
|
.actions,
|
||||||
.ClientView .actions,
|
.ClientView .actions,
|
||||||
.ClientListView .actions,
|
.ClientListView .actions,
|
||||||
@@ -135,12 +175,11 @@ button, input[type=submit] {
|
|||||||
gap: 0px !important;
|
gap: 0px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Entfernt den Abstand beim letzten Button in einer Gruppe für saubere Optik */
|
|
||||||
.actions > *:last-child {
|
.actions > *:last-child {
|
||||||
margin-bottom: 0 !important;
|
margin-bottom: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Input Felder: Dunkel statt Weiß */
|
/* Input Felder */
|
||||||
input[type='text'].large {
|
input[type='text'].large {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 14px;
|
padding: 14px;
|
||||||
@@ -164,60 +203,21 @@ input[type='text'].large {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer ul {
|
.footer ul { list-style: none; padding: 0; margin: 0; }
|
||||||
list-style: none;
|
.footer li { display: inline; margin: 0; }
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer li {
|
|
||||||
display: inline;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a {
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
border-bottom: 1px solid rgba(189, 195, 199, 0.3);
|
|
||||||
transition: all 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a:hover {
|
|
||||||
color: var(--foreground) !important;
|
|
||||||
border-bottom-color: var(--ztfr-purple) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer button,
|
|
||||||
.footer input[type="submit"],
|
|
||||||
.ClientListView button.change,
|
|
||||||
.PreviewView button.change {
|
|
||||||
background: none !important;
|
|
||||||
border: none !important;
|
|
||||||
color: var(--grey) !important;
|
|
||||||
padding: 0 !important;
|
|
||||||
font-family: inherit !important;
|
|
||||||
font-size: inherit !important;
|
|
||||||
cursor: pointer !important;
|
|
||||||
border-bottom: 1px solid rgba(189, 195, 199, 0.3) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer button:hover {
|
|
||||||
color: var(--foreground) !important;
|
|
||||||
border-bottom-color: var(--ztfr-purple) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* SPEZIELLE MOBILE ANPASSUNGEN */
|
|
||||||
@media screen and (max-width: 480px) {
|
@media screen and (max-width: 480px) {
|
||||||
body {
|
body { padding: 40px 10px 0 10px; }
|
||||||
padding: 40px 10px 0 10px;
|
.card { padding: 1.5rem; border-radius: 2px; }
|
||||||
}
|
h1 { font-size: 1.5rem; }
|
||||||
|
}
|
||||||
.card {
|
|
||||||
padding: 1.5rem;
|
.memberCount.hidden,
|
||||||
border-radius: 2px;
|
.topic.hidden {
|
||||||
}
|
display: none !important;
|
||||||
|
}
|
||||||
h1 {
|
|
||||||
font-size: 1.5rem;
|
.memberCount:has(p:empty),
|
||||||
}
|
.topic:empty {
|
||||||
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,12 +51,22 @@ class LoadedPreviewView extends TemplateView {
|
|||||||
return t.div({className: "defaultAvatar"});
|
return t.div({className: "defaultAvatar"});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const hasMemberCount = vm => vm.memberCount && String(vm.memberCount) !== "null";
|
||||||
|
const hasTopic = vm => vm.topic && String(vm.topic) !== "null";
|
||||||
|
|
||||||
return t.div({className: vm.isSpaceRoom ? "mxSpace" : undefined}, [
|
return t.div({className: vm.isSpaceRoom ? "mxSpace" : undefined}, [
|
||||||
t.div({className: "avatarContainer"}, avatar),
|
t.div({className: "avatarContainer"}, avatar),
|
||||||
t.h1(vm => vm.name),
|
t.h1(vm => vm.name),
|
||||||
t.p({className: {identifier: true, hidden: vm => !vm.identifier}}, vm => vm.identifier),
|
t.p({className: {identifier: true, hidden: vm => !vm.identifier}}, vm => vm.identifier),
|
||||||
t.div({className: {memberCount: true, hidden: vm => !vm.memberCount}}, t.p([vm => vm.memberCount, " members"])),
|
|
||||||
t.p({className: {topic: true, hidden: vm => !vm.topic}}, [vm => vm.topic]),
|
t.div({className: {memberCount: true, hidden: vm => !hasMemberCount(vm)}},
|
||||||
|
t.p([vm => hasMemberCount(vm) ? vm.memberCount + " members" : ""])
|
||||||
|
),
|
||||||
|
|
||||||
|
t.p({className: {topic: true, hidden: vm => !hasTopic(vm)}},
|
||||||
|
[vm => hasTopic(vm) ? vm.topic : ""]
|
||||||
|
),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user