diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 1db1d40..578a6e1 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -8,7 +8,7 @@ { "name": "code-walkthrough", "description": "code-walkthrough: turn a diff, branch, PR, or existing code into a top-down walkthrough page: overview, story map, call graph, annotated diff, and line comments you hand back to the agent", - "version": "1.5.0", + "version": "1.6.0", "source": "./", "author": { "name": "crisperity" diff --git a/skills/code-walkthrough/assets/cw-nav.html b/skills/code-walkthrough/assets/cw-nav.html index d3ff9fe..dfb5f29 100644 --- a/skills/code-walkthrough/assets/cw-nav.html +++ b/skills/code-walkthrough/assets/cw-nav.html @@ -428,21 +428,6 @@ return svg; } -function offsetBelowBanner(bar){ - var banner=null, ro=window.ResizeObserver&&new ResizeObserver(sync); - function sync(){bar.style.marginTop=banner&&banner.isConnected?banner.offsetHeight+'px':'';} - function find(){ - var b=document.getElementById('cw-live-banner'); - if(b===banner) return; - if(ro&&banner) ro.unobserve(banner); - banner=b; - if(ro&&b) ro.observe(b); - sync(); - } - find(); - new MutationObserver(find).observe(document.body,{childList:true}); -} - function buildHeader(nav){ var bar=el('header','cwn-bar'), mark=el('a','cwn-mark'); mark.appendChild(markSVG()); @@ -472,7 +457,6 @@ right.appendChild(btn); bar.appendChild(right); document.body.insertBefore(bar,document.body.firstChild); - offsetBelowBanner(bar); } function typing(t){ diff --git a/skills/code-walkthrough/assets/diff-review-template.html b/skills/code-walkthrough/assets/diff-review-template.html index c72b875..0c5e0c3 100644 --- a/skills/code-walkthrough/assets/diff-review-template.html +++ b/skills/code-walkthrough/assets/diff-review-template.html @@ -409,15 +409,20 @@ padding:8px 13px;font-size:var(--fs-xs);color:var(--muted);opacity:0; transition:opacity .25s ease;pointer-events:none;z-index:30} .vd-nav-toast.on{opacity:1} - #cw-live-banner{position:fixed;top:0;left:0;right:0;z-index:50; - background:var(--panel);border-bottom:1px solid var(--border); - padding:6px 14px;font-size:var(--fs-xs);color:var(--muted); - font-family:var(--mono);text-align:center} + #cw-live-banner{position:relative;display:flex;align-items:center;padding:0 10px; + font:var(--fs-xs) var(--mono);color:var(--muted)} + #cw-live-banner>summary{display:flex;align-items:center;justify-content:center;min-width:20px;height:38px;cursor:pointer;white-space:nowrap;list-style:none} + #cw-live-banner>summary::-webkit-details-marker{display:none} + #cw-live-banner>summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:8px} + #cw-live-banner .cw-live-dot{width:8px;height:8px;border-radius:50%;background:var(--green)} #cw-live-banner.failed{color:var(--red)} - #cw-live-reload{position:fixed;left:16px;bottom:16px;z-index:40; - display:inline-flex;align-items:center;height:38px;padding:0 14px;white-space:nowrap; + #cw-live-banner.failed .cw-live-dot{background:var(--red)} + .cw-live-body{position:absolute;right:0;bottom:calc(100% + 10px);z-index:1;width:max-content;max-width:min(420px,calc(100vw - 32px)); + padding:8px 12px;background:var(--panel);border:1px solid var(--border);border-radius:8px; + box-shadow:0 6px 20px rgba(0,0,0,.35);white-space:normal;overflow-wrap:anywhere} + #cw-live-reload{display:inline-flex;align-items:center;height:30px;padding:0 12px;white-space:nowrap; background:var(--panel2);border:1px solid var(--accent);color:var(--text);border-radius:999px; - font:600 var(--fs-sm) system-ui;cursor:pointer;box-shadow:0 6px 20px rgba(0,0,0,.35)} + font:600 var(--fs-sm) system-ui;cursor:pointer} #cw-live-reload:focus-visible{outline:2px solid var(--accent);outline-offset:2px} /* Brief highlight so "Go to file" is visible arriving at the hunk, not just landing on it. */ details.hunk.vd-flash{border-color:var(--accent)} @@ -646,8 +651,12 @@ border:1px solid var(--border);border-left:3px solid var(--yellow);border-radius:8px; padding:10px 16px;font-size:var(--fs-sm);color:var(--text)} - #cw-dock{position:fixed;right:16px;bottom:16px;z-index:40; - display:flex} + #cw-tray{position:fixed;right:16px;bottom:16px;z-index:41;display:flex;align-items:center;gap:6px;padding:4px; + background:var(--panel);border:1px solid var(--border);border-radius:999px; + box-shadow:0 6px 20px rgba(0,0,0,.35);max-width:calc(100vw - 32px)} + #cw-tray:not(:has(>:not([hidden]))){display:none} + #cw-tray>*+*{border-left:1px solid var(--border);padding-left:6px} + #cw-dock{display:flex} #cw-dock[hidden]{display:none} .cw-skel{position:relative;overflow:hidden;margin:12px 0;padding:12px 16px; border:1px dashed var(--border);border-radius:8px;color:var(--muted);font-size:var(--fs-sm)} @@ -664,7 +673,7 @@ #hr-comments-btn{display:inline-flex;align-items:center;gap:8px;height:38px;padding:0 14px;white-space:nowrap; background:var(--panel2);border:1px solid var(--border);color:var(--text);border-radius:999px; font:600 var(--fs-sm) system-ui;cursor:pointer;user-select:none;-webkit-user-select:none; - box-shadow:0 6px 20px rgba(0,0,0,.35);transition:transform .15s,border-color .15s} + transition:transform .15s,border-color .15s} #hr-comments-btn:hover{border-color:var(--accent)} #hr-comments-btn:active{transform:scale(.97)} #hr-comments-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px} @@ -817,7 +826,7 @@ .cw-thread button:focus-visible,.cw-compose button:focus-visible, .cw-compose textarea:focus-visible{outline:2px solid var(--accent);outline-offset:2px} :root{--cw-panel-w:clamp(360px,34vw,560px)} - /* above #cw-live-banner (z 50); the drafts bar (z 45) stays below */ + /* above the tray (z 41); the drafts bar (z 45) stays below */ #cw-panel{position:fixed;top:0;right:0;bottom:0;z-index:51;width:var(--cw-panel-w); display:flex;flex-direction:column;box-sizing:border-box;background:var(--panel);color:var(--text); border-left:1px solid var(--border);box-shadow:-8px 0 24px rgba(0,0,0,.35)} @@ -864,7 +873,7 @@ #cw-panel-compose{flex:none;min-width:0} #cw-panel .cw-thread{margin:0;padding:0;border-left:0;background:none} @media (min-width:601px) and (pointer:fine){ - .cw-panel-open #cw-dock{right:calc(var(--cw-panel-w) + 16px)} + .cw-panel-open #cw-tray{right:calc(var(--cw-panel-w) + 16px)} .cw-panel-open #cw-toast{left:calc(50% - var(--cw-panel-w)/2)} } @media (min-width:1100px) and (pointer:fine){ @@ -884,7 +893,7 @@ #cw-panel-grab::before{content:'';width:36px;height:4px;border-radius:2px;background:var(--border)} #cw-panel[data-sheet="collapsed"] #cw-panel-grab{height:56px} #cw-panel[data-sheet="expanded"] .cw-grab-text{display:none} - .cw-panel-open #cw-dock{display:none} + .cw-panel-open #cw-tray{display:none} } .cw-thread,.cw-compose{display:block;box-sizing:border-box;max-width:100%;margin:6px 0; padding:8px 10px;border-left:3px solid var(--purple); @@ -1208,16 +1217,26 @@ .cw-gchip[aria-pressed=true].ok{border-color:var(--green);color:var(--green)} .cw-gchip[aria-pressed=true].fix{border-color:var(--yellow);color:var(--yellow)} #cw-bar.cw-sug-rc [data-ev=REQUEST_CHANGES],#cw-bar.cw-sug-ok [data-ev=APPROVE]{background:var(--accent);color:var(--bg);border-color:var(--accent)} - #cw-bar{position:fixed;left:0;right:0;bottom:0;z-index:41;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px; - padding:8px 16px calc(8px + env(safe-area-inset-bottom));background:var(--panel);border-top:1px solid var(--border)} - #cw-bar[hidden],.cw-panel-open #cw-bar,.cw-typing #cw-bar{display:none} - #cw-bar-count{color:var(--muted);font-size:var(--fs-sm)} - #cw-bar-btns{display:flex;flex-wrap:wrap;gap:8px} + #cw-bar{position:relative;display:flex;align-items:center} + #cw-bar[hidden],.cw-panel-open #cw-bar{display:none} + .cw-typing #cw-tray{visibility:hidden;pointer-events:none} + #cw-bar-toggle{display:inline-flex;align-items:center;gap:4px;height:38px;padding:0 14px;white-space:nowrap; + background:var(--panel2);border:1px solid var(--border);color:var(--text);border-radius:999px; + font:600 var(--fs-sm) system-ui;cursor:pointer} + #cw-bar-toggle:hover,#cw-bar-toggle[aria-expanded=true]{border-color:var(--accent)} + #cw-bar-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px} + #cw-bar.cw-sug-ok #cw-bar-toggle{border-color:var(--green)} + #cw-bar.cw-sug-rc #cw-bar-toggle{border-color:var(--red)} + #cw-bar-count{color:var(--muted);font-weight:400} + #cw-bar-btns{position:absolute;right:0;bottom:calc(100% + 10px);z-index:1;width:230px;display:flex;flex-direction:column;gap:8px; + padding:8px;background:var(--panel);border:1px solid var(--border);border-radius:12px;box-shadow:0 6px 20px rgba(0,0,0,.35)} + #cw-bar-btns[hidden]{display:none} + #cw-bar-btns button:focus-visible{outline:2px solid var(--accent);outline-offset:2px} #cw-bar-btns button{min-height:40px;padding:6px 14px;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:inherit;font:inherit;cursor:pointer} #cw-bar-btns [data-ev=APPROVE]{border-color:var(--green);color:var(--green)} #cw-bar-btns [data-ev=REQUEST_CHANGES]{border-color:var(--red);color:var(--red)} + body:has(#cw-tray>:not([hidden])) #plan-content{padding-bottom:88px} body.cw-has-bar #plan-content{padding-bottom:88px} - body.cw-has-bar #cw-dock{bottom:72px} /* First-glance concepts (render.py concepts_html): a card per idea, picture then Before/After/Why. */ .cw-concept{margin:12px 0;padding:12px;background:var(--panel);border:1px solid var(--border);border-radius:10px} @@ -1329,8 +1348,7 @@ .vd-level-toggle{min-height:44px;padding:10px 14px} details.hunk>summary{min-height:44px} #cw-wrap-toggle{min-height:44px;padding:10px 14px} - #hr-comments-btn,#cw-live-reload{height:44px} - .cw-typing #cw-dock{visibility:hidden;pointer-events:none} + #hr-comments-btn,#cw-live-reload,#cw-bar-toggle{height:44px} #hr-comments-close{width:44px;height:44px;font-size:16px} #hr-comments-list button{min-height:44px} .cw-dc button{min-height:44px;padding:10px 14px} @@ -1368,6 +1386,14 @@ .chip-fix{padding:13px 7px;margin:-11px 0} } + @media (max-width:600px),(pointer:coarse){ + body.cw-has-bar #cw-selbar{bottom:76px} + body.cw-has-bar #cw-toast{bottom:76px} + #cw-tray{left:8px;right:8px;bottom:calc(8px + env(safe-area-inset-bottom));justify-content:flex-end;max-width:none} + #cw-bar,#cw-live-banner{position:static} + .cw-live-body{left:0;right:auto} + #cw-bar-btns{left:0;width:auto} + } @media (prefers-reduced-motion:reduce){ *,*::before,*::after{transition-duration:.01ms!important;animation-duration:.01ms!important; animation-iteration-count:1!important;scroll-behavior:auto!important} @@ -1379,7 +1405,11 @@ -
+