Index: src/views/pages/admin-site-edit.ejs
===================================================================
--- src/views/pages/admin-site-edit.ejs	(revision 2165b6d3d57ceaa8b5d1f70491868482149470cf)
+++ src/views/pages/admin-site-edit.ejs	(revision 7bc636b391c66ac399c33e54f7173a022c6a3cbd)
@@ -1,5 +1,5 @@
 <div class="container admin-site-edit-page">
-  <p><a href="/admin" class="btn">&larr; <%= t('asite.back_admin') %></a></p>
-  <h1><%= isNew ? t('asite.title_new') : t('asite.title_edit') + ': ' + site.title %></h1>
+  <p><a href="/admin/sites" class="btn">&larr; Sites</a></p>
+  <h1><%= isNew ? 'New site' : 'Edit: ' + site.title %></h1>
 
   <% if (typeof success !== 'undefined' && success) { %><div class="audio-flash audio-flash--ok"><%= success %></div><% } %>
@@ -9,32 +9,28 @@
 
     <fieldset>
-      <legend><%= t('asite.identity') %></legend>
-      <label>
-        <span><%= t('asite.slug') %> <% if (!isNew) { %><em><%= t('asite.slug_fixed') %></em><% } %></span>
-        <span class="slug-url">
-          <span class="slug-url-host" id="slug-host"
-                data-prefix="/">website.com/</span><input
-                type="text" name="slug" id="slug-input" class="slug-url-input" value="<%= site.slug %>" required <% if (!isNew) { %>readonly<% } %>
-                pattern="[a-z0-9_-]{2,40}" placeholder="<%= t('asite.slug_placeholder') %>"
-                autocapitalize="none" autocorrect="off" spellcheck="false">
-        </span>
-      </label>
-      <label>
-        <span><%= t('asite.field_title') %> <small class="form-hint-inline"><%= t('asite.field_title_hint') %></small></span>
+      <legend>Identity</legend>
+      <label>
+        <span>Slug <% if (!isNew) { %><em>(immutable)</em><% } %></span>
+        <input type="text" name="slug" value="<%= site.slug %>" required <% if (!isNew) { %>readonly<% } %>
+               pattern="[a-z0-9_-]{2,40}"
+               placeholder="bedrijf1">
+      </label>
+      <label>
+        <span>Title <small class="form-hint-inline">— shown in the header and as display name</small></span>
         <input type="text" name="title" value="<%= site.title || '' %>" required maxlength="200">
       </label>
       <label>
-        <span><%= t('asite.tagline') %> <small class="form-hint-inline"><%= t('asite.tagline_hint') %></small></span>
+        <span>Tagline <small class="form-hint-inline">— short one-liner</small></span>
         <input type="text" name="tagline" value="<%= site.tagline || '' %>" maxlength="200">
       </label>
       <label>
-        <span><%= t('asite.bio') %> <small class="form-hint-inline"><%= t('asite.bio_hint') %></small></span>
+        <span>Bio / description <small class="form-hint-inline">— shown in the profile header and used for SEO</small></span>
         <textarea name="description" rows="3" maxlength="500"><%= site.description || '' %></textarea>
       </label>
       <label>
-        <span><%= t('asite.profile_photo') %></span>
+        <span>Profile photo</span>
         <div class="photo-picker" id="photo-picker">
           <div class="photo-thumb" id="photo-thumb" <%= site.profile_photo ? '' : 'data-empty' %>>
-            <img id="photo-preview" src="<%= avatar(site.profile_photo || '', 128) %>" alt="" <%= site.profile_photo ? '' : 'hidden' %>>
+            <img id="photo-preview" src="<%= site.profile_photo || '' %>" alt="" <%= site.profile_photo ? '' : 'hidden' %>>
             <span class="photo-empty" aria-hidden="true">
               <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
@@ -42,8 +38,8 @@
           </div>
           <div class="photo-controls">
-            <input type="text" name="profile_photo" id="photo-url" value="<%= site.profile_photo || '' %>" placeholder="<%= t('asite.photo_url_placeholder') %>">
+            <input type="text" name="profile_photo" id="photo-url" value="<%= site.profile_photo || '' %>" placeholder="/media/avatars/foo.jpg of https://…">
             <div class="photo-actions">
