diff --git a/app/templates/_icons.html b/app/templates/_icons.html
new file mode 100644
index 0000000..cb8ad39
--- /dev/null
+++ b/app/templates/_icons.html
@@ -0,0 +1,51 @@
+{#
+ Gemeinsame Icons (angelehnt an Lucide, MIT-lizenziert), inline als SVG.
+ Monochrom über currentColor – Farbe wird vom umgebenden Element gesetzt.
+ Verwendung: {% import "_icons.html" as icons %} ... {{ icons.edit() }}
+#}
+
+{% macro base(path, size=16) -%}
+{{ path | safe }}
+{%- endmacro %}
+
+{% macro grid(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro bookmark(filled=False, size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro edit(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro trash(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro search(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro plus(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro alert(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro sparkles(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro clock(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
+
+{% macro spinner(size=16) -%}
+{{ base(' ', size) }}
+{%- endmacro %}
diff --git a/app/templates/_link_card.html b/app/templates/_link_card.html
index f6ab1e0..5d900e9 100644
--- a/app/templates/_link_card.html
+++ b/app/templates/_link_card.html
@@ -1,3 +1,4 @@
+{% import "_icons.html" as icons %}
@@ -14,23 +15,22 @@
- {% if link.needs_review %}🔖{% else %}🏷️{% endif %}
- {{ icons.bookmark(filled=link.needs_review) }}
+ ✎
- {{ icons.edit() }}
+ ✕
+ hx-confirm="Diesen Link wirklich löschen?">{{ icons.trash() }}
@@ -58,6 +58,8 @@
diff --git a/app/templates/_link_card_edit.html b/app/templates/_link_card_edit.html
index ab4502c..da11230 100644
--- a/app/templates/_link_card_edit.html
+++ b/app/templates/_link_card_edit.html
@@ -1,3 +1,4 @@
+{% import "_icons.html" as icons %}
- 🕓 hinzugefügt am {{ link.created_at | datum }}
+ {{ icons.clock(size=13) }} hinzugefügt am {{ link.created_at | datum }}
@@ -59,7 +60,8 @@
hx-swap="outerHTML"
hx-disabled-elt="this"
hx-confirm="Link erneut laden und von der KI neu beschreiben lassen? Bestehende Angaben werden dabei ersetzt.">
- ⏳ 🤖 KI neu beschreiben lassen
+ {{ icons.spinner(size=14) }}
+ {{ icons.sparkles(size=14) }} KI neu beschreiben lassen
{% endif %}
diff --git a/app/templates/base.html b/app/templates/base.html
index 5964cf1..33aa95c 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -128,6 +128,23 @@
.htmx-indicator { opacity: 0; transition: opacity .2s; }
.htmx-request .htmx-indicator { opacity: 1; }
.htmx-request.htmx-indicator { opacity: 1; }
+
+ .icon { display: inline-block; vertical-align: -3px; flex-shrink: 0; }
+ .icon-spin { animation: icon-spin 0.8s linear infinite; }
+ @keyframes icon-spin { to { transform: rotate(360deg); } }
+ .icon-btn {
+ display: inline-flex; align-items: center; justify-content: center;
+ width: 30px; height: 30px; padding: 0;
+ }
+ .icon-warn { color: #eab308; }
+ .icon-bookmark-active { color: #eab308; }
+
+ .input-icon { position: relative; }
+ .input-icon > .icon {
+ position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
+ color: var(--muted); pointer-events: none;
+ }
+ .input-icon > input { padding-left: 36px; }
footer.app-footer {
text-align: center; padding: 16px 24px; margin-top: 24px;
color: var(--muted); font-size: .8rem; border-top: 1px solid var(--border);
diff --git a/app/templates/index.html b/app/templates/index.html
index b1bca80..8a68662 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -1,12 +1,13 @@
{% extends "base.html" %}
+{% import "_icons.html" as icons %}
{% block title %}Meine Links · LinkVault{% endblock %}
{% block body %}
LinkVault
{% if not ai_enabled %}
-
- ⚠️ KI aus
+
+ {{ icons.alert(size=14) }} KI aus
{% endif %}
{{ user.email }}
@@ -20,7 +21,7 @@