+
+ {{ (link.url | domain)[:1] | upper or '?' }}
+
+
+
+ {% if link.category %}
+ {{ link.category }}
+ {% endif %}
+ {% if link.manufacturer %}
+ {{ link.manufacturer }}
+ {% endif %}
-
-
- {% if link.summary %}
-
{{ link.summary }}
- {% elif link.status == 'no_content' %}
-
- Inhalt konnte nicht abgerufen werden – Kategorisierung anhand der URL.
-
- {% endif %}
+
+ {{ link.title or link.url }}
+
-
- {% if link.category %}
-
- {{ link.category }}
-
- {% endif %}
- {% if link.manufacturer %}
-
- 🏢 {{ link.manufacturer }}
-
- {% endif %}
+
+ {%- if link.summary -%}
+ {{ link.summary }}
+ {%- elif link.status == 'no_content' -%}
+ Inhalt konnte nicht abgerufen werden – Kategorisierung anhand der URL.
+ {%- endif -%}
+
+
+
+
+ {% if link.tag_list %}
+
{% for tag in link.tag_list %}
-
- #{{ tag }}
-
+ #{{ tag }}
{% endfor %}
+ {% endif %}
+
+
diff --git a/app/templates/base.html b/app/templates/base.html
index f058187..423fd79 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -49,10 +49,59 @@
.main { flex: 1; min-width: 0; }
.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px; margin-bottom: 16px; }
- /* Linkliste: bis zu drei Karten pro Zeile, je nach Fensterbreite. */
- #links { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; align-items: start; }
+ /* Linkliste: bis zu drei Karten pro Zeile, je nach Fensterbreite.
+ Karten einer Zeile sind gleich hoch; die Zusammenfassung wird
+ dafür auf drei Zeilen gekürzt. */
+ #links { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; }
#links > .panel { margin-bottom: 0; }
#links > #empty-state { grid-column: 1 / -1; }
+
+ .link-card { display: flex; flex-direction: column; }
+ .card-head { display: flex; align-items: flex-start; gap: 8px; margin-bottom: 10px; }
+ .card-avatar {
+ flex-shrink: 0; width: 34px; height: 34px; border-radius: 9px;
+ display: inline-flex; align-items: center; justify-content: center;
+ font-weight: 700; font-size: 1rem;
+ background: hsl(var(--h) 45% 22%); color: hsl(var(--h) 80% 78%);
+ border: 1px solid hsl(var(--h) 40% 32%);
+ }
+ .card-badges {
+ display: flex; gap: 4px; flex: 1; min-width: 0;
+ overflow: hidden; max-height: 22px; align-items: flex-start;
+ }
+ .card-actions { display: flex; gap: 4px; flex-shrink: 0; }
+ .badge {
+ font-size: .7rem; padding: 2px 8px; border-radius: 99px;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
+ }
+ .badge-cat { background: var(--accent); color: #fff; }
+ .badge-man { background: #0e7490; color: #cffafe; }
+ .badge-tag { background: var(--panel2); color: var(--muted); }
+ /* Feste Höhen für Titel und Zusammenfassung: so beginnt jeder Block auf
+ gleicher Höhe und das Kürzen mit "…" greift zuverlässig. */
+ .card-title {
+ font-weight: 600; font-size: 1rem; line-height: 1.35; margin-bottom: 6px;
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
+ overflow: hidden; height: calc(2 * 1.35 * 1rem); flex: none;
+ }
+ .card-summary {
+ margin: 0 0 12px; font-size: .875rem; color: var(--muted); line-height: 1.5;
+ display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
+ overflow: hidden; height: calc(3 * 1.5 * .875rem); flex: none;
+ }
+ .card-spacer { flex: 1 1 auto; }
+ /* Tags: nur eine Zeile, Rest wird abgeschnitten – hält die Karten gleich hoch. */
+ .card-tags {
+ display: flex; gap: 4px;
+ overflow: hidden; max-height: 22px; flex-wrap: wrap;
+ }
+ .card-foot {
+ padding-top: 10px; border-top: 1px solid var(--border);
+ display: flex; justify-content: space-between; gap: 8px;
+ font-size: .75rem; color: var(--muted);
+ }
+ .card-domain { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+ .card-foot > span:last-child { flex-shrink: 0; }
@media (min-width: 1000px) { #links { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1500px) { #links { grid-template-columns: repeat(3, minmax(0, 1fr)); } }