-              <button type="button" class="btn" id="photo-upload-trigger"><%= t('asite.photo_upload') %></button>
-              <button type="button" class="btn" id="photo-clear" <%= site.profile_photo ? '' : 'hidden' %>><%= t('asite.photo_clear') %></button>
+              <button type="button" class="btn" id="photo-upload-trigger">📷 Upload</button>
+              <button type="button" class="btn" id="photo-clear" <%= site.profile_photo ? '' : 'hidden' %>>Verwijder</button>
               <small id="photo-status" class="form-hint photo-status"></small>
             </div>
@@ -53,15 +49,15 @@
       </label>
       <label>
-        <span><%= t('asite.language') %></span>
+        <span>Language (ISO code)</span>
         <input type="text" name="language" value="<%= site.language || 'nl' %>" maxlength="8">
       </label>
       <label class="cb">
         <input type="checkbox" name="profile_enabled" value="1" <%= site.profile_enabled ? 'checked' : '' %>>
-        <span><%= t('asite.profile_enabled') %></span>
+        <span>Show profile header below the nav</span>
       </label>
     </fieldset>
 
     <fieldset>
-      <legend><%= t('asite.appearance') %></legend>
+      <legend>Appearance</legend>
 
       <%# ── Curated accent picker ───────────────────────────────────────
@@ -70,5 +66,5 @@
           still what's stored in the DB — we just constrain WHICH hex. %>
       <fieldset class="accent-grid">
