assets/site-template.html
assets/site-template.htmlBrowse 7 files
4,533 tokens
14,791 bytes
Token encoding: o200k_base
Snapshot 5b913e7
← Back to SKILL.md
1<!doctype html>2<!--3 Wireframe review viewer — copy to design/<task-slug>/index.html and fill in.4 House style: monochrome, system font, 8px grid, sticky TOC, lightbox.5 Replace TODO markers; duplicate <section class="screen"> per wireframe.6-->7<html lang="en">8<head>9<meta charset="utf-8" />10<meta name="viewport" content="width=device-width, initial-scale=1" />11<title>TODO — review viewer title</title>12<style>13 :root {14 --bg: #fafaf8;15 --panel: #ffffff;16 --ink: #111111;17 --muted: #666666;18 --line: #e5e5e0;19 --accent: #d33;20 --maxw: 1200px;21 }22 * { box-sizing: border-box; }23 html, body { margin: 0; padding: 0; }24 body {25 font: 15px/1.55 -apple-system, system-ui, "Segoe UI", sans-serif;26 background: var(--bg);27 color: var(--ink);28 -webkit-font-smoothing: antialiased;29 }30 a { color: inherit; }31 32 .shell { display: grid; grid-template-columns: 240px 1fr; min-height: 100vh; }33 34 .toc {35 position: sticky; top: 0; align-self: start;36 height: 100vh; overflow: auto;37 padding: 24px 16px 24px 24px;38 border-right: 1px solid var(--line);39 background: var(--panel);40 font-size: 13px;41 z-index: 20;42 }43 .toc h1 { font-size: 14px; margin: 0 0 4px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); }44 .toc h2 { font-size: 12px; margin: 24px 0 6px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); font-weight: 700; }45 .toc a { display: block; text-decoration: none; padding: 6px 8px; margin-left: -8px; border-radius: 4px; color: var(--ink); }46 .toc a:hover { background: var(--bg); }47 .toc .num { display: inline-block; width: 22px; color: var(--muted); }48 .toc .toc-summary { display: none; }49 .toc .toc-body { display: block; }50 51 main { padding: 48px 56px 96px; max-width: 1300px; min-width: 0; }52 53 header.hero { max-width: var(--maxw); margin-bottom: 64px; }54 header.hero .crumb { color: var(--muted); font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase; }55 header.hero h1 { font-size: 36px; line-height: 1.15; margin: 8px 0 16px; }56 header.hero p { color: var(--muted); max-width: 720px; font-size: 16px; }57 header.hero .pills { margin-top: 20px; display: flex; gap: 8px; flex-wrap: wrap; }58 header.hero .pill { font-size: 12px; padding: 4px 10px; border: 1px solid var(--line); border-radius: 999px; background: var(--panel); color: var(--muted); }59 60 section { scroll-margin-top: 24px; max-width: var(--maxw); margin-bottom: 96px; }61 section .lede { color: var(--muted); margin: 0 0 12px; font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase; font-weight: 700; }62 section h2 { font-size: 28px; line-height: 1.2; margin: 0 0 8px; }63 section h2 .step-num { display: inline-block; width: 40px; color: var(--muted); }64 section h3 { font-size: 16px; margin: 24px 0 8px; }65 section .desc { color: var(--muted); margin: 0 0 24px; max-width: 760px; }66 67 /* canvas: desktop wire (wide) on left, mobile wire (tall narrow) middle, notes right.68 Mobile is a first-class deliverable — never tabbed, never stacked away. */69 .grid {70 display: grid; gap: 24px;71 grid-template-columns: minmax(0, 1.4fr) 220px minmax(0, 0.9fr);72 align-items: start;73 }74 @media (max-width: 1180px) {75 .grid { grid-template-columns: minmax(0, 1fr) 200px; }76 .grid > .notes-col { grid-column: 1 / -1; }77 }78 @media (max-width: 980px) { .grid { grid-template-columns: 1fr; } .grid > .mobile-col { max-width: 280px; } }79 80 /* tablet */81 @media (max-width: 900px) {82 .shell { grid-template-columns: 1fr; }83 .toc {84 position: sticky; top: 0;85 height: auto; max-height: 60vh;86 padding: 12px 16px;87 border-right: none;88 border-bottom: 1px solid var(--line);89 }90 .toc .toc-summary {91 display: flex;92 justify-content: space-between;93 align-items: center;94 cursor: pointer;95 list-style: none;96 padding: 4px 0;97 }98 .toc .toc-summary::-webkit-details-marker { display: none; }99 .toc .toc-summary .title { font-size: 13px; font-weight: 600; }100 .toc .toc-summary .crumb { font-size: 11px; color: var(--muted); letter-spacing: 0.04em; text-transform: uppercase; }101 .toc .toc-summary .chevron {102 width: 10px; height: 10px;103 border-right: 1.5px solid var(--ink);104 border-bottom: 1.5px solid var(--ink);105 transform: rotate(45deg);106 transition: transform 120ms ease;107 margin-right: 4px;108 }109 .toc[open] .toc-summary .chevron { transform: rotate(225deg) translate(-2px, -2px); }110 .toc .toc-body { display: none; padding-top: 8px; border-top: 1px solid var(--line); margin-top: 8px; }111 .toc[open] .toc-body { display: block; }112 main { padding: 24px 20px 64px; }113 header.hero { margin-bottom: 40px; }114 header.hero h1 { font-size: 28px; }115 header.hero p { font-size: 15px; }116 section { margin-bottom: 64px; scroll-margin-top: 80px; }117 section h2 { font-size: 24px; }118 section h2 .step-num { width: 32px; }119 .flow-section { padding: 20px; margin-bottom: 40px; scroll-margin-top: 80px; }120 }121 122 /* phone */123 @media (max-width: 560px) {124 main { padding: 16px 14px 56px; }125 header.hero { margin-bottom: 32px; }126 header.hero h1 { font-size: 24px; line-height: 1.2; }127 header.hero p { font-size: 14px; }128 section { margin-bottom: 48px; }129 section h2 { font-size: 20px; line-height: 1.25; }130 section h2 .step-num { width: 28px; }131 section h3 { font-size: 15px; margin: 20px 0 6px; }132 section .desc { font-size: 14px; }133 .grid { gap: 16px; }134 .flow-section { padding: 16px; border-radius: 8px; }135 .wire .label { padding: 8px 10px; font-size: 11px; gap: 8px; }136 body { font-size: 14px; }137 }138 139 .wire {140 background: var(--panel);141 border: 1px solid var(--line);142 border-radius: 8px;143 overflow: hidden;144 cursor: zoom-in;145 transition: transform 80ms ease, box-shadow 80ms ease;146 }147 .wire:hover { box-shadow: 0 8px 24px rgba(0,0,0,0.08); }148 .wire .label {149 padding: 10px 14px;150 font-size: 12px;151 color: var(--muted);152 border-bottom: 1px solid var(--line);153 display: flex; justify-content: space-between; align-items: center;154 }155 .wire img { display: block; width: 100%; height: auto; background: #fff; }156 /* mobile wire renders narrow inside its 220px column so it reads as a phone */157 .wire.mobile-wire img { max-width: 220px; margin: 0 auto; }158 159 .ref {160 background: var(--panel);161 border: 1px solid var(--line);162 border-radius: 8px;163 padding: 14px;164 }165 .ref .label { font-size: 12px; color: var(--muted); margin-bottom: 8px; display: flex; justify-content: space-between; align-items: baseline; }166 .ref img { display: block; width: 100%; height: auto; border: 1px solid var(--line); border-radius: 4px; cursor: zoom-in; }167 168 .notes ul { padding-left: 20px; margin: 8px 0; }169 .notes li { margin-bottom: 6px; }170 .notes .why {171 background: var(--panel);172 border: 1px solid var(--line);173 border-left: 3px solid var(--ink);174 padding: 14px 18px;175 border-radius: 4px;176 margin-top: 12px;177 font-size: 14px;178 }179 180 .flow-section { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 32px; margin-bottom: 64px; max-width: var(--maxw); }181 .flow-section h2 { margin-top: 0; }182 .flow-section .wire { margin-top: 16px; }183 184 /* lightbox */185 .lightbox {186 position: fixed; inset: 0;187 background: rgba(0,0,0,0.86);188 display: none;189 align-items: center; justify-content: center;190 z-index: 100;191 cursor: zoom-out;192 padding: 32px;193 }194 .lightbox.open { display: flex; }195 .lightbox img { max-width: 100%; max-height: 100%; background: #fff; box-shadow: 0 30px 80px rgba(0,0,0,0.4); border-radius: 4px; }196 .lightbox .close { position: absolute; top: 16px; right: 24px; font-size: 28px; color: #fff; cursor: pointer; }197 .lightbox .caption { position: absolute; bottom: 16px; left: 50%; transform: translateX(-50%); color: #fff; font-size: 13px; opacity: 0.9; }198 199 /* mobile lightbox — must come after the desktop rules to win the cascade */200 @media (max-width: 560px) {201 .lightbox { padding: 12px; overflow: auto; touch-action: pinch-zoom; }202 .lightbox.open { display: block; }203 .lightbox img { display: block; width: 100%; max-width: none; max-height: none; height: auto; margin: 40px auto 56px; box-shadow: none; }204 .lightbox .close { position: fixed; top: 8px; right: 12px; font-size: 32px; }205 .lightbox .caption { position: fixed; left: 50%; transform: translateX(-50%); font-size: 12px; bottom: 12px; text-align: center; background: rgba(0,0,0,0.7); border-radius: 4px; padding: 6px 12px; }206 }207 208 .footer { color: var(--muted); font-size: 12px; max-width: var(--maxw); border-top: 1px solid var(--line); padding-top: 24px; }209</style>210</head>211<body>212 <div class="shell">213 <details class="toc">214 <summary class="toc-summary">215 <span>216 <span class="crumb">TODO-ID · TODO short title</span><br>217 <span class="title">Jump to a screen</span>218 </span>219 <span class="chevron" aria-hidden="true"></span>220 </summary>221 <nav class="toc-body" aria-label="Section navigation">222 <h1>TODO-ID</h1>223 <div style="font-size: 13px; color: var(--muted); margin-bottom: 16px;">TODO short title</div>224 225 <h2>Flow</h2>226 <a href="#flow"><span class="num">⤳</span>Flow diagram</a>227 228 <h2>Screens</h2>229 <a href="#s1"><span class="num">1</span>TODO screen 1 name</a>230 <!-- duplicate per screen -->231 232 <h2>Open questions</h2>233 <a href="#open"><span class="num">?</span>For reviewer</a>234 </nav>235 </details>236 237 <main>238 <header class="hero">239 <div class="crumb">TODO-ID · Wireframes</div>240 <h1>TODO — long title</h1>241 <p>TODO — one-paragraph summary of what this set covers and why.</p>242 <div class="pills">243 <span class="pill">TODO N screens</span>244 <span class="pill">Desktop + mobile</span>245 <span class="pill">Lo-fi · monochrome</span>246 <span class="pill">Click any wireframe to zoom</span>247 </div>248 </header>249 250 <!-- ========== Flow diagram (optional) ========== -->251 <section id="flow" class="flow-section">252 <div class="lede">Flow</div>253 <h2>TODO — flow title</h2>254 <p class="desc">TODO — describe arrow conventions (solid = happy path, dashed = branch).</p>255 <div class="wire" data-zoom data-caption="Flow diagram">256 <div class="label"><span>flow.svg</span><span>TODO WxH</span></div>257 <img src="wireframes/flow.svg" alt="Flow diagram" />258 </div>259 </section>260 261 <!-- ========== Screen template — duplicate per screen ==========262 Three cells per row: desktop wire | mobile wire | notes-col.263 Mobile is mandatory; only drop it when the user explicitly opted out. -->264 <section id="s1">265 <div class="lede">Step 1 · TODO group</div>266 <h2><span class="step-num">1.</span>TODO screen name</h2>267 <p class="desc">TODO — one-paragraph describing the screen's purpose.</p>268 <div class="grid">269 <div class="wire" data-zoom data-caption="01 · TODO screen name (desktop)">270 <div class="label"><span>01-screen.svg</span><span>1280×800 · desktop</span></div>271 <img src="wireframes/01-screen.svg" alt="TODO screen name (desktop) wireframe" />272 </div>273 <div class="wire mobile-wire mobile-col" data-zoom data-caption="01 · TODO screen name (mobile)">274 <div class="label"><span>mobile</span><span>375×812</span></div>275 <img src="wireframes/01-screen-mobile.svg" alt="TODO screen name (mobile) wireframe" />276 </div>277 <div class="notes-col">278 <!-- Optional reference (real-world example we're modelling) -->279 <div class="ref">280 <div class="label"><span>Reference</span><span>TODO source</span></div>281 <img src="screenshots/TODO-ref.png" alt="TODO reference" data-zoom />282 </div>283 <div class="notes">284 <h3>Annotations</h3>285 <ul>286 <li><b>1</b> — TODO callout 1.</li>287 <li><b>2</b> — TODO callout 2 (note where mobile diverges).</li>288 </ul>289 <div class="why"><b>Why this changes:</b> TODO rationale vs current state.</div>290 </div>291 </div>292 </div>293 </section>294 295 <!-- ========== Open questions ========== -->296 <section id="open">297 <div class="lede">For reviewer</div>298 <h2>Open questions</h2>299 <div class="notes">300 <ul>301 <li><b>TODO</b> — Open question 1.</li>302 </ul>303 </div>304 </section>305 306 <div class="footer">307 Wireframes follow the in-tree <code>wireframe</code> skill house style — black on white, 1.5pt strokes, 8px grid, type sizes 12/14/20/28. Red dashed annotations are the call-out layer only and not part of the proposed UI.308 </div>309 </main>310 </div>311 312 <div class="lightbox" id="lb" aria-hidden="true">313 <span class="close" id="lbClose">×</span>314 <img id="lbImg" alt="" />315 <div class="caption" id="lbCap"></div>316 </div>317 318<script>319 // Click-to-zoom: any element marked [data-zoom] OR any <img> inside [data-zoom]320 const lb = document.getElementById('lb');321 const lbImg = document.getElementById('lbImg');322 const lbCap = document.getElementById('lbCap');323 const lbClose = document.getElementById('lbClose');324 325 document.querySelectorAll('[data-zoom]').forEach((el) => {326 el.addEventListener('click', () => {327 const target = el.tagName === 'IMG' ? el : el.querySelector('img');328 if (!target) return;329 lbImg.src = target.src;330 lbImg.alt = target.alt;331 lbCap.textContent = el.dataset.caption || target.alt || '';332 lb.classList.add('open');333 });334 });335 336 function close() { lb.classList.remove('open'); }337 lb.addEventListener('click', close);338 lbClose.addEventListener('click', close);339 document.addEventListener('keydown', (e) => { if (e.key === 'Escape') close(); });340 341 // TOC: open by default on desktop (<details> would otherwise hide body),342 // closed by default on mobile so the long list doesn't dominate the viewport.343 const toc = document.querySelector('details.toc');344 if (toc) {345 const mq = window.matchMedia('(max-width: 900px)');346 const apply = () => { toc.open = !mq.matches; };347 apply();348 mq.addEventListener('change', apply);349 // On mobile, collapse the TOC after the user taps a link.350 toc.querySelectorAll('.toc-body a').forEach((a) => {351 a.addEventListener('click', () => { if (mq.matches) toc.open = false; });352 });353 }354</script>355</body>356</html>357 Referenced from SKILL.md
SKILL.mdView in source ↗
Source excerpt starting at line 134.SKILL.mdView in source ↗134**Page anatomy** (start from `assets/site-template.html` and adjust — do not re-derive the CSS):
Source excerpt starting at line 192.192- `assets/template-mobile.svg` — same for 375×812 mobile.193- `assets/site-template.html` — minimal review-viewer page (sticky TOC + responsive collapse + lightbox). Copy to `design/<task-slug>/index.html` and fill in the sections when the user requests a website.