Green instead of gold, and a leaf that reads at 16px

The brand accent was rune gold. It is now mallorn green: --gold becomes
--leaf in tokens.css and everywhere it resolved, and the mark's wafer is
the green of the leaves lembas travels wrapped in rather than the biscuit
inside. Yellow is left to mean exactly one thing in the interface -- a
warning -- instead of two.

Two knock-on choices the rename forced:

  - Code keywords move from the brand accent to --warning. Strings are
    --success, which is green; keywords in leaf green beside them is not
    a colour scheme.
  - --success itself leans teal now. Two greens a hue apart read as one
    colour rendered badly, and an unread dot has to be tellable from a
    brand badge at a glance.

The mark is redrawn, not just recoloured. The blade is ovate -- widest a
third up from the base, rounded where the stem meets it, drawn out only
at the tip -- because the old one was pointed at both ends and read as an
eye. It is also much larger relative to the tile: at 16px the silhouette
is all that survives, and a small leaf on a large tile is a green square
with a smudge on it. Veins sweep towards the tip and shorten as the blade
narrows. The score cross is thinner and fainter so it stays texture.

A single diagonal score was tried first and rejected: behind a diagonal
leaf it does not read as scoring, it reads as a line struck through the
mark.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jaroslav Beneš
2026-07-31 22:24:53 +02:00
parent 2a79d962a3
commit 71dc46455c
30 changed files with 322 additions and 281 deletions
+19 -18
View File
@@ -20,33 +20,34 @@
<svg class="{{ cls }}" viewBox="0 0 64 64" role="img" aria-label="LLeMbas">
<defs>
<linearGradient id="mk-{{ uid }}-w" x1="0" y1="0" x2="0.3" y2="1">
<stop offset="0" stop-color="#EACB74"/>
<stop offset="0.5" stop-color="#C9A227"/>
<stop offset="1" stop-color="#916F13"/>
<stop offset="0" stop-color="#7FB758"/>
<stop offset="0.5" stop-color="#4C8C33"/>
<stop offset="1" stop-color="#2A5522"/>
</linearGradient>
<linearGradient id="mk-{{ uid }}-l" x1="0.1" y1="1" x2="0.9" y2="0">
<stop offset="0" stop-color="#93A5B6"/>
<stop offset="0.4" stop-color="#F1F6FA"/>
<stop offset="1" stop-color="#B8C7D5"/>
<stop offset="0" stop-color="#9DB49A"/>
<stop offset="0.4" stop-color="#F3F8EE"/>
<stop offset="1" stop-color="#C6D8BE"/>
</linearGradient>
<clipPath id="mk-{{ uid }}-c"><rect x="6" y="6" width="52" height="52" rx="13"/></clipPath>
<clipPath id="mk-{{ uid }}-c"><rect x="5" y="5" width="54" height="54" rx="14"/></clipPath>
</defs>
<rect x="6" y="6" width="52" height="52" rx="13" fill="url(#mk-{{ uid }}-w)"/>
<rect x="5" y="5" width="54" height="54" rx="14" fill="url(#mk-{{ uid }}-w)"/>
<g clip-path="url(#mk-{{ uid }}-c)" fill="none" stroke-linecap="round">
<g stroke="#7A5C10" stroke-opacity="0.38" stroke-width="2">
<path d="M32 6 V58"/><path d="M6 32 H58"/>
<g stroke="#1F4019" stroke-opacity="0.30" stroke-width="1.8">
<path d="M32 5 V59"/><path d="M5 32 H59"/>
</g>
<g stroke="#F6E3A8" stroke-opacity="0.3" stroke-width="1">
<path d="M33.2 6 V58"/><path d="M6 33.2 H58"/>
<g stroke="#C7E7A6" stroke-opacity="0.20" stroke-width="0.9">
<path d="M33.1 5 V59"/><path d="M5 33.1 H59"/>
</g>
</g>
<rect x="7.1" y="7.1" width="49.8" height="49.8" rx="11.9" fill="none"
stroke="#7A5C10" stroke-opacity="0.3" stroke-width="1.2"/>
<path d="M21.2 44.8 L17 49.4" stroke="#8A9AA8" stroke-width="3"
<rect x="6.1" y="6.1" width="51.8" height="51.8" rx="12.9" fill="none"
stroke="#1F4019" stroke-opacity="0.32" stroke-width="1.2"/>
<path d="M21.4 45.6 L16.3 51.2" stroke="#8B9E86" stroke-width="3"
stroke-linecap="round" fill="none"/>
<path d="M20.5 45.5 C13.8 31.7 23.8 20.9 45.5 18.5 C49.8 35 39.8 45.8 20.5 45.5 Z"
<path d="M21 46 C19.6 40.5 20.4 34.2 23.4 30.5 C27.5 25.5 35 20.5 46 18
C43.5 26.5 40.5 36.5 36.1 41.9 C33 45.6 26.5 47 21 46 Z"
fill="url(#mk-{{ uid }}-l)"/>
<path d="M20.5 45.5 C28 38 36 29 45.5 18.5" fill="none" stroke="#61758A"
<path d="M21 46 Q30.5 34.5 46 18" fill="none" stroke="#57734F"
stroke-opacity="0.5" stroke-width="1.5" stroke-linecap="round"/>
</svg>
{%- endmacro %}
@@ -54,7 +55,7 @@
{#
The wordmark as live text rather than the outlined SVG: it stays selectable,
searchable and readable to a screen reader, and scales with the user's font
size. The capitals spelling LLM take the gold accent.
size. The capitals spelling LLM take the leaf accent.
#}
{% macro wordmark() -%}
<span class="brand-llm">LL</span>e<span class="brand-llm">M</span>bas
@@ -38,7 +38,7 @@
</div>
<div class="btn-row">
{% if model.model_id == default_model %}
<span class="badge badge--gold">{{ icon("star", "icon--sm") }} default model</span>
<span class="badge badge--leaf">{{ icon("star", "icon--sm") }} default model</span>
{% else %}
<form method="post" action="/admin/models/{{ model.id }}/default">
<button class="btn btn--sm" type="submit">
+2 -2
View File
@@ -92,13 +92,13 @@
<div class="model-row__title">
<a class="model-row__name" href="/admin/models/{{ model.id }}/edit">{{ model.label }}</a>
{% if model.model_id == default_model %}
<span class="badge badge--gold">default</span>
<span class="badge badge--leaf">default</span>
{% endif %}
{% if model.pinned %}<span class="badge">pinned</span>{% endif %}
{% if not model.enabled %}<span class="badge badge--danger">disabled</span>{% endif %}
{% if not model.public %}<span class="badge">restricted</span>{% endif %}
{% for name, on in (model.capabilities_json or {}).items() %}
{% if on %}<span class="badge badge--gold">{{ name }}</span>{% endif %}
{% if on %}<span class="badge badge--leaf">{{ name }}</span>{% endif %}
{% endfor %}
</div>
<code class="model-row__id">{{ model.model_id }} · {{ model.connection.name }}</code>
+1 -1
View File
@@ -68,7 +68,7 @@
<span class="status-dot {{ 'is-ok' if account.active else 'is-off' }}"></span>
<strong class="truncate">{{ account.name }}</strong>
<code class="text-xs faint">{{ account.email }}</code>
{% if account.is_admin %}<span class="badge badge--gold">admin</span>{% endif %}
{% if account.is_admin %}<span class="badge badge--leaf">admin</span>{% endif %}
{% if not account.active %}<span class="badge badge--danger">deactivated</span>{% endif %}
{% if account.id == user.id %}<span class="badge">you</span>{% endif %}
</div>
+1 -1
View File
@@ -14,7 +14,7 @@
<h2 class="card__title">
Shared with
{% if shared_users or shared_groups %}
<span class="badge badge--gold">{{ shared_users|length + shared_groups|length }}</span>
<span class="badge badge--leaf">{{ shared_users|length + shared_groups|length }}</span>
{% else %}
<span class="badge">nobody</span>
{% endif %}
+1 -1
View File
@@ -44,7 +44,7 @@
<div class="text-xs faint">{{ note.body[:160] }}{{ "…" if note.body|length > 160 }}</div>
</div>
<div class="btn-row">
{% if note.author == "model" %}<span class="badge badge--gold">written by a model</span>{% endif %}
{% if note.author == "model" %}<span class="badge badge--leaf">written by a model</span>{% endif %}
{% if note.owner_id != user.id %}<span class="badge">shared</span>{% endif %}
</div>
</li>
@@ -103,7 +103,7 @@
<div style="min-width: 0">
<strong>{{ revision.created_at.strftime("%Y-%m-%d %H:%M") }}</strong>
{% if revision.author == "model" %}
<span class="badge badge--gold">model</span>
<span class="badge badge--leaf">model</span>
{% else %}
<span class="badge">you</span>
{% endif %}
+1 -1
View File
@@ -46,7 +46,7 @@
</div>
<div class="btn-row">
{% if not skill.enabled %}<span class="badge">off</span>{% endif %}
{% if skill.author == "model" %}<span class="badge badge--gold">written by a model</span>{% endif %}
{% if skill.author == "model" %}<span class="badge badge--leaf">written by a model</span>{% endif %}
{% if skill.owner_id != user.id %}<span class="badge">shared</span>{% endif %}
</div>
</li>
@@ -80,7 +80,7 @@
<a class="nav-item" href="/settings">
{{ icon("user", "icon--sm") }}
<span class="nav-item__label">{{ user.name }}</span>
{% if user.is_admin %}<span class="badge badge--gold">admin</span>{% endif %}
{% if user.is_admin %}<span class="badge badge--leaf">admin</span>{% endif %}
</a>
<div class="sidebar__tools">
+3 -3
View File
@@ -70,7 +70,7 @@
<dt>Name</dt><dd>{{ user.name }}</dd>
<dt>Email</dt><dd class="mono">{{ user.email }}</dd>
<dt>Role</dt>
<dd><span class="badge {{ 'badge--gold' if user.is_admin }}">{{ user.role }}</span></dd>
<dd><span class="badge {{ 'badge--leaf' if user.is_admin }}">{{ user.role }}</span></dd>
<dt>Groups</dt>
<dd>
{% if user.groups %}
@@ -149,7 +149,7 @@
</div>
<div class="btn-row">
{% for name, on in (model.capabilities_json or {}).items() %}
{% if on %}<span class="badge badge--gold">{{ name }}</span>{% endif %}
{% if on %}<span class="badge badge--leaf">{{ name }}</span>{% endif %}
{% endfor %}
{% if model.pinned %}<span class="badge">pinned</span>{% endif %}
</div>
@@ -312,7 +312,7 @@
</button>
</form>
{% if memory.author == "model" %}
<span class="badge badge--gold">remembered</span>
<span class="badge badge--leaf">remembered</span>
{% endif %}
</li>
{% endfor %}