-        <legend><%= t('asite.accent_color') %></legend>
+        <legend>Accent color</legend>
         <% const _curAccent = (site.accent || '#c2410c').toLowerCase(); %>
         <% accents.forEach(function(a) { %>
@@ -87,25 +83,25 @@
           visitors with a localStorage override, still win over this default. %>
       <fieldset class="theme-default">
-        <legend><%= t('asite.theme_default') %></legend>
+        <legend>Default theme for new visitors</legend>
         <% const td = site.theme_override || ''; %>
         <label class="cb">
           <input type="radio" name="theme_override" value=""      <%= td === ''      ? 'checked' : '' %>>
-          <span><%= t('asite.theme_auto') %></span>
+          <span>Auto (volg device-voorkeur)</span>
         </label>
         <label class="cb">
           <input type="radio" name="theme_override" value="light" <%= td === 'light' ? 'checked' : '' %>>
-          <span><%= t('asite.theme_light') %></span>
+          <span>Light</span>
         </label>
         <label class="cb">
           <input type="radio" name="theme_override" value="dark"  <%= td === 'dark'  ? 'checked' : '' %>>
-          <span><%= t('asite.theme_dark') %></span>
+          <span>Dark</span>
         </label>
       </fieldset>
 
       <fieldset class="palette-grid">
-        <legend><%= t('asite.palette') %></legend>
+        <legend>Palette</legend>
         <% palettes.forEach(function(p) { %>
           <label class="palette-swatch">
-            <input type="radio" name="palette" value="<%= p.key %>" <%= (site.palette || 'klonkt') === p.key ? 'checked' : '' %>>
+            <input type="radio" name="palette" value="<%= p.key %>" <%= (site.palette || 'sage') === p.key ? 'checked' : '' %>>
             <span class="palette-preview" aria-hidden="true">
               <span class="pp-half pp-light" style="background: <%= p.light.paper %>; color: <%= p.light.ink %>;">
@@ -124,33 +120,38 @@
     </fieldset>
 
-    <%# Live preview: selecting an accent / theme / palette re-themes this page
-        instantly (reverts on reload; persists on save). %>
-    <%# Het script van deze pagina staat in assets/js/mod/admin-site-edit.js (shaer-bqr). %>
-
     <fieldset>
-      <legend><%= t('asite.behavior') %></legend>
+      <legend>Behaviour</legend>
       <label class="cb">
         <input type="checkbox" name="is_public" value="1" <%= site.is_public ? 'checked' : '' %>>
-        <span><%= t('asite.is_public') %></span>
+        <span>Public site (uncheck for closed circle)</span>
       </label>
       <label class="cb">
         <input type="checkbox" name="robots_index" value="1" <%= site.robots_index ? 'checked' : '' %>>
-        <span><%= t('asite.robots_index') %></span>
-      </label>
-      <% if (typeof audioEnabled === 'undefined' || audioEnabled) { %>
+        <span>Search engines may index (sitemap.xml is hidden if off)</span>
+      </label>
+      <label class="cb">
+        <input type="checkbox" name="require_login_to_comment" value="1" <%= site.require_login_to_comment ? 'checked' : '' %>>
+        <span>Require login to comment</span>
+      </label>
+      <label>
+        <span>Comment moderation</span>
+        <select name="comments_moderation_mode">
+          <option value="trust"    <%= (site.comments_moderation_mode || 'trust') === 'trust'    ? 'selected' : '' %>>Trust mode (auto-approve)</option>
+          <option value="moderate" <%= site.comments_moderation_mode === 'moderate' ? 'selected' : '' %>>Moderate (queue for review)</option>
+        </select>
+      </label>
       <label class="cb">
         <input type="checkbox" name="enable_audio_player" value="1" <%= site.enable_audio_player ? 'checked' : '' %>>
-        <span><%= t('asite.enable_audio') %></span>
-      </label>
-      <% } %>
-      <label class="cb">
-        <input type="checkbox" name="approve_followers" value="1" <%= site.approve_followers ? 'checked' : '' %>>
-        <span><%= t('asite.approve_followers') %></span>
+        <span>Enable audio player + embeds</span>
+      </label>
+      <label class="cb">
+        <input type="checkbox" name="enable_prutter" value="1" <%= site.enable_prutter ? 'checked' : '' %>>
+        <span>Enable Prutter (direct messaging)</span>
       </label>
     </fieldset>
 
     <fieldset class="profile-links-fieldset">
-      <legend><%= t('asite.links') %></legend>
-      <p class="form-hint"><%= t('asite.links_hint') %></p>
+      <legend>Social / streaming links</legend>
+      <p class="form-hint">Shown as branded icons on the profile header. Add as many as you like.</p>
 
       <div id="profile-links-rows">
@@ -180,84 +181,179 @@
       </template>
 
-      <button type="button" id="profile-link-add" class="btn"><%= t('asite.link_add') %></button>
-    </fieldset>
-
-    <%# Aliassen en verhuizen staan sinds 14-8 op /admin/migrate, bij elkaar met
-        exporteren, importeren en ophalen (Robin: alle migratie-opties op de
-        migrate-pagina). Ze hoorden hier ook niet thuis: dit scherm gaat over hoe
-        je site eruitziet, en een verhuizing is geen uiterlijk. Alleen de
-        wegwijzer blijft, want wie ze hier zocht moet ze kunnen vinden. %>
+      <button type="button" id="profile-link-add" class="btn">+ Add link</button>
+    </fieldset>
+
     <fieldset>
-      <legend><%= t('asite.aliases') %></legend>
-      <p class="form-hint"><%= t('asite.moved_to_migrate') %></p>
-      <p><a href="/admin/migrate" class="btn"><%= t('admin.b_migrate') %></a></p>
+      <legend>Feed view</legend>
+      <label>
+        <span>Default view for the homepage</span>
+        <select name="feed_view_default">
+          <option value="timeline" <%= (site.feed_view_default || 'timeline') === 'timeline' ? 'selected' : '' %>>Timeline (chronological list)</option>
+          <option value="grid"     <%= site.feed_view_default === 'grid' ? 'selected' : '' %>>Grid (cards)</option>
+        </select>
+      </label>
+      <label class="cb">
+        <input type="checkbox" name="feed_view_switch" value="1" <%= site.feed_view_switch ? 'checked' : '' %>>
+        <span>Show timeline ↔ grid switcher above the feed</span>
+      </label>
+      <label class="cb">
+        <input type="checkbox" name="show_search" value="1" <%= site.show_search ? 'checked' : '' %>>
+        <span>Show search button in nav</span>
+      </label>
+      <label class="cb">
+        <input type="checkbox" name="show_archive_link" value="1" <%= site.show_archive_link ? 'checked' : '' %>>
+        <span>Show archive link in nav</span>
+      </label>
     </fieldset>
 
     <fieldset>
-      <legend><%= t('asite.feed_view') %></legend>
-      <%# Twee vragen, en ze zijn niet hetzelfde: WELKE tweede weergave je site
-          aanbiedt naast Grid, en waarin hij opent. %>
-      <label>
-        <span><%= t('asite.feed_alt') %></span>
-        <select name="feed_alt_view">
-          <% var _a = ['timeline','auto'].indexOf(site.feed_alt_view) >= 0 ? site.feed_alt_view : 'reader'; %>
-          <option value="reader"   <%= _a === 'reader'   ? 'selected' : '' %>><%= t('asite.feed_alt_reader') %></option>
-          <option value="timeline" <%= _a === 'timeline' ? 'selected' : '' %>><%= t('asite.feed_alt_timeline') %></option>
-          <option value="auto"     <%= _a === 'auto'     ? 'selected' : '' %>><%= t('asite.feed_alt_auto') %></option>
-        </select>
-      </label>
-      <label>
-        <span><%= t('asite.feed_default') %></span>
-        <select name="feed_view_default">
-          <option value="reader" <%= site.feed_view_default !== 'grid' ? 'selected' : '' %>><%= t('asite.feed_alt_' + _a) %></option>
-          <option value="grid"     <%= site.feed_view_default === 'grid' ? 'selected' : '' %>><%= t('asite.feed_grid') %></option>
-        </select>
-      </label>
-      <label class="cb">
-        <input type="checkbox" name="feed_view_switch" value="1" <%= site.feed_view_switch ? 'checked' : '' %>>
-        <span><%= t('asite.feed_switch') %></span>
-      </label>
-      <%# Alleen van toepassing op Lezen: geeft elk bericht daar een eigen scherm. %>
-      <label class="cb">
-        <input type="checkbox" name="reader_full_page" value="1" <%= site.reader_full_page ? 'checked' : '' %>>
-        <span><%= t('asite.reader_full_page') %></span>
-      </label>
-      <label class="cb">
-        <input type="checkbox" name="show_search" value="1" <%= site.show_search ? 'checked' : '' %>>
-        <span><%= t('asite.show_search') %></span>
-      </label>
-      <label class="cb">
-        <input type="checkbox" name="show_archive_link" value="1" <%= site.show_archive_link ? 'checked' : '' %>>
-        <span><%= t('asite.show_archive') %></span>
-      </label>
-    </fieldset>
-
-    <fieldset class="seo-pointer">
-      <legend><%= t('asite.seo') %></legend>
-      <p><%= t('asite.seo_pointer') %> <a href="/admin/seo"><%= t('asite.seo_link') %></a>.</p>
+      <legend>SEO &amp; social</legend>
+      <label>
+        <span>Title template (use {title} and {site})</span>
+        <input type="text" name="title_template" value="<%= site.title_template || '{title} — {site}' %>" maxlength="200">
+      </label>
+      <label>
+        <span>Canonical base URL (for production HTTPS)</span>
+        <input type="text" name="canonical" value="<%= site.canonical || '' %>" placeholder="https://your-domain.com">
+      </label>
+      <label>
+        <span>Twitter handle (with @)</span>
+        <input type="text" name="twitter" value="<%= site.twitter || '' %>" placeholder="@yourname" maxlength="64">
+      </label>
+      <details>
+        <summary>Search-engine verification</summary>
+        <label>
+          <span>Google site verification</span>
+          <input type="text" name="google_verification"    value="<%= site.google_verification    || '' %>" maxlength="200">
+        </label>
+        <label>
+          <span>Bing (msvalidate.01)</span>
+          <input type="text" name="bing_verification"      value="<%= site.bing_verification      || '' %>" maxlength="200">
+        </label>
+        <label>
+          <span>Pinterest (p:domain_verify)</span>
+          <input type="text" name="pinterest_verification" value="<%= site.pinterest_verification || '' %>" maxlength="200">
+        </label>
+        <label>
+          <span>Yandex</span>
+          <input type="text" name="yandex_verification"    value="<%= site.yandex_verification    || '' %>" maxlength="200">
+        </label>
+      </details>
     </fieldset>
 
     <fieldset>
-      <legend><%= t('asite.custom_legend') %> <em><%= t('asite.optional') %></em></legend>
-      <label>
-        <span><%= t('asite.custom_css') %></span>
+      <legend>Custom CSS &amp; HTML <em>(optional)</em></legend>
+      <label>
+        <span>Custom CSS (injected as &lt;style&gt; in &lt;head&gt;)</span>
         <textarea name="custom_css" rows="3" placeholder=".foo { color: red; }"><%= site.custom_css || '' %></textarea>
       </label>
       <label>
-        <span><%= t('asite.custom_head') %></span>
+        <span>Custom &lt;head&gt; HTML (analytics, extra metas)</span>
         <textarea name="custom_head_html" rows="3" placeholder="<meta name=&quot;...&quot;>"><%= site.custom_head_html || '' %></textarea>
       </label>
       <label>
-        <span><%= t('asite.custom_foot') %></span>
+        <span>Custom footer HTML</span>
         <textarea name="custom_foot_html" rows="3"><%= site.custom_foot_html || '' %></textarea>
       </label>
     </fieldset>
 
-    <button type="submit" class="btn btn-primary"><%= isNew ? t('asite.submit_create') : t('asite.submit_save') %></button>
+    <button type="submit" class="btn btn-primary"><%= isNew ? 'Create site' : 'Save changes' %></button>
   </form>
-
 </div>
 
-
+<script>
+(function() {
+  // Profile-links repeater: add row from <template>, remove on click.
+  var rows = document.getElementById('profile-links-rows');
+  var tpl  = document.getElementById('profile-link-template');
+  var add  = document.getElementById('profile-link-add');
+  if (!rows || !tpl || !add) return;
+
+  add.addEventListener('click', function() {
+    var clone = tpl.content.cloneNode(true);
+    rows.appendChild(clone);
+  });
+  rows.addEventListener('click', function(e) {
+    if (e.target && e.target.classList.contains('pl-remove')) {
+      var row = e.target.closest('.profile-link-row');
+      if (row) row.remove();
+    }
+  });
+})();
+
+// P63 — Profile photo picker: upload via /admin/sites/upload-photo,
+// then write the returned URL into the visible input. Live thumb preview.
+(function() {
+  var picker  = document.getElementById('photo-picker');
+  if (!picker) return;
+  var thumb   = document.getElementById('photo-thumb');
+  var preview = document.getElementById('photo-preview');
+  var urlEl   = document.getElementById('photo-url');
+  var trigger = document.getElementById('photo-upload-trigger');
+  var clear   = document.getElementById('photo-clear');
+  var field   = document.getElementById('photo-upload-field');
+  var status  = document.getElementById('photo-status');
+
+  function showPreview(url) {
+    if (url) {
+      preview.src = url;
+      preview.hidden = false;
+      thumb.removeAttribute('data-empty');
+      clear.hidden = false;
+    } else {
+      preview.src = '';
+      preview.hidden = true;
+      thumb.setAttribute('data-empty', '');
+      clear.hidden = true;
+    }
+  }
+
+  if (urlEl) {
+    urlEl.addEventListener('input', function() {
+      showPreview(urlEl.value.trim());
+    });
+  }
+
+  if (trigger && field) {
+    trigger.addEventListener('click', function() { field.click(); });
+    field.addEventListener('change', async function() {
+      var file = field.files && field.files[0];
+      if (!file) return;
+      status.classList.remove('is-error');
+      status.textContent = 'Uploaden…';
+      try {
+        var fd = new FormData();
+        fd.append('photo', file);
+        var r = await fetch('/admin/sites/upload-photo', {
+          method: 'POST',
+          body: fd,
+          credentials: 'same-origin',
+        });
+        var j = await r.json();
+        if (!r.ok || !j.ok) throw new Error(j.error || ('Upload mislukt (' + r.status + ')'));
+        urlEl.value = j.url;
+        showPreview(j.url);
+        status.textContent = 'Geüpload ✓';
+        setTimeout(function() { status.textContent = ''; }, 2000);
+      } catch (e) {
+        status.classList.add('is-error');
+        status.textContent = 'Mislukt: ' + e.message;
+      } finally {
+        field.value = '';
+      }
+    });
+  }
+
+  if (clear) {
+    clear.addEventListener('click', function() {
+      urlEl.value = '';
+      showPreview('');
+      status.textContent = '';
+      // Note: doesn't delete the file from disk — saving the form with empty
+      // URL leaves the file orphaned on the server. Acceptable for now.
+    });
+  }
+})();
+</script>
 
 <style>
@@ -265,11 +361,5 @@
 .admin-site-edit-page h1 { font-family: var(--font-display, serif); font-size: 1.8rem; margin: 0 0 1.5rem; }
 
-.site-form { display: flex; flex-direction: column; gap: 1.5rem; min-width: 0; }
-/* Mobile: a <fieldset> has a browser-default min-inline-size:min-content and
-   therefore does NOT shrink → the entire form became wider than the screen. min-width:0
-   forces it to shrink; form fields get max-width:100% + border-box so they
-   never overflow their fieldset. */
-.site-form fieldset { min-width: 0; }
-.site-form input, .site-form select, .site-form textarea { min-width: 0; max-width: 100%; box-sizing: border-box; }
+.site-form { display: flex; flex-direction: column; gap: 1.5rem; }
 .site-form fieldset {
   border: 1px solid var(--rule);
@@ -310,58 +400,4 @@
 .site-form input[readonly] { opacity: 0.6; cursor: not-allowed; background: var(--paper-2); }
 
-/* Slug as URL field: dimmed host prefix + the slug itself in the accent colour. */
-.slug-url {
-  display: flex; align-items: stretch;
-  border: 1px solid var(--rule); border-radius: 5px;
-  background: var(--paper); overflow: hidden;
-  transition: border-color 120ms;
-}
-.slug-url:focus-within { border-color: var(--accent); }
-.slug-url-host {
-  display: inline-flex; align-items: center;
-  padding-left: 0.85rem;
-  color: var(--ink-muted, var(--ink-soft));
-  white-space: nowrap; user-select: none;
-  font-size: 0.95rem;
-}
-.site-form .slug-url-input {
-  flex: 1 1 auto; min-width: 0;
-  border: none !important; border-radius: 0 !important;
-  background: transparent !important;
-  color: var(--accent) !important; font-weight: 700;
-  padding: 0.55rem 0.85rem 0.55rem 0.1rem;
-}
-.site-form .slug-url-input:focus { outline: none; }
-.site-form .slug-url-input[readonly] {
-  opacity: 1; cursor: default; background: transparent !important;
-}
-
-/* Selects: same look as the inputs, with a custom chevron instead of the bare
-   native arrow. The open option list is still rendered by the browser. */
-.site-form select {
-  appearance: none;
-  -webkit-appearance: none;
-  padding: 0.55rem 2.2rem 0.55rem 0.85rem;
-  border: 1px solid var(--rule);
-  border-radius: 5px;
-  background-color: var(--paper);
-  color: var(--ink);
-  font-family: inherit;
-  font-size: 0.95rem;
-  cursor: pointer;
-  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
-  background-repeat: no-repeat;
-  background-position: right 0.7rem center;
-  transition: border-color 0.15s ease, box-shadow 0.15s ease;
-}
-.site-form select:hover { border-color: var(--ink-soft, #888); }
-.site-form select:focus,
-.site-form input[type="text"]:focus,
-.site-form textarea:focus {
-  outline: none;
-  border-color: var(--accent, #c2410c);
-  box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent, #c2410c) 22%, transparent);
-}
-
 /* Reuse the palette-swatch styles from account.ejs */
 .palette-swatch {
@@ -474,16 +510,8 @@
   .photo-controls { gap: .55rem; }
 }
-/* Mobile-first: platform selector on its own line (full width), URL input + remove
-   button below. Prevents horizontal overflow on phones (fixed 160px column +
-   non-shrinkable input together ~447px > screen width). */
 .profile-link-row {
-  display: grid; grid-template-columns: 1fr auto; gap: 0.5rem; margin-bottom: 0.5rem;
-}
-.profile-link-row select { padding: 0.45rem 0.6rem; grid-column: 1 / -1; }
-.profile-link-row input { min-width: 0; }
-@media (min-width: 520px) {
-  .profile-link-row { grid-template-columns: 160px 1fr auto; }
-  .profile-link-row select { grid-column: auto; }
-}
+  display: grid; grid-template-columns: 160px 1fr auto; gap: 0.5rem; margin-bottom: 0.5rem;
+}
+.profile-link-row select { padding: 0.45rem 0.6rem; }
 .profile-links-fieldset details > label { margin-top: 0.4rem; }
 </style>
