Skip to content

Commit bdfa879

Browse files
committed
feat(v1.1.1): per-provider model selector, admin polish, docs layout fix
- Settings → AI provider keys: each provider now has a model selector showing all available models ordered most-powerful → least, matching the provider's default. Selecting a model saves it as an encrypted vault secret (env var override); reverting to the default clears the override. Covers all 9 providers including Cloudflare Workers AI, Anthropic (Fable 5 → Opus → Sonnet → Haiku), OpenAI, Gemini, Groq, DeepSeek, Mistral, Together AI, and Cerebras. - Admin dashboard: simplified sidebar — replaced heavy glyph system with clean 4px dot indicators, tightened padding, stat numbers now use monospace 600 instead of large serif (cleaner, less AI-generated look), nav brand uses Instrument Serif italic, subtler accent usage. - /docs: fixed layout sizing — content now respects the same max-width as the marketing nav, section headings use Instrument Serif italic, ToC is styled as pill links instead of border-left markers, pre/code blocks use the correct mono stack, responsive breakpoint at 820px.
1 parent bb36251 commit bdfa879

4 files changed

Lines changed: 260 additions & 99 deletions

File tree

functions/docs/index.js

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -360,39 +360,48 @@ export const onRequestGet = async ({ request }) => {
360360
<meta name="robots" content="index,follow" />
361361
<link rel="preload" href="/_fonts/inter-400.woff2" as="font" type="font/woff2" crossorigin />
362362
<link rel="preload" href="/_fonts/instrument-serif-400.woff2" as="font" type="font/woff2" crossorigin />
363+
<link rel="preload" href="/_fonts/jetbrains-mono-400.woff2" as="font" type="font/woff2" crossorigin />
363364
<link rel="stylesheet" href="/marketing.css" />
364365
<style>
365-
.docs-wrap { max-width: 920px; margin: 0 auto; padding: 48px 24px 96px; }
366-
.docs-head { text-align: left; margin-bottom: 32px; }
367-
.docs-head h1 { font-size: 44px; line-height: 1.1; margin: 0 0 8px; }
368-
.docs-head p { color: var(--ink-dim, #6a7484); font-size: 18px; margin: 0; }
369-
.docs-grid { display: grid; grid-template-columns: 220px 1fr; gap: 48px; margin-top: 24px; }
370-
.docs-toc { position: sticky; top: 24px; align-self: start; font-size: 13px; }
371-
.docs-toc strong { font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-dim, #6a7484); display: block; margin-bottom: 12px; }
372-
.docs-toc ol { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; }
373-
.docs-toc a { color: var(--ink); text-decoration: none; border-left: 2px solid var(--line, rgba(0,0,0,0.1)); padding: 2px 10px; display: block; }
374-
.docs-toc a:hover { color: var(--accent); border-left-color: var(--accent); }
375-
.docs-section { margin-bottom: 56px; scroll-margin-top: 24px; }
376-
.docs-section h2 { font-size: 28px; margin: 0 0 16px; display: flex; align-items: baseline; gap: 10px; }
377-
.docs-section h2 .anchor { color: var(--ink-dim, #6a7484); text-decoration: none; font-size: 0.6em; opacity: 0; transition: opacity .12s; }
366+
/* Docs page uses marketing.css for the nav/footer shell. The docs
367+
content area is constrained to match the marketing max-width so
368+
the text column aligns with the nav's inner padding. */
369+
:root { --docs-max: 1100px; }
370+
.docs-wrap { max-width: var(--docs-max); margin: 0 auto; padding: 52px max(28px, calc((100vw - var(--docs-max)) / 2 + 28px)) 96px; }
371+
.docs-head { margin-bottom: 36px; }
372+
.docs-head h1 { font-family: 'Instrument Serif', Georgia, serif; font-weight: 400; font-size: clamp(2rem, 4vw, 3rem); line-height: 1.05; margin: 0 0 10px; letter-spacing: -0.015em; }
373+
.docs-head p { color: var(--muted, #6a7484); font-size: 17px; margin: 0; max-width: 560px; }
374+
.docs-grid { display: grid; grid-template-columns: 200px 1fr; gap: 52px; margin-top: 8px; }
375+
.docs-toc { position: sticky; top: 80px; align-self: start; font-size: 13px; }
376+
.docs-toc strong { font-size: 10px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--muted, #6a7484); display: block; margin-bottom: 10px; font-family: 'JetBrains Mono', monospace; }
377+
.docs-toc ol { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 2px; }
378+
.docs-toc a { color: var(--ink); text-decoration: none; font-size: 13px; padding: 5px 10px; display: block; border-radius: 5px; transition: background .12s, color .12s; }
379+
.docs-toc a:hover { background: var(--bg-2, #f0ece4); color: var(--ink); }
380+
.docs-section { margin-bottom: 60px; scroll-margin-top: 28px; }
381+
.docs-section h2 { font-family: 'Instrument Serif', Georgia, serif; font-weight: 400; font-style: italic; font-size: 26px; margin: 0 0 16px; display: flex; align-items: baseline; gap: 10px; letter-spacing: -0.01em; border-bottom: 1px solid var(--line, rgba(0,0,0,.08)); padding-bottom: 10px; }
382+
.docs-section h2 .anchor { color: var(--muted, #999); text-decoration: none; font-size: 14px; font-style: normal; font-family: monospace; opacity: 0; transition: opacity .12s; }
378383
.docs-section h2:hover .anchor { opacity: 1; }
379-
.docs-section h3 { font-size: 18px; margin: 28px 0 10px; }
380-
.docs-section p, .docs-section li, .docs-section dd { line-height: 1.6; }
381-
.docs-section pre { background: var(--bg-2, #f3f1ec); padding: 14px 16px; border-radius: 8px; overflow-x: auto; font-size: 13px; line-height: 1.5; }
382-
.docs-section code { font-size: 0.9em; }
383-
.docs-section pre code { background: none; padding: 0; }
384+
.docs-section h3 { font-size: 16px; font-weight: 600; margin: 28px 0 8px; letter-spacing: -0.01em; }
385+
.docs-section p, .docs-section li, .docs-section dd { line-height: 1.65; font-size: 14.5px; color: var(--ink, #131210); }
386+
.docs-section pre { background: var(--bg-2, #f0ece4); padding: 14px 16px; border-radius: 8px; overflow-x: auto; font-size: 12.5px; line-height: 1.55; margin: 12px 0; }
387+
.docs-section code { font-size: 0.88em; background: var(--bg-2, #f0ece4); padding: 1px 5px; border-radius: 3px; font-family: 'JetBrains Mono', monospace; }
388+
.docs-section pre code { background: none; padding: 0; font-size: inherit; }
384389
.docs-section ol, .docs-section ul { padding-left: 22px; }
385-
.docs-section dl { margin: 12px 0; }
386-
.docs-section dt { font-weight: 600; margin-top: 14px; }
387-
.docs-section dd { margin: 4px 0 0; color: var(--ink-dim, #4a5060); }
388-
.err-dl dt { font-family: var(--font-mono, monospace); font-size: 13px; }
389-
.err-dl dt code { font-size: 1em; }
390-
.ref-dl dt { font-family: var(--font-mono, monospace); font-size: 13px; }
391-
.lede { font-size: 17px; color: var(--ink-dim, #4a5060); }
392-
@media (max-width: 760px) {
393-
.docs-grid { grid-template-columns: 1fr; }
394-
.docs-toc { position: static; }
395-
.docs-head h1 { font-size: 32px; }
390+
.docs-section ol li, .docs-section ul li { margin-bottom: 6px; }
391+
.docs-section dl { margin: 16px 0; }
392+
.docs-section dt { font-weight: 600; margin-top: 16px; }
393+
.docs-section dd { margin: 4px 0 0; color: var(--muted, #4a5060); }
394+
.err-dl dt, .ref-dl dt { font-family: 'JetBrains Mono', monospace; font-size: 13px; }
395+
.err-dl dt code, .ref-dl dt code { font-size: 1em; background: none; padding: 0; }
396+
.lede { font-size: 16px; color: var(--muted, #4a5060); }
397+
.foot { max-width: var(--docs-max); margin: 0 auto; padding: 28px max(28px, calc((100vw - var(--docs-max)) / 2 + 28px)); font-size: 13px; color: var(--muted, #666); border-top: 1px solid var(--line, rgba(0,0,0,.08)); }
398+
.foot a { color: var(--muted, #666); text-decoration: none; }
399+
.foot a:hover { color: var(--ink); }
400+
@media (max-width: 820px) {
401+
.docs-wrap { padding: 36px 20px 80px; }
402+
.docs-grid { grid-template-columns: 1fr; gap: 28px; }
403+
.docs-toc { position: static; background: var(--bg-2, #f0ece4); padding: 16px; border-radius: 8px; }
404+
.docs-head h1 { font-size: 2rem; }
396405
}
397406
</style>
398407
</head>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pages-seo",
3-
"version": "1.1.0",
3+
"version": "1.1.1",
44
"private": false,
55
"license": "MIT",
66
"type": "module",

public/admin.css

Lines changed: 62 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -191,90 +191,73 @@ a:hover{text-decoration:underline}
191191
.gate-card .err{margin-top:12px;color:var(--bad);font-size:13px;min-height:18px}
192192

193193
/* ── Dash shell ──────────────────────────────────────────────────── */
194-
/* Base (mobile/tablet): horizontal top bar. Desktop (≥1001px):
195-
fixed left sidebar — see the media query below. Markup is shared;
196-
only CSS changes between the two. */
197194
.dash[hidden]{display:none}
198195
.topbar{
199196
position:sticky;top:0;z-index:5;
200-
display:flex;align-items:center;gap:18px;
201-
padding:14px 24px;
202-
background:color-mix(in srgb, var(--bg) 88%, transparent);backdrop-filter:blur(8px);
203-
border-bottom:1px solid var(--line);
197+
display:flex;align-items:center;gap:12px;
198+
padding:10px 20px;
199+
background:var(--bg);border-bottom:1px solid var(--line);
204200
}
205-
.topbar .brand{font-family:var(--mono);font-weight:600;color:var(--accent);letter-spacing:.04em;font-size:14px}
206-
.topbar .tabs{display:flex;gap:4px;margin-left:24px;flex:1}
201+
.topbar .brand{font-family:var(--serif);font-style:italic;font-weight:400;color:var(--ink);font-size:16px;letter-spacing:0;white-space:nowrap}
202+
.topbar .brand::after{content:" · admin";font-style:normal;font-family:var(--mono);font-size:11px;color:var(--ink-faint);letter-spacing:.04em;margin-left:4px}
203+
.topbar .tabs{display:flex;gap:2px;margin-left:12px;flex:1;overflow-x:auto}
207204
.topbar .tab{
208-
background:transparent;border:1px solid transparent;color:var(--ink-dim);
209-
padding:6px 14px;border-radius:6px;font-size:13px;cursor:pointer;
210-
transition:color .15s, background .15s, border-color .15s;
205+
background:transparent;border:0;border-bottom:2px solid transparent;color:var(--ink-faint);
206+
padding:7px 12px;font-size:13px;cursor:pointer;white-space:nowrap;
207+
transition:color .12s, border-color .12s;border-radius:0;
211208
}
212209
.topbar .tab:hover{color:var(--ink)}
213-
.topbar .tab[aria-current="page"]{color:var(--ink);background:var(--bg-soft);border-color:var(--line-2)}
214-
210+
.topbar .tab[aria-current="page"]{color:var(--ink);border-bottom-color:var(--accent)}
215211

216-
.pages{max-width:1200px;margin:0 auto;padding:28px 24px 80px}
217-
.page > .card + .card{margin-top:18px}
218-
219-
/* Desktop: proper dashboard chrome — fixed sidebar, content column. */
220-
/* Geometric glyph per section — keyed off data-tab so admin.js's
221-
markup stays untouched. Sidebar-only: inline glyphs wrap badly in
222-
the narrow horizontal top bar. */
223-
@media (min-width:1001px){
224-
.topbar .tab::before{
225-
font-family:var(--mono);
226-
display:inline-block;width:17px;text-align:center;
227-
margin-right:7px;color:var(--ink-faint);
228-
transition:color .15s;
229-
}
230-
.topbar .tab[data-tab="overview"]::before{content:"▤"}
231-
.topbar .tab[data-tab="blog"]::before{content:"✎"}
232-
.topbar .tab[data-tab="brand"]::before{content:"◈"}
233-
.topbar .tab[data-tab="covers"]::before{content:"▣"}
234-
.topbar .tab[data-tab="seo"]::before{content:"↗"}
235-
.topbar .tab[data-tab="status"]::before{content:"◉"}
236-
.topbar .tab[data-tab="settings"]::before{content:"⚙"}
237-
.topbar .tab:hover::before,
238-
.topbar .tab[aria-current="page"]::before{color:var(--accent)}
239-
}
212+
.pages{max-width:1240px;margin:0 auto;padding:28px 24px 80px}
213+
.page > .card + .card{margin-top:16px}
240214

241215
@media (min-width:1001px){
242216
.topbar{
243-
position:fixed;top:0;left:0;bottom:0;width:238px;
244-
flex-direction:column;align-items:stretch;gap:6px;
245-
padding:22px 14px 16px;
246-
background:var(--bg-soft);backdrop-filter:none;
217+
position:fixed;top:0;left:0;bottom:0;width:220px;
218+
flex-direction:column;align-items:stretch;gap:4px;
219+
padding:20px 12px 14px;
220+
background:var(--bg-soft);
247221
border-bottom:none;border-right:1px solid var(--line);
248222
overflow-y:auto;
249223
}
250224
.topbar .brand{
251-
font-size:14px;padding:0 10px 16px;margin-bottom:8px;
252-
border-bottom:1px solid var(--line);
225+
font-size:17px;padding:2px 8px 18px;margin-bottom:4px;
226+
border-bottom:1px solid var(--line);letter-spacing:-0.01em;
253227
}
254-
.topbar .tabs{flex-direction:column;gap:2px;margin-left:0;flex:0 0 auto}
228+
.topbar .brand::after{display:block;margin-left:0;margin-top:2px}
229+
.topbar .tabs{flex-direction:column;gap:1px;margin-left:0;flex:0 0 auto;overflow:visible}
255230
.topbar .tab{
256231
display:flex;align-items:center;width:100%;
257-
text-align:left;padding:9px 12px;border-radius:8px;font-size:13.5px;
232+
text-align:left;padding:8px 10px;border-radius:6px;font-size:13px;
233+
border-bottom:0;
234+
}
235+
.topbar .tab::before{
236+
content:'';display:inline-block;width:4px;height:4px;border-radius:50%;
237+
background:var(--ink-faint);margin-right:10px;flex-shrink:0;
238+
transition:background .12s;
258239
}
259240
.topbar .tab[aria-current="page"]{
260-
background:var(--accent-soft);border-color:transparent;
261-
box-shadow:inset 2px 0 0 var(--accent);
241+
background:var(--accent-soft);color:var(--ink);
262242
}
243+
.topbar .tab[aria-current="page"]::before{background:var(--accent)}
244+
.topbar .tab:hover{background:rgba(255,255,255,0.04);color:var(--ink)}
245+
:root[data-theme="light"] .topbar .tab:hover{background:rgba(0,0,0,0.04)}
263246
/* Sub-nav nests under its parent tab as an indented column. */
264247
.topbar .subtabs{
265248
flex-direction:column;gap:1px;
266249
background:transparent;border-bottom:none;
267-
padding:2px 0 8px 34px;overflow:visible;
250+
padding:2px 0 6px 22px;overflow:visible;
268251
}
269-
.topbar .subtab{text-align:left;padding:6px 10px;font-size:12.5px;border-radius:6px}
252+
.topbar .subtab{text-align:left;padding:5px 10px;font-size:12px;border-radius:5px}
270253
/* Tools pin to the sidebar foot. */
271254
.topbar .topbar-tools{
272-
margin-top:auto;flex-direction:column;align-items:stretch;gap:8px;
273-
padding-top:14px;border-top:1px solid var(--line);
255+
margin-top:auto;flex-direction:column;align-items:stretch;gap:6px;
256+
padding-top:12px;border-top:1px solid var(--line);
274257
}
275-
.topbar .topbar-tools .btn{justify-content:center}
258+
.topbar .topbar-tools .btn{justify-content:center;font-size:12px}
276259
.topbar .version-badge{justify-content:center;margin-right:0}
277-
.pages{margin-left:238px;max-width:1140px;padding:34px 40px 90px}
260+
.pages{margin-left:220px;padding:32px 36px 90px}
278261
}
279262

280263
.grid-3{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-bottom:18px}
@@ -285,13 +268,13 @@ a:hover{text-decoration:underline}
285268
background:var(--bg-card);
286269
}
287270
.card-eyebrow{
288-
font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;
289-
color:var(--accent);margin-bottom:8px;
271+
font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;
272+
color:var(--ink-faint);margin-bottom:6px;
290273
}
291-
.card h2{margin:0 0 6px;font-size:18px;font-weight:600;letter-spacing:-0.01em}
274+
.card h2{margin:0 0 6px;font-size:17px;font-weight:600;letter-spacing:-0.01em}
292275
.card > p{margin:0 0 16px;color:var(--ink-dim);font-size:14px}
293-
.card-stat{font-family:var(--serif);font-size:42px;font-weight:400;color:var(--ink);letter-spacing:-0.01em;line-height:1.05}
294-
.card-sub{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);margin-top:4px}
276+
.card-stat{font-family:var(--mono);font-size:38px;font-weight:600;color:var(--ink);letter-spacing:-0.04em;line-height:1}
277+
.card-sub{font-size:12px;color:var(--ink-faint);margin-top:5px;text-transform:uppercase;letter-spacing:.06em;font-family:var(--mono)}
295278
/* "Stuck? Hand off to an AI" card — slightly tinted so it reads as an
296279
escape hatch rather than a primary control. */
297280
.ai-help-card{
@@ -617,6 +600,26 @@ em.optional{font-style:normal;color:var(--ink-faint);font-size:11px;letter-spaci
617600
.provider-del{color:var(--bad)}
618601
.provider-del:hover{background:rgba(241,103,103,0.08);border-color:var(--bad)}
619602

603+
/* Model selector row inside a provider card */
604+
.provider-model-row{
605+
display:flex;align-items:center;gap:6px;
606+
padding-top:4px;border-top:1px solid var(--line);
607+
margin-top:2px;
608+
}
609+
.provider-model-label{
610+
font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;
611+
text-transform:uppercase;color:var(--ink-faint);
612+
flex-shrink:0;
613+
}
614+
.provider-model-select{
615+
flex:1;padding:5px 8px;
616+
background:var(--bg);color:var(--ink);
617+
border:1px solid var(--line);border-radius:5px;
618+
font:inherit;font-size:12px;
619+
min-width:0;
620+
}
621+
.provider-model-select:focus{outline:none;border-color:var(--accent)}
622+
620623
.filter-results{margin-top:14px}
621624
.filter-results h4{font-size:13px;color:var(--ink-dim);margin:0 0 8px;font-weight:500;text-transform:uppercase;letter-spacing:0.05em}
622625
.filter-results ul{list-style:none;padding:0;margin:0;border:1px solid var(--line);border-radius:6px;max-height:280px;overflow:auto;background:var(--bg-soft)}

0 commit comments

Comments
 (0)