28 Commits

Author SHA1 Message Date
Dome 9c3b688178 Update README.md 2026-04-21 11:59:17 +02:00
Dome 45973252bb Update README.md 2026-04-12 22:23:38 +02:00
Dome a7daa84054 Update README.md 2026-04-12 22:08:27 +02:00
Dome df9598ff6b Update README.md 2026-04-12 22:07:36 +02:00
Dome 93d1942728 Update README.md 2026-04-12 21:51:31 +02:00
Dome 84738fec6b Update README.md 2026-04-12 21:51:07 +02:00
Dome 1856f6f3e4 updated community badge asset link 2026-04-12 21:50:07 +02:00
Dome c11022c52b Update README.md 2026-04-12 01:07:40 +02:00
Dome 5a7c49263c Update README.md 2026-04-12 01:06:55 +02:00
Dome 23a25f1dd3 Add files via upload 2026-04-12 01:05:50 +02:00
Dome 7619f94eb2 Create ztfr.png 2026-04-12 01:05:29 +02:00
Dome ab3fdf5723 Update PreviewView.js 2026-04-08 16:47:01 +02:00
Dome 8af54e1fd4 Update PreviewView.js 2026-04-08 16:40:16 +02:00
Dome 4d3e39788c Update PreviewView.js 2026-04-08 16:30:01 +02:00
Dome cdbb541fde Update main.css 2026-04-08 16:29:05 +02:00
Dome 52ab5aca3b Update PreviewView.js 2026-04-08 16:20:12 +02:00
Dome 2f8dbe7803 Update client.css 2026-04-08 16:01:19 +02:00
Dome c70e66beea Update docker-image.yml 2026-04-08 15:49:04 +02:00
Dome ff6b6a6296 Update Dockerfile 2026-04-08 09:11:20 +02:00
Dome 8035b3a01a Update Dockerfile 2026-04-08 09:08:23 +02:00
Dome ed14d7bbb3 Update docker-image.yml 2026-04-08 09:02:31 +02:00
Dome 7aab0d1a6d Update docker-image.yml 2026-04-08 08:51:06 +02:00
Dome b86b69d171 Hide null values in user profiles in CSS 2026-04-08 00:28:09 +02:00
Dome e009496885 Update docker-image.yml 2026-04-08 00:09:14 +02:00
Dome 690692b494 Fix media query formatting in main.css 2026-04-07 23:49:04 +02:00
Dome 5df8bdf932 Update client.css 2026-04-07 23:48:49 +02:00
Dome 030966c506 Update main.css 2026-04-07 23:37:59 +02:00
Dome 5a633a0ebb Update client.css 2026-04-07 23:37:46 +02:00
6 changed files with 174 additions and 79 deletions
+10 -4
View File
@@ -1,9 +1,7 @@
name: Build and Push Matrix-to Docker Image
on:
push:
branches:
- main
workflow_dispatch: # Manueller Start
jobs:
build:
@@ -22,8 +20,16 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
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
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: domoel/matrix-to:latest
tags: |
domoel/matrix-to:latest
domoel/matrix-to:${{ steps.vars.outputs.sha_short }}
no-cache: true
+31 -1
View File
@@ -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
which lets users share links to matrix entities without being tied to a
@@ -103,3 +129,7 @@ services:
environment:
- 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.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

+56 -7
View File
@@ -19,7 +19,7 @@
.ClientView:hover {
background: #2f313d !important;
border-left-color: var(--ztfr-purple) !important;
transform: translateX(5px);
/* transform: translateX(5px); - Entfernt, damit die Kachel nicht mehr springt */
}
.ClientView.isPreferred {
@@ -80,31 +80,80 @@
}
.ClientView .actions a.badge {
height: auto !important; /* Erlaubt dem Bild, zu skalieren */
max-width: 100%; /* Verhindert das Rausragen */
height: auto !important;
max-width: 100%;
display: block;
}
.ClientView .actions img {
max-width: 160px; /* Begrenzt die Breite der Store-Buttons (Google Play / F-Droid) */
max-width: 160px;
height: auto;
display: block;
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) {
.ClientView {
padding: 15px; /* Weniger Padding mobil */
padding: 15px;
margin: 8px 0;
}
.ClientView .header {
flex-direction: column; /* Stapelt Icon und Text mobil untereinander */
flex-direction: column;
align-items: center;
text-align: center;
}
.ClientView .clientIcon {
margin: 0 0 15px 0; /* Icon zentrieren */
margin: 0 0 15px 0;
}
}
+61 -61
View File
@@ -15,13 +15,13 @@ Modified 2026 for Zeitfresser Matrix Community Look & Mobile Fixes
}
:root {
--app-background: #1e1f29; /* Tief-Anthrazit der Webseite */
--background: #282a36; /* Hintergrund der Card */
--foreground: #f7f7fa; /* Reines Highlight-Weiß */
--font: #bdc3c7; /* Fließtext-Grau */
--grey: #64748b; /* Dunkles Grau für Identifier */
--app-background: #1e1f29; /* Tief-Anthrazit */
--background: #282a36; /* Card Hintergrund */
--foreground: #f7f7fa; /* Weiß */
--font: #bdc3c7; /* Grau */
--grey: #64748b; /* Dunkles Grau */
--accent: #0dbd8b; /* Matrix-Green */
--ztfr-purple: #bd93f9; /* Das Zeitfresser-Lila Akzent */
--ztfr-purple: #bd93f9; /* Zeitfresser-Lila */
--error: #ff5555;
--link: #f7f7fa;
--borders: #2f313d;
@@ -89,7 +89,7 @@ button, input[type=submit] {
width: 100%;
}
/* Buttons: Eckig & Kontrastreich */
/* --- GROSSE BUTTONS (z.B. Download, Continue) --- */
.primary, .secondary {
text-decoration: none;
font-weight: bold;
@@ -99,8 +99,12 @@ button, input[type=submit] {
display: block;
text-transform: uppercase;
letter-spacing: 1px;
transition: all 0.2s ease;
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 {
@@ -125,7 +129,43 @@ button, input[type=submit] {
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,
.ClientView .actions,
.ClientListView .actions,
@@ -135,12 +175,11 @@ button, input[type=submit] {
gap: 0px !important;
}
/* Entfernt den Abstand beim letzten Button in einer Gruppe für saubere Optik */
.actions > *:last-child {
margin-bottom: 0 !important;
}
/* Input Felder: Dunkel statt Weiß */
/* Input Felder */
input[type='text'].large {
width: 100%;
padding: 14px;
@@ -164,60 +203,21 @@ input[type='text'].large {
width: 100%;
}
.footer ul {
list-style: none;
padding: 0;
margin: 0;
}
.footer ul { list-style: none; padding: 0; margin: 0; }
.footer li { display: inline; 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) {
body {
padding: 40px 10px 0 10px;
body { padding: 40px 10px 0 10px; }
.card { padding: 1.5rem; border-radius: 2px; }
h1 { font-size: 1.5rem; }
}
.card {
padding: 1.5rem;
border-radius: 2px;
.memberCount.hidden,
.topic.hidden {
display: none !important;
}
h1 {
font-size: 1.5rem;
}
.memberCount:has(p:empty),
.topic:empty {
display: none !important;
}
+12 -2
View File
@@ -51,12 +51,22 @@ class LoadedPreviewView extends TemplateView {
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}, [
t.div({className: "avatarContainer"}, avatar),
t.h1(vm => vm.name),
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 : ""]
),
]);
}
}