@@ -374,39 +374,51 @@ function renderStudioHtml(): string {
374374 <style>
375375 :root { color-scheme: light; ${ cssVars } ; --ok:var(--th-success); --err:var(--th-danger); --warn:var(--th-accent); }
376376 * { box-sizing: border-box; }
377- body { margin:0; font-family: var(--th-font-body); background: radial-gradient(circle at 8% 0%, #255bb688, transparent 42%), radial-gradient(circle at 88% 0%, #50b9fa66, transparent 36%), linear-gradient(155deg, var(--th-bg) 20%, var(--th-bg-alt) 100%); color: var(--th-text); }
378- .wrap { max-width: 1400px; margin: 0 auto; padding: 20px; }
377+ body { margin:0; font-family: var(--th-font-body); background: radial-gradient(circle at 18% 24%, #f1f6ff 0, #f1f6ff 44%, transparent 44%), radial-gradient(circle at 18% 24%, #f7faff 0, #f7faff 52%, transparent 52%), linear-gradient(180deg, #ffffff 0%, #f6f9ff 100%); color: #021a4d; }
378+ .wrap { max-width: 1400px; margin: 0 auto; padding: 28px 24px 40px; position: relative; }
379+ .hero { margin-bottom: 18px; }
380+ .brandMark { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
381+ .brandRing { width: 42px; height: 42px; border-radius: 50%; border: 5px solid #0a4df0; border-right-color: transparent; transform: rotate(-20deg); }
382+ .brandWord { font-family: var(--th-font-display); font-size: 52px; font-weight: 900; letter-spacing: .01em; color: #031f63; line-height: 1; }
383+ .heroTitle { margin: 0; font-size: 34px; font-family: var(--th-font-display); font-weight: 800; color: #0a43d8; letter-spacing: .01em; }
384+ .heroSub { margin-top: 6px; color: #375b9d; font-size: 15px; max-width: 900px; }
379385 .row { display:grid; grid-template-columns: 1.6fr 1fr; gap: 14px; }
380- .panel { background: linear-gradient(180deg, #0f2958cf, #0d234bd4); border:1px solid var(--th-border); border-radius: var(--th-radius-lg); padding: var(--th-space-md); box-shadow: 0 8px 32px #02122f4d; }
381- .title { margin:0 0 10px 0; font-size: 22px; font-family: var(--th-font-display); font-weight: 700; }
382- .muted { color: var(--th-muted); font-size: 13px; }
383- textarea { width:100%; min-height: 120px; border-radius: var(--th-radius-sm); border:1px solid var(--th-border); background: #071b3f; color: var(--th-text); padding: 10px; font-family: var(--th-font-mono); font-size: 13px; line-height: 1.35; }
384- input[type=text], input[type=number], select { width: 100%; border-radius: var(--th-radius-sm); border:1px solid var(--th-border); background:#071b3f; color:var(--th-text); padding: 8px; }
385- label { display: block; font-size: 12px; color: var(--th-muted); margin-bottom: 4px; }
386+ .panel { background: #ffffff; border:1px solid #d7e4ff; border-radius: var(--th-radius-lg); padding: var(--th-space-md); box-shadow: 0 8px 24px #1345ac1a; }
387+ .title { margin:0 0 10px 0; font-size: 28px; font-family: var(--th-font-display); font-weight: 800; color: #0a43d8; letter-spacing: .01em; }
388+ .muted { color: #4e6ea7; font-size: 13px; }
389+ textarea { width:100%; min-height: 120px; border-radius: var(--th-radius-sm); border:1px solid #c9dbff; background: #f8fbff; color: #0a255f; padding: 10px; font-family: var(--th-font-mono); font-size: 13px; line-height: 1.35; }
390+ input[type=text], input[type=number], select { width: 100%; border-radius: var(--th-radius-sm); border:1px solid #c9dbff; background:#f8fbff; color:#0a255f; padding: 8px; }
391+ input[type=text]:focus, input[type=number]:focus, select:focus, textarea:focus { outline: 2px solid #7fb5ff; outline-offset: 0; border-color: #7fb5ff; }
392+ label { display: block; font-size: 12px; color: #46689f; margin-bottom: 4px; font-weight: 600; }
386393 .grid2 { display:grid; grid-template-columns: 1fr 1fr; gap:8px; }
387394 .grid3 { display:grid; grid-template-columns: 1fr 1fr 1fr; gap:8px; }
388- .card { border:1px solid var(--th-border) ; border-radius: var(--th-radius-sm); padding: 8px; margin-top: 8px; background: #0a2a5888 ; }
389- .sectionTitle { font-size: 14px; font-weight: 700 ; margin-top: 10px; }
395+ .card { border:1px solid #d7e4ff ; border-radius: var(--th-radius-sm); padding: 8px; margin-top: 8px; background: #ffffff ; }
396+ .sectionTitle { font-size: 14px; font-weight: 800 ; margin-top: 10px; color: #0b3bb6 ; }
390397 .stack { display:flex; flex-direction:column; gap:8px; }
391398 .toolbar { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:10px; }
392399 .configList { display:flex; flex-direction:column; gap:8px; max-height:260px; overflow:auto; }
393- .configRow { display:grid; grid-template-columns: 1fr auto; gap:8px; align-items:center; border:1px solid var(--th-border) ; border-radius: var(--th-radius-sm); padding:8px; background: #0a2a5888 ; }
400+ .configRow { display:grid; grid-template-columns: 1fr auto; gap:8px; align-items:center; border:1px solid #d7e4ff ; border-radius: var(--th-radius-sm); padding:8px; background: #ffffff ; }
394401 .configPath { font-family: var(--th-font-mono); font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
395- button { border:1px solid var(--th-border); color:var(--th-text); background:#15407f; border-radius: var(--th-radius-sm); padding:8px 10px; cursor:pointer; transition: transform var(--th-motion-fast) ease, background var(--th-motion-base) ease; font-weight: 600; }
396- button:hover { background:#1a4f9d; }
402+ button { border:1px solid #0f56e0; color:#ffffff; background:#0f56e0; border-radius: var(--th-radius-sm); padding:8px 10px; cursor:pointer; transition: transform var(--th-motion-fast) ease, background var(--th-motion-base) ease; font-weight: 700; }
403+ button:hover { background:#0943b8; }
404+ button:active { transform: translateY(1px); }
397405 .pill { display:inline-block; padding: 2px 8px; border-radius:999px; font-size: 12px; border:1px solid transparent; }
398- .ok { color:#d8ffe9 ; background: color-mix(in srgb, var(--th-success) 24%, transparent) ; border-color: color-mix(in srgb, var(--th-success) 45%, transparent) ;}
399- .err { color:#ffd6d6 ; background: color-mix(in srgb, var(--th-danger) 24%, transparent) ; border-color: color-mix(in srgb, var(--th-danger) 45%, transparent) ;}
400- .warn { color:#fff6d5 ; background: color-mix(in srgb, var(--th-accent) 24%, transparent) ; border-color: color-mix(in srgb, var(--th-accent) 45%, transparent) ;}
406+ .ok { color:#03552e ; background: #d9f8e8 ; border-color: #97e0bc ;}
407+ .err { color:#8a1a1d ; background: #ffdfe0 ; border-color: #f2a3a6 ;}
408+ .warn { color:#6b5300 ; background: #fff2c8 ; border-color: #f2d266 ;}
401409 ul { margin: 8px 0 0 18px; padding:0; }
402410 li { margin: 2px 0; }
403- pre { white-space: pre-wrap; word-break: break-word; background:#071b3f; border:1px solid var(--th-border); border-radius: var(--th-radius-sm); padding: 10px; max-height: 280px; overflow:auto; }
411+ pre { white-space: pre-wrap; word-break: break-word; background:#f8fbff; border:1px solid #c9dbff; border-radius: var(--th-radius-sm); padding: 10px; max-height: 280px; overflow:auto; color: #0a255f; }
412+ @media (max-width: 980px) { .row { grid-template-columns: 1fr; } .grid3 { grid-template-columns: 1fr; } .brandWord { font-size: 40px; } .heroTitle { font-size: 28px; } }
404413 </style>
405414</head>
406415<body>
407416 <div class="wrap">
408- <h1 style="margin:0 0 8px 0;">Token Host Studio (Local)</h1>
409- <div class="muted" style="margin-bottom:14px;">Edit THS JSON, validate/lint in real-time, save/load files, and preview routes + contract surface.</div>
417+ <header class="hero">
418+ <div class="brandMark"><span class="brandRing"></span><span class="brandWord">token host</span></div>
419+ <h1 class="heroTitle">Token Host Studio</h1>
420+ <div class="heroSub">Edit THS JSON, validate/lint in real-time, save/load files, and preview routes + contract surface.</div>
421+ </header>
410422 <section class="panel" style="margin-bottom:14px;">
411423 <h2 class="title">Config Manager</h2>
412424 <div class="grid3">
@@ -696,7 +708,7 @@ function renderStudioHtml(): string {
696708 function renderForm() {
697709 ensureState();
698710 const c = state.collections[selectedCollectionIndex] || makeCollection();
699- const collectionsNav = state.collections.map((col, i) => '<button data-action=\"pick-collection\" data-ci=\"' + i + '\" ' + (i === selectedCollectionIndex ? 'style=\"outline:2px solid #fff ;\"' : '') + '>' + esc(col.name || ('Collection ' + (i + 1))) + '</button> <button data-action=\"del-collection\" data-ci=\"' + i + '\">x</button>').join(' ');
711+ const collectionsNav = state.collections.map((col, i) => '<button data-action=\"pick-collection\" data-ci=\"' + i + '\" ' + (i === selectedCollectionIndex ? 'style=\"outline:2px solid #0d5bff ;\"' : '') + '>' + esc(col.name || ('Collection ' + (i + 1))) + '</button> <button data-action=\"del-collection\" data-ci=\"' + i + '\">x</button>').join(' ');
700712 formRootEl.innerHTML =
701713 '<div class=\"card\"><div class=\"sectionTitle\">Document</div><div class=\"grid2\">' +
702714 '<div><label>thsVersion</label><input type=\"text\" data-bind=\"thsVersion\" value=\"' + esc(state.thsVersion) + '\"></div>' +
0 commit comments