source: Klonkt/src/views/pages/admin-seo.ejs@ 3188dfe

main
Last change on this file since 3188dfe was 3188dfe, checked in by Robin <roboburr@…>, 4 weeks ago

Kandidaten als kaartje, regel voor regel (shaer-mbz)

Een keuze en geen opsomming. Alles op een rij duwen maakte de toelichting --
juist het veld dat twee gelijknamige bands uit elkaar houdt -- tot bijzin achter
de naam. Nu: naam, toelichting, feiten, en een voet met de link en de knop.

Alleen wat er IS. Een lege bullet tussen twee punten leest als ontbrekende
informatie in plaats van als afwezige, dus soort, land en jaren worden pas
samengevoegd nadat de lege eruit zijn.

De zoekscore komt er alleen bij als hij ZWAK is (< 70). Bij een goede treffer is
een getal ruis; bij een zwakke is het een waarschuwing. Dat veld haalden we al
op met precies die bedoeling en het werd nog nergens gebruikt.

Co-Authored-By: Claude Opus 5 <noreply@…>

  • Property mode set to 100644
File size: 12.8 KB
Line 
1<div class="container admin-site-edit-page">
2 <p><a href="/admin" class="btn">&larr; <%= t('aseo.back') %></a></p>
3 <h1><%= t('aseo.title') %></h1>
4 <p class="admin-tagline"><%= t('aseo.tagline_pre') %> <strong><%= site.title %></strong> <%= t('aseo.tagline_post') %></p>
5
6 <% if (typeof success !== 'undefined' && success) { %><div class="audio-flash audio-flash--ok"><%= success %></div><% } %>
7 <% if (typeof error !== 'undefined' && error) { %><div class="audio-flash audio-flash--err"><%= error %></div><% } %>
8
9 <form method="post" action="/admin/seo" class="site-form">
10
11 <fieldset>
12 <legend><%= t('aseo.index_legend') %></legend>
13 <label class="cb">
14 <input type="checkbox" name="robots_index" value="1" <%= site.robots_index ? 'checked' : '' %>>
15 <span><%= t('aseo.index_label') %> <small class="form-hint-inline">— <%= t('aseo.index_hint_pre') %> <code>noindex</code> <%= t('aseo.index_hint_post') %></small></span>
16 </label>
17 </fieldset>
18
19 <fieldset>
20 <legend><%= t('aseo.title_legend') %></legend>
21 <label>
22 <span><%= t('aseo.title_template') %> <small class="form-hint-inline">— <%= t('aseo.title_template_hint_pre') %> <code>{title}</code> <%= t('aseo.title_template_hint_and') %> <code>{site}</code></small></span>
23 <input type="text" name="title_template" value="<%= site.title_template || '{title} — {site}' %>" maxlength="200" placeholder="{title} — {site}">
24 </label>
25 <label>
26 <span><%= t('aseo.default_desc') %> <small class="form-hint-inline">— <%= t('aseo.default_desc_hint') %></small></span>
27 <textarea name="default_description" rows="2" maxlength="500" placeholder="<%= t('aseo.default_desc_ph') %>"><%= site.default_description || '' %></textarea>
28 </label>
29 <label>
30 <span><%= t('aseo.canonical') %> <small class="form-hint-inline">— <%= t('aseo.canonical_hint') %></small></span>
31 <input type="text" name="canonical" value="<%= site.canonical || '' %>" placeholder="https://yourdomain.com" maxlength="200">
32 </label>
33 <label>
34 <span><%= t('aseo.author') %> <small class="form-hint-inline">— <%= t('aseo.author_hint') %></small></span>
35 <input type="text" name="author" value="<%= site.author || '' %>" maxlength="120" placeholder="<%= t('aseo.author_ph') %>">
36 </label>
37 </fieldset>
38
39 <fieldset>
40 <legend><%= t('aseo.social_legend') %></legend>
41 <label>
42 <span><%= t('aseo.og_image') %> <small class="form-hint-inline">— <%= t('aseo.og_image_hint') %></small></span>
43 <input type="text" name="og_image_default" value="<%= site.og_image_default || '' %>" placeholder="https://yourdomain.com/share.jpg" maxlength="500">
44 </label>
45 <label>
46 <span><%= t('aseo.og_theme') %> <small class="form-hint-inline">— <%= t('aseo.og_theme_hint') %></small></span>
47 <select name="og_theme">
48 <option value="" <%= !site.og_theme ? 'selected' : '' %>><%= t('aseo.og_theme_auto') %></option>
49 <option value="light" <%= site.og_theme === 'light' ? 'selected' : '' %>><%= t('aseo.og_theme_light') %></option>
50 <option value="dark" <%= site.og_theme === 'dark' ? 'selected' : '' %>><%= t('aseo.og_theme_dark') %></option>
51 </select>
52 </label>
53 <label>
54 <span><%= t('aseo.og_locale') %> <small class="form-hint-inline">— <%= t('aseo.og_locale_hint_pre') %> <code>nl_NL</code> <%= t('aseo.og_locale_hint_or') %> <code>en_US</code></small></span>
55 <input type="text" name="og_locale" value="<%= site.og_locale || '' %>" placeholder="nl_NL" maxlength="32">
56 </label>
57 <label>
58 <span><%= t('aseo.twitter') %> <small class="form-hint-inline">— <%= t('aseo.twitter_hint') %></small></span>
59 <input type="text" name="twitter" value="<%= site.twitter || '' %>" placeholder="@jouwnaam" maxlength="64">
60 </label>
61 <label>
62 <span><%= t('aseo.fb_app') %> <small class="form-hint-inline">— <%= t('aseo.fb_app_hint') %></small></span>
63 <input type="text" name="facebook_app_id" value="<%= site.facebook_app_id || '' %>" maxlength="64">
64 </label>
65 </fieldset>
66
67 <fieldset>
68 <legend><%= t('aseo.publisher_legend') %></legend>
69 <label>
70 <span><%= t('aseo.type') %></span>
71 <select name="schema_type">
72 <option value="Person" <%= site.schema_type === 'Organization' ? '' : 'selected' %>><%= t('aseo.type_person') %></option>
73 <option value="Organization" <%= site.schema_type === 'Organization' ? 'selected' : '' %>><%= t('aseo.type_org') %></option>
74 </select>
75 </label>
76 <label>
77 <span><%= t('aseo.publisher_name') %> <small class="form-hint-inline">— <%= t('aseo.publisher_name_hint') %></small></span>
78 <input type="text" name="publisher_name" value="<%= site.publisher_name || '' %>" maxlength="200">
79 </label>
80 <label>
81 <span><%= t('aseo.publisher_url') %></span>
82 <input type="text" name="publisher_url" value="<%= site.publisher_url || '' %>" placeholder="https://yourdomain.com" maxlength="200">
83 </label>
84 <label>
85 <span><%= t('aseo.publisher_logo') %></span>
86 <input type="text" name="publisher_logo" value="<%= site.publisher_logo || '' %>" placeholder="https://yourdomain.com/logo.png" maxlength="500">
87 </label>
88 </fieldset>
89
90 <%# ── MUSICBRAINZ ─────────────────────────────────────────────
91 Direct onder Uitgever, en dat is geen willekeur: sameAs IS een
92 schema.org-eigenschap, en dat blok hierboven is waar ons schema.org
93 vandaan komt. Een koppeling hier voedt twee uitgangen tegelijk -- de
94 JSON-LD van de pagina en het fediverse-profiel (shaer-mbz). %>
95 <fieldset id="mb-veld">
96 <legend><%= t('aseo.mb_legend') %></legend>
97 <p class="form-hint"><%= t('aseo.mb_hint') %></p>
98
99 <input type="hidden" name="mb_artist_id" id="mb-id" value="<%= site.mb_artist_id || '' %>">
100 <input type="hidden" name="mb_artist_name" id="mb-naam" value="<%= site.mb_artist_name || '' %>">
101
102 <p class="mb-huidig" id="mb-huidig" <%= site.mb_artist_id ? '' : 'hidden' %>>
103 <%= t('aseo.mb_linked') %>
104 <strong id="mb-huidig-naam"><%= site.mb_artist_name || site.mb_artist_id || '' %></strong>
105 <a id="mb-huidig-link" target="_blank" rel="noopener"
106 href="https://musicbrainz.org/artist/<%= site.mb_artist_id || '' %>"><%= t('aseo.mb_open') %></a>
107 <button type="button" class="btn" id="mb-wis"><%= t('aseo.mb_unlink') %></button>
108 </p>
109 <%# De terug-weg. Een koppeling van onze kant is een BEWERING -- iedereen
110 kan een id typen. Pas als de MusicBrainz-pagina terugwijst is het een
111 paar, en dat staat hier met zoveel woorden zodat "eenzijdig" niet als
112 "klaar" leest. %>
113 <p class="mb-terugweg" id="mb-terugweg" hidden></p>
114
115 <label>
116 <span><%= t('aseo.mb_search_label') %> <small class="form-hint-inline">— <%= t('aseo.mb_search_hint') %></small></span>
117 <div class="mb-zoek">
118 <input type="text" id="mb-q" value="<%= site.publisher_name || site.title || '' %>"
119 autocomplete="off" placeholder="<%= t('aseo.mb_placeholder') %>">
120 <button type="button" class="btn" id="mb-zoek-btn"><%= t('aseo.mb_search') %></button>
121 </div>
122 </label>
123 <div id="mb-uit" class="mb-uit" hidden></div>
124 </fieldset>
125
126 <fieldset>
127 <legend><%= t('aseo.verify_legend') %></legend>
128 <label>
129 <span><%= t('aseo.verify_google') %></span>
130 <input type="text" name="google_verification" value="<%= site.google_verification || '' %>" maxlength="200">
131 </label>
132 <label>
133 <span><%= t('aseo.verify_bing') %> <small class="form-hint-inline">— <%= t('aseo.verify_bing_hint') %></small></span>
134 <input type="text" name="bing_verification" value="<%= site.bing_verification || '' %>" maxlength="200">
135 </label>
136 <label>
137 <span><%= t('aseo.verify_pinterest') %> <small class="form-hint-inline">— <%= t('aseo.verify_pinterest_hint') %></small></span>
138 <input type="text" name="pinterest_verification" value="<%= site.pinterest_verification || '' %>" maxlength="200">
139 </label>
140 <label>
141 <span><%= t('aseo.verify_yandex') %></span>
142 <input type="text" name="yandex_verification" value="<%= site.yandex_verification || '' %>" maxlength="200">
143 </label>
144 </fieldset>
145
146 <button type="submit" class="btn btn-primary"><%= t('aseo.save') %></button>
147 </form>
148</div>
149
150<style>
151/* ── MusicBrainz-kandidaten: een kaartje per artiest ──────────────
152 Meerdere regels en geen opsomming op een rij: dit is een KEUZE, en de
153 toelichting die twee gelijknamige bands uit elkaar houdt hoort niet als
154 bijzin achter de naam weg te vallen. */
155.mb-uit { margin-top: 0.5rem; }
156.mb-lijst { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; }
157.mb-kandidaat {
158 display: flex; flex-direction: column; gap: 0.2rem;
159 border: 1px solid var(--rule); border-radius: 8px;
160 padding: 0.7rem 0.85rem; background: var(--paper);
161 min-width: 0;
162}
163.mb-naam { font-weight: 600; font-size: 0.95rem; color: var(--ink); }
164.mb-toelichting { font-size: 0.85rem; color: var(--ink); }
165.mb-feiten { font-size: 0.8rem; color: var(--ink-muted); }
166.mb-voet { display: flex; align-items: center; gap: 0.6rem; margin-top: 0.35rem; flex-wrap: wrap; }
167.mb-open { font-size: 0.8rem; }
168/* Een zwakke treffer als zwak tonen; bij een goede is een getal ruis. */
169.mb-zwak { font-size: 0.75rem; color: var(--ink-muted); }
170.mb-kies { margin-left: auto; }
171.mb-huidig { display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; font-size: 0.9rem; }
172.mb-zoek { display: flex; gap: 0.5rem; min-width: 0; }
173.mb-zoek input { flex: 1 1 auto; min-width: 0; }
174/* De terug-weg: eenzijdig is geen fout, maar het mag ook niet als klaar lezen. */
175.mb-terugweg { font-size: 0.82rem; margin: 0.2rem 0 0; }
176.mb-terugweg.is-ok { color: var(--ok, #2e7d32); }
177.mb-terugweg.is-eenzijdig { color: var(--ink-muted); }
178
179.admin-site-edit-page { max-width: 760px; margin: 3rem auto; padding: 0 1rem; }
180.admin-site-edit-page h1 { font-family: var(--font-display, serif); font-size: 1.8rem; margin: 0 0 0.4rem; }
181.admin-site-edit-page .admin-tagline { color: var(--ink-muted); margin: 0 0 1.75rem; }
182
183.site-form { display: flex; flex-direction: column; gap: 1.5rem; min-width: 0; }
184/* <fieldset> does not shrink because the UA sets min-inline-size:min-content → mobile overflow.
185 min-width:0 forces it to shrink. */
186.site-form fieldset { min-width: 0; }
187.site-form input, .site-form textarea, .site-form select { min-width: 0; }
188.site-form fieldset {
189 border: 1px solid var(--rule);
190 border-radius: 8px;
191 padding: 1rem 1.25rem;
192 background: var(--paper-2);
193 display: flex;
194 flex-direction: column;
195 gap: 0.85rem;
196}
197.site-form fieldset legend { font-family: var(--font-display, serif); font-size: 1rem; padding: 0 0.4rem; }
198.site-form label { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.85rem; color: var(--ink-muted, var(--ink-soft)); }
199.site-form label.cb { flex-direction: row; align-items: flex-start; gap: 0.55rem; font-size: 0.9rem; color: var(--ink); }
200.site-form label.cb input { margin-top: 0.15rem; }
201.site-form label > span { line-height: 1.35; }
202.form-hint-inline { font-weight: 400; color: var(--ink-muted); font-size: 0.82em; }
203.site-form code { background: var(--paper); padding: 0.05rem 0.35rem; border-radius: 3px; font-size: 0.85em; }
204.site-form input[type="text"], .site-form textarea, .site-form select {
205 padding: 0.55rem 0.85rem;
206 border: 1px solid var(--rule);
207 border-radius: 5px;
208 background: var(--paper);
209 color: var(--ink);
210 font-family: inherit;
211 font-size: 0.95rem;
212 width: 100%;
213 box-sizing: border-box;
214}
215.site-form textarea { resize: vertical; min-height: 2.6rem; }
216.site-form select { max-width: 320px; }
217.site-form input:focus, .site-form textarea:focus, .site-form select:focus {
218 outline: none; border-color: var(--accent);
219}
220.seo-pointer p { margin: 0; font-size: 0.9rem; color: var(--ink-muted); }
221.seo-pointer a { color: var(--accent); font-weight: 600; }
222.site-form > button[type="submit"] { align-self: flex-start; }
223</style>
224
225<%# Servertekst naar mod/admin-seo.js. KORTE sleutels, zoals overal in dit
226 project -- de module leest T.mb_busy en niet T.aseo_mb_busy. Zonder dit
227 blok geeft pageData() een leeg object en valt alles terug op de
228 ingebakken Nederlandse tekst, ook voor een Engelse of Duitse lezer. %>
229<%- include('../partials/page-data', { pageData: { mb_busy: t('aseo.mb_busy'), mb_fail: t('aseo.mb_fail'), mb_none: t('aseo.mb_none'), mb_open: t('aseo.mb_open'), mb_pick: t('aseo.mb_pick'), mb_verified: t('aseo.mb_verified'), mb_unverified: t('aseo.mb_unverified'), mb_checking: t('aseo.mb_checking') } }) %>
Note: See TracBrowser for help on using the repository browser.