prreviewbuddy 0.64.2 → 0.70.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prreviewbuddy",
3
- "version": "0.64.2",
3
+ "version": "0.70.2",
4
4
  "description": "Review a branch or pull request in an isolated checkout, from your terminal, with the coding agent you already have installed.",
5
5
  "license": "UNLICENSED",
6
6
  "homepage": "https://prreviewbuddy.com",
@@ -0,0 +1 @@
1
+ import{Y as e}from"./chunk-DqEA-C0S.js";async function t(e,t){try{await navigator.clipboard.writeText(t);let n=e.textContent;e.textContent=`Copied`,window.setTimeout(()=>{e.textContent=n},1200)}catch{let n=document.createElement(`input`);n.type=`text`,n.readOnly=!0,n.value=t,n.className=`prb-menu-id`,n.setAttribute(`data-id-field`,``),e.after(n),n.select()}}var n=`button:not([disabled])`;function r(e){return e.querySelector(`[data-menu-panel]`)}function i(e){return e.querySelector(`[data-menu-trigger]`)}function a(e){let t=r(e);return t?[...t.querySelectorAll(n)].filter(e=>!e.closest(`[hidden]`)):[]}var o=`data-menu-placement`;function s(e){let t=e.ownerDocument.defaultView,n=0,r=t?.innerHeight??1/0;for(let i=e.parentElement;i&&t;i=i.parentElement){let e=t.getComputedStyle(i).overflowY;if(e===`visible`||e===``)continue;let a=i.getBoundingClientRect();n=Math.max(n,a.top),r=Math.min(r,a.bottom)}return{top:n,bottom:r}}var c=8,l=120;function u(e){let t=r(e),n=i(e);if(!t||!n)return;t.removeAttribute(o),t.style.removeProperty(`max-height`),t.style.removeProperty(`overflow-y`),t.style.removeProperty(`box-sizing`),t.scrollTop=0;let a=t.getBoundingClientRect(),u=n.getBoundingClientRect(),d=s(e),f=Math.max(0,a.top-u.bottom),p=d.bottom-u.bottom-f-c,m=u.top-d.top-f-c,h=a.height,g=h<=p?`below`:h<=m||m>p?`above`:`below`;g===`above`&&t.setAttribute(o,`above`);let _=g===`above`?m:p;h<=_||(t.style.boxSizing=`border-box`,t.style.maxHeight=`${Math.max(Math.floor(_),l)}px`,t.style.overflowY=`auto`)}function d(e){return!e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey?e.key===`j`?`ArrowDown`:e.key===`k`?`ArrowUp`:e.key:e.key}function f(t,n={}){let o=null,s=null,c=n.within?`${n.within} [data-menu]`:`[data-menu]`,l=e=>e&&(!n.within||e.closest(n.within))?e:null,f=(e,t={})=>{let a=r(e);if(!a||a.hidden)return;a.hidden=!0;let c=i(e);c?.setAttribute(`aria-expanded`,`false`);let l=o===e?s:null;o===e&&(o=null,s=null),n.onClose?.(e),t.returnFocus&&(l??(()=>c?.focus()))()},p=()=>{for(let e of t.querySelectorAll(c))f(e)},m=(e,t,c=null)=>{let l=r(e);l&&(p(),s=c,n.onOpen?.(e),l.hidden=!1,u(e),i(e)?.setAttribute(`aria-expanded`,`true`),o=e,t&&a(e)[0]?.focus())};return t.addEventListener(`click`,e=>{let t=e.target,n=l(t?.closest?.(`[data-menu]`)??null);if(!n){p();return}if(t?.closest(`[data-menu-trigger]`)){let t=e.detail===0;r(n)?.hidden?m(n,t):f(n);return}o&&o!==n&&f(o)}),t.addEventListener(`keydown`,t=>{if(o&&!o.isConnected&&(o=null),!o)return;let n=o;if(t.key===`Escape`){t.preventDefault(),f(n,{returnFocus:!0});return}if(!n.contains(t.target))return;if(t.key===`Tab`){f(n);return}if(e(t.target))return;let r=a(n);if(r.length===0)return;let i=r.indexOf(t.target),s=d(t),c=s===`ArrowDown`?r[(i+1)%r.length]:s===`ArrowUp`?r[(i-1+r.length)%r.length]:s===`Home`?r[0]:s===`End`?r[r.length-1]:null;c&&(t.preventDefault(),c.focus(),c.scrollIntoView({block:`nearest`}))}),{open:(e,t={})=>m(e,t.focusFirst===!0,t.returnFocus??null),close:f,closeAll:p}}function p(e){return e<3e4?1e3:e<12e4?3e3:e<6e5?8e3:15e3}var m=`Fetch selected`;function h(e){return`${e} ${e===1?`repository`:`repositories`}`}function g(e){return`Fetching ${h(e)}…`}function _(e){return e.fetched===0?`Could not fetch ${h(e.repositories)}`:e.fetched===e.repositories?`Fetched ${h(e.repositories)}`:`Fetched ${e.fetched} of ${h(e.repositories)}`}function v(e,t){let n=new Set,r=new Set;for(let i of e)for(let e of i.lineage){let i=t[e];i!==void 0&&(n.add(e),r.add(i))}return{ids:[...n],repositories:r.size}}function y(e,t){return v(t,e).repositories>0}export{g as a,t as c,_ as i,y as n,p as o,v as r,f as s,m as t};
@@ -0,0 +1 @@
1
+ function e(e,t,n){if(e.length===0)return null;let r=t===null?-1:e.indexOf(t);return r<0?n===1?e[0]:e[e.length-1]:e[Math.min(Math.max(r+n,0),e.length-1)]}function t(e,t){for(let n of e.querySelectorAll(`[data-keyboard-current]`))n!==t&&delete n.dataset.keyboardCurrent;t&&(t.dataset.keyboardCurrent=``)}function n(n){let{doc:r}=n,i=null,a=null,o=e=>n.link?e?.querySelector(n.link)??null:null,s=e=>n.link?o(e):e,c=e=>(n.link?e?.closest?.(n.link):e)?.closest?.(n.item)??null,l=e=>{i=e,t(r,e)},u=()=>i&&n.walk().includes(i)?i:null;r.addEventListener(`focusin`,e=>{let t=c(e.target);t&&(n.link||i!==null)&&l(t)}),n.link||r.addEventListener(`pointerdown`,e=>{let t=e.target?.closest?.(n.item);t&&(i===null?a=t:l(t))}),r.addEventListener(`focusout`,e=>{let t=e.target;t.dataset?.cursorFocusable!==void 0&&(t.removeAttribute(`tabindex`),delete t.dataset.cursorFocusable)});let d=c(r.activeElement);d&&l(d);let f=(e,t)=>{let r=n.background?.()??null;if(t!==`between`&&r){r.scrollTo({top:t===`first`?0:r.scrollHeight}),e.scrollIntoView({block:`nearest`});return}e.scrollIntoView({block:`nearest`}),n.leadIn?.(e)?.scrollIntoView({block:`nearest`})},p=e=>{let t=o(e);return t?.focus({preventScroll:!0}),t},m=e=>{if(n.link)return void p(e);e.hasAttribute(`tabindex`)||(e.tabIndex=-1,e.dataset.cursorFocusable=``),e.focus({preventScroll:!0})},h=()=>{let e=s(u());if(!e)return!1;let t=r.activeElement;return t===e||t===null||t===r.body||t===(n.background?.()??null)};return{move(t){let i=n.walk(),o=e(i,u()??(n.link?null:c(r.activeElement)??a),t);!o||!s(o)||(a=null,l(o),m(o),f(o,o===i[0]?`first`:o===i[i.length-1]?`last`:`between`))},current:u,refocus(){let e=u();e&&m(e)},holdsKeys:h,enterOpens(){return n.enterAllowed&&!n.enterAllowed()?!1:o(u())!==null&&h()},open(){p(u())?.click()},openInNewTab(){let e=p(u());e&&(n.openTab??(e=>r.defaultView?.open(e,`_blank`,`noopener`)))(e.href)}}}export{n as t};
@@ -0,0 +1 @@
1
+ function e(e,t){e.addEventListener(`pageshow`,e=>{e.persisted&&t()})}var t=[`checkbox`,`radio`,`button`,`submit`,`reset`].map(e=>`:not([type="${e}"])`).join(``);function n(e){if(!e||typeof e.closest!=`function`)return!1;let n=e;return n.isContentEditable?!0:n.closest(`input${t}, textarea, select, [contenteditable=""], [contenteditable="true"]`)!==null}var r=`prbNav`,i=`prb-workspace`,a=`prb-nav-session`,o=`prb-nav-head`,s=`prb-nav-handoff`,c=`prb-nav-places`,l=200,u=15e3,d=`unstored`;function f(e){if(!e||typeof e!=`object`)return null;let t=e[r];if(!t||typeof t!=`object`)return null;let{v:n,owner:i,session:a,idx:o,id:s,ui:c}=t;if(n!==1||i!==`prb-workspace`||typeof a!=`string`||a===``||typeof o!=`number`||!Number.isInteger(o)||o<0)return null;let l=c&&typeof c==`object`&&!Array.isArray(c)?c:null;return{v:n,owner:i,session:a,idx:o,...typeof s==`string`&&s!==``?{id:s}:{},ui:l}}function p(e){if(!e||typeof e!=`object`)return{};let{[r]:t,...n}=e;return n}function m(e,t){if(!e||typeof e!=`object`)return!1;let n=e;return n.owner===`prb-workspace`&&n.session===t}function h(e,t){try{return e?.getItem(t)??null}catch{return null}}function g(e,t,n){try{n===null?e?.removeItem(t):e?.setItem(t,n)}catch{}}function _(e){let{history:t,storage:n,location:_}=e,v=e.navigation??null,y=[],b=null,x=null,S=null,C=t=>{S!==null&&e.clearTimeout(S),S=t?t():null,e.capturePending(S!==null)},w=null,T=(()=>{if(!n)return d;let t=h(n,a);if(t)return t;let r=e.uuid();return g(n,a,r),h(n,a)===r?r:d})(),E=()=>`${_.pathname}${_.search}`,D=e=>`${E()}${e}`,O=()=>{try{v?.updateCurrentEntry({state:{owner:i,session:T}})}catch{}},k=()=>{for(let e of y)e()},A=(e,n)=>{n===void 0?t.replaceState(e,``):t.replaceState(e,``,n),O()},ee=()=>Number(h(n,o)??0)||0,j=()=>{try{let e=JSON.parse(h(n,c)??`{}`);return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch{return{}}},M=(e,t)=>{if(!e||!n)return;let r=j();delete r[e],r[e]=t;let i=Object.keys(r);for(let e of i.slice(0,Math.max(0,i.length-l)))delete r[e];g(n,c,JSON.stringify(r))},te=e=>{if(!e)return null;let t=e.id?j()[e.id]:void 0;return t&&typeof t==`object`&&!Array.isArray(t)?t:e.ui},ne=()=>{if(!b)return null;try{return b()}catch{return null}},N=()=>{let a=f(t.state);if(a&&a.session===T&&a.id){w=a.id,O();return}let c=a?.idx??0;if(!a){let t=h(n,s);g(n,s,null),c=0;try{let n=t?JSON.parse(t):null,r=e.referrer!==``&&new URL(e.referrer).origin===_.origin;n&&r&&n.session===T&&typeof n.idx==`number`&&typeof n.at==`number`&&e.now()-n.at<u&&(c=n.idx+1)}catch{c=0}g(n,o,String(c))}let l=a?.id??e.uuid();w=l;let d={v:1,owner:i,session:T,idx:c,id:l,ui:a?.ui??null};A({...p(t.state),[r]:d})},P=()=>f(t.state)??{v:1,owner:`prb-workspace`,session:T,idx:0,ui:null},F=()=>{S!==null&&C(null);let e=ne();if(!e||!w)return;let n=JSON.stringify(e),i=f(t.state);if(!i||i.id!==w){M(w,e);return}(n!==x||JSON.stringify(i.ui)!==n)&&(x=n,M(w,e),A({...p(t.state),[r]:{...i,ui:e}}))},I=e=>{if(v){let t=v.currentEntry?.index;if(typeof t!=`number`||t<0)return!1;let n=v.entries()[t+e];if(!n)return!1;try{return m(n.getState(),T)}catch{return!1}}let n=f(t.state);return!n||n.session!==T||t.length<2?!1:e===-1?n.idx>0:n.idx<ee()};N();try{t.scrollRestoration=`manual`}catch{}return{session:T,current(){return{route:p(t.state),ui:te(f(t.state))}},push(a,s){if(a!==``&&!a.startsWith(`#`))throw Error(`Workspace history pushes within this document only; "${a}" is not a fragment.`);if(D(a)===`${E()}${_.hash}`)return!1;F();let c=P().idx+1;g(n,o,String(c));let l=e.uuid(),u={v:1,owner:i,session:T,idx:c,id:l,ui:null};return w=l,t.pushState({...p(s),[r]:u},``,D(a)),x=null,O(),k(),!0},replace(e,t){if(e!==``&&!e.startsWith(`#`))throw Error(`Workspace history replaces within this document only; "${e}" is not a fragment.`);A({...p(t),[r]:P()},D(e))},setCapturer(e){b=e},captureNow:F,scheduleCapture(){C(()=>e.setTimeout(F,250))},leaving(){F(),g(n,s,JSON.stringify({session:T,idx:P().idx,at:e.now()}))},canGoBack:()=>I(-1),canGoForward:()=>I(1),back(){return I(-1)?(F(),t.back(),!0):!1},forward(){return I(1)?(F(),t.forward(),!0):!1},moved(){S!==null&&C(null);let e=ne();e&&M(w,e),x=null,w=f(t.state)?.id??null;let n=f(t.state);!n||!n.id||n.session!==T?N():O(),k()},onAvailability(e){y.push(e)}}}function v(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function y(e){let t=e?.userAgentData?.platform??e?.platform??``;return/mac|iphone|ipad/i.test(t)}function b(e,t,r){if(e.defaultPrevented||e.isComposing)return null;let i=t?e.metaKey:e.ctrlKey,a=t?e.ctrlKey:e.metaKey;if(!i||a||e.altKey||e.shiftKey)return null;let o=e.key===`[`||e.key!==`]`&&e.code===`BracketLeft`?`back`:e.key===`]`||e.code===`BracketRight`?`forward`:null;return!o||n(e.target)||r.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)?null:o}var x=[`data-id`,`data-finding-card`,`data-goto-section`,`data-view-nav`,`data-file`,`data-line`,`data-history`,`data-history-toggle`,`data-load-more`,`data-select`,`data-pin`,`data-focus-toggle`,`data-ask-toggle`,`data-rail-toggle`,`data-search`,`data-status-filter`,`data-author-filter`,`data-pr-filter`,`data-card`,`data-notification-id`,`data-guide-section`,`data-guide-detail`,`data-view`];function S(e){if(e.id)return{attrs:[[`id`,e.id]]};let t=x.filter(t=>e.hasAttribute(t)).map(t=>[t,e.getAttribute(t)??``]);return t.length>0?{attrs:t}:null}function C(e,t){if(!e||e===t||!t.contains(e))return null;let n=[],r=e;for(;r&&r!==t&&n.length<3;){let t=S(r);t?n.unshift(t):r===e&&n.unshift({tag:r.tagName.toLowerCase(),...r.classList[0]?{cls:r.classList[0]}:{}}),r=r.parentElement}return n.length>0?n:null}function w(e){if(!e||typeof e!=`object`)return!1;let{attrs:t,tag:n,cls:r}=e;return t===void 0?typeof n==`string`&&/^[a-z][a-z0-9-]*$/.test(n)&&(r===void 0||typeof r==`string`):Array.isArray(t)&&t.length>0&&t.every(e=>Array.isArray(e)&&e.length===2&&x.concat(`id`).includes(e[0])&&typeof e[1]==`string`)}function T(e,t){return t.attrs?t.attrs.every(([t,n])=>e.getAttribute(t)===n):e.tagName.toLowerCase()===t.tag&&(t.cls===void 0||e.classList.contains(t.cls))}function E(e,t){let n=t.attrs?`[${t.attrs[0][0]}]`:t.tag;for(let r of e.querySelectorAll(n))if(T(r,t))return r;return null}function D(e,t){if(!Array.isArray(t)||t.length===0||!t.every(w))return null;let n=null,r=e;for(let e of t){let t=E(r,e);if(!t)return n;n=t,r=t}return n}function O(e,t){let n=D(e,t);if(n){if(n.tabIndex<0&&!n.matches(`a[href], button, input, select, textarea, summary`)){n.querySelector(`a[href], button:not([disabled]), input, select, textarea, [tabindex="0"]`)?.focus({preventScroll:!0});return}n.focus({preventScroll:!0})}}function k(e,t){let n=e?.[t];return typeof n==`number`&&Number.isFinite(n)&&n>=0?n:null}function A(e,t){let n=e?.[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function ee(e){try{return e.sessionStorage}catch{return null}}function j(e,t){let n=e===`back`?`[`:`]`;return`${e===`back`?`Back`:`Forward`} (${t?`⌘${n}`:`Ctrl+${n}`})`}function M(e,t){if(e.target&&e.target!==`_self`||e.hasAttribute(`download`))return!1;let n;try{n=new URL(e.getAttribute(`href`)??``,t.href)}catch{return!1}return n.origin===t.origin?n.pathname!==t.pathname||n.search!==t.search:!1}function te(e,t){let n=e.querySelector(`[data-nav-announce]`);!n||!t||(n.textContent=``,e.defaultView?.setTimeout(()=>{n.textContent=t},50))}function ne(e={},t=window,n=document){let r=t.navigation??null,i=_({history:t.history,navigation:r,storage:ee(t),location:t.location,referrer:n.referrer,now:()=>Date.now(),uuid:()=>t.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,setTimeout:(e,n)=>t.setTimeout(e,n),clearTimeout:e=>t.clearTimeout(e),capturePending:e=>n.documentElement.toggleAttribute(`data-nav-capture-pending`,e)}),a=y(t.navigator),o=[...n.querySelectorAll(`[data-history]`)],s=()=>{for(let e of o)e.disabled=!((e.dataset.history===`forward`?`forward`:`back`)==`back`?i.canGoBack():i.canGoForward())};for(let e of o){let t=e.dataset.history===`forward`?`forward`:`back`;e.dataset.tip=j(t,a),e.addEventListener(`click`,()=>{t===`back`?i.back():i.forward()})}s(),i.onAvailability(s),r?.addEventListener?.(`currententrychange`,s),t.addEventListener(`keydown`,e=>{let t=b(e,a,n);t&&(e.preventDefault(),t===`back`?i.back():i.forward())}),t.addEventListener(`popstate`,()=>i.moved()),t.addEventListener(`pagehide`,()=>i.captureNow()),n.addEventListener(`visibilitychange`,()=>{n.visibilityState===`hidden`&&i.captureNow()}),n.addEventListener(`click`,e=>{let n=e.target?.closest?.(`a[href]`);!n||!v(e)||e.defaultPrevented||M(n,t.location)&&i.leaving()},!0),n.addEventListener(`pointerdown`,e=>{(e.button===3||e.button===4)&&i.captureNow()},!0);let c=()=>i.scheduleCapture();for(let e of[`scroll`,`click`,`input`,`toggle`,`focusin`])n.addEventListener(e,c,{capture:!0,passive:!0});if(!e.ownsRestore){let e=n.querySelector(`.prb-shell > main`);i.setCapturer(()=>({main:e?.scrollTop??0,focus:C(n.activeElement,n.body)}));let{ui:t}=i.current(),r=k(t,`main`);e&&r!==null&&(e.scrollTop=r),t&&O(n,t.focus)}return i}var N=[{id:`active`,name:`Active`,action:`Move to active`},{id:`waiting`,name:`Waiting`,action:`Mark waiting`},{id:`done`,name:`Done`,action:`Mark done`}];function P(e){if(typeof e!=`object`||!e)return;let{state:t,at:n}=e;if(!(t!==`waiting`&&t!==`done`||typeof n!=`number`||!Number.isFinite(n)))return{state:t,at:n}}function F(e){return N.find(t=>t.id===e).action}function I(e,t){if(!e)return;let n=L(e,t);return n===void 0?{text:N.find(t=>t.id===e.state).name,changed:!1}:{text:n,changed:!0}}var re=[`created`,`updated`,`merged`,`closed`,`reopened`];function ie(e){return ae({at:Number(e.activityAt),kind:e.activityKind,...e.activityMovedAt===void 0?{}:{movedAt:Number(e.activityMovedAt)}})}function ae(e){if(typeof e!=`object`||!e)return;let{at:t,kind:n,movedAt:r}=e;if(!(typeof t!=`number`||!Number.isFinite(t)||!re.includes(n)))return{at:t,kind:n,...typeof r==`number`&&Number.isFinite(r)?{movedAt:r}:{}}}function oe(e,t){return!e||e.state===`waiting`&&se(e,t)?`active`:e.state}function L(e,t){if(!e||!t)return;if(e.state===`waiting`)return se(e,t)?`Changed while waiting`:void 0;if(t.kind===`reopened`&&t.at>e.at)return`Reopened since done`;let n=t.movedAt??(t.kind===`updated`?t.at:void 0);return n!==void 0&&n>e.at?`Changed since done`:void 0}function se(e,t){return t!==void 0&&t.kind!==`created`&&t.at>e.at}function ce(e,t,n){return L(t,n)!==void 0||e!==(t?.state??`active`)}function le(e,t,n){return e===`done`&&t?.state===`done`&&L(t,n)!==void 0?`Keep done`:F(e)}var R=[`pinned`,`active`,`waiting`,`done`],ue=e=>N.find(t=>t.id===e).name,de={pinned:{title:`Pinned`,key:`p`},active:{title:ue(`active`),key:`a`},waiting:{title:ue(`waiting`),key:`w`},done:{title:ue(`done`),key:`d`}};function fe(e){return typeof e==`string`&&R.includes(e)}function pe(e,t,n,r){return e&&!he(r)?`pinned`:oe(t,n)}function me(e,t){let n=e=>R.indexOf(t(e));return[...e].sort((e,t)=>n(e)-n(t))}function he(e){return e===`queue`}function ge(e,t,n){return e?I(t,n)?.text:L(t,n)}var _e=[`all`,`queue`,`in-progress`,`complete`],ve=[`any`,`open`,`merged`,`closed`],ye=[`q`,`f`,`by`,`pr`,`page`];function be(e,t){let n=`${e} review${e===1?``:`s`}`;return e===t?n:`${n} · ${t} branch${t===1?``:`es`}`}function xe(e,t,n){let r={pinned:{shown:[],total:0},active:{shown:[],total:0},waiting:{shown:[],total:0},done:{shown:[],total:0}};for(let i of e){let e=t(i),a=r[e];a.total<n[e]&&a.shown.push(i),a.total+=1}return r}function Se(){return{pinned:15,active:15,waiting:15,done:15}}function Ce(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`f`)??``,r=t.get(`pr`)??``,i=new URLSearchParams;for(let[e,n]of t)!ye.includes(e)&&/^[a-z][a-z0-9_-]*$/i.test(e)&&n!==``&&i.append(e,n);let a=i.toString();return{query:t.get(`q`)??``,filter:_e.includes(n)?n:`all`,author:t.get(`by`)??``,pr:ve.includes(r)?r:`any`,...a===``?{}:{extra:a}}}function we(e){let t=new URLSearchParams;e.query!==``&&t.set(`q`,e.query),e.filter!==`all`&&t.set(`f`,e.filter),e.author!==``&&t.set(`by`,e.author),e.pr!==`any`&&t.set(`pr`,e.pr);for(let[n,r]of new URLSearchParams(e.extra??``))ye.includes(n)||t.append(n,r);let n=t.toString();return n===``?``:`#${n}`}function Te(e,t){return t===`all`||t===`queue`?!0:t===`in-progress`?e.status!==`complete`:e.status===t}function Ee(e,t){return t===`any`||e.prState===t}function De(e,t){return t===``||e===t}function Oe(e){return e===`complete`?`Mark reviewed`:`Mark not reviewed`}function ke(e){return e?`Unpin review`:`Pin review`}function Ae(e){return e?`Remove from review queue`:`Add to review queue`}function je(e,t){let n=t.query.trim().toLowerCase();return Me(e.filter(e=>(!n||e.searchText.includes(n))&&Te(e,t.filter)&&De(e.author,t.author)&&Ee(e,t.pr)),t.filter)}function Me(e,t){return he(t)?e.filter(e=>e.queue!==void 0).sort((e,t)=>(e.queue??0)-(t.queue??0)):e}function Ne(e){return e===0?`Queue`:`Queue (${e})`}function Pe(e){return e===`complete`?`Reviewed`:e===`in-progress`?`Not reviewed`:`New`}function Fe(e,t){if(e===0)return`Nothing selected`;let n=`${e} selected`;return t>0?`${n} · ${t} not shown`:n}function Ie(e){return e===0?`Select all`:`Select all ${e}`}function Le(e){return e===0?`Delete`:`Delete ${e} review${e===1?``:`s`}`}function Re(e){return`${Le(e)}?`}function ze(e,t,n){return e===``||t===``||t===e?`wait`:n?`hold`:`reload`}var Be=[{id:`global`,label:`Global`},{id:`reviews`,label:`Reviews list`},{id:`notifications`,label:`Notifications list`},{id:`findings`,label:`Issues and Questions`},{id:`sections`,label:`Review sections`},{id:`buddy`,label:`Buddy AI`},{id:`actions`,label:`Review actions`},{id:`workspace`,label:`Workspace and focus`}],z=(...e)=>({kind:`chord`,keys:e}),B=(e,t)=>({kind:`key`,key:e,...t?{shift:t}:{}}),Ve=e=>({kind:`key`,key:e,primary:!0}),He=R.map(e=>({id:`reviews.section.${e}`,label:`${de[e].title} section`,group:`reviews`,page:`reviews`,binding:z(`l`,de[e].key)})),V=[{id:`palette.open`,label:`Command palette`,group:`global`,page:`global`,binding:{kind:`combo`,key:`k`}},{id:`add.open`,label:`Add review`,group:`global`,page:`global`,binding:{kind:`combo`,key:`p`}},{id:`add.pullRequest`,label:`Review pull requests`,group:`global`,page:`global`,binding:z(`p`,`p`)},{id:`add.branch`,label:`Review branch`,group:`global`,page:`global`,binding:z(`p`,`b`)},{id:`navigate.reviews`,label:`Go to Reviews`,group:`global`,page:`global`,binding:z(`r`)},{id:`navigate.notifications`,label:`Go to Notifications`,group:`global`,page:`global`,binding:z(`n`)},{id:`help.shortcuts`,label:`Keyboard shortcuts`,group:`global`,page:`global`,binding:z(`?`)},{id:`reviews.search`,label:`Search reviews`,group:`reviews`,page:`reviews`,binding:z(`s`)},{id:`reviews.filters`,label:`Filters`,group:`reviews`,page:`reviews`,binding:z(`f`)},...He,{id:`reviews.next`,label:`Next review`,group:`reviews`,page:`reviews`,binding:B(`j`)},{id:`reviews.previous`,label:`Previous review`,group:`reviews`,page:`reviews`,binding:B(`k`)},{id:`reviews.open`,label:`Open review`,group:`reviews`,page:`reviews`,binding:B(`Enter`)},{id:`reviews.openInNewTab`,label:`Open review in new tab`,group:`reviews`,page:`reviews`,binding:B(`Enter`,!0)},{id:`reviews.menu`,label:`Open review menu`,group:`reviews`,page:`reviews`,binding:B(` `)},{id:`notifications.next`,label:`Next notification`,group:`notifications`,page:`notifications`,binding:B(`j`)},{id:`notifications.previous`,label:`Previous notification`,group:`notifications`,page:`notifications`,binding:B(`k`)},{id:`notifications.open`,label:`Open notification`,group:`notifications`,page:`notifications`,binding:B(`Enter`)},{id:`notifications.openInNewTab`,label:`Open notification in new tab`,group:`notifications`,page:`notifications`,binding:B(`Enter`,!0)},{id:`review.findings.next`,label:`Next card`,group:`findings`,page:`review`,binding:B(`j`)},{id:`review.findings.previous`,label:`Previous card`,group:`findings`,page:`review`,binding:B(`k`)},{id:`review.findings.askBuddy`,label:`Ask Buddy about the card`,group:`findings`,page:`review`,binding:B(` `)},{id:`review.findings.copy`,label:`Copy the card`,group:`findings`,page:`review`,binding:Ve(`c`)},{id:`review.findings.choose`,label:`Include in feedback, or leave out`,group:`findings`,page:`review`,binding:B(`Enter`)},{id:`review.feedback.prepare`,label:`Prepare feedback from the chosen cards`,group:`findings`,page:`review`,binding:Ve(`Enter`),hint:`[data-feedback-prepare]`,showHint:!0},{id:`review.feedback.copyDraft`,label:`Copy the feedback draft`,group:`findings`,page:`review`,binding:Ve(`c`),within:`[data-feedback-dialog]`,hint:`[data-feedback-copy]`,showHint:!0},{id:`review.section.review`,label:`Review overview`,group:`sections`,page:`review`,binding:z(`s`,`r`)},{id:`review.section.kiss`,label:`KISS`,group:`sections`,page:`review`,binding:z(`s`,`k`)},{id:`review.section.issues`,label:`Issues`,group:`sections`,page:`review`,binding:z(`s`,`i`)},{id:`review.section.diagrams`,label:`Diagrams`,group:`sections`,page:`review`,binding:z(`s`,`g`)},{id:`review.section.questions`,label:`Questions`,group:`sections`,page:`review`,binding:z(`s`,`q`)},{id:`review.section.files`,label:`Files`,group:`sections`,page:`review`,binding:z(`s`,`f`)},{id:`review.buddy.open`,label:`Open Buddy AI`,group:`buddy`,page:`review`,binding:z(`b`,`o`)},{id:`review.buddy.prompt`,label:`Choose a prompt`,group:`buddy`,page:`review`,binding:z(`b`,`p`)},{id:`review.mark.reviewed`,label:`Mark reviewed`,group:`actions`,page:`review`,binding:z(`m`,`r`),hint:`[data-review-menu] [data-mark-status]`},{id:`review.mark.waiting`,label:`Mark waiting`,group:`actions`,page:`review`,binding:z(`m`,`w`),hint:`[data-review-menu] [data-lifecycle-set="waiting"]`},{id:`review.mark.done`,label:`Mark done`,group:`actions`,page:`review`,binding:z(`m`,`d`),hint:`[data-review-menu] [data-lifecycle-set="done"]`},{id:`review.checkUpdates`,label:`Check for updates`,group:`actions`,page:`review`,binding:z(`a`,`c`),hint:`[data-review-menu] [data-fresh-check]`},{id:`review.update`,label:`Update review`,group:`actions`,page:`review`,binding:z(`a`,`u`)},{id:`review.queue.toggle`,label:`Queue`,group:`actions`,page:`review`,binding:z(`a`,`q`),hint:`[data-review-menu] [data-queue-action]`},{id:`review.feedback.toggle`,label:`Start or exit Prepare feedback`,group:`actions`,page:`review`,binding:z(`a`,`p`)},{id:`review.delete`,label:`Delete`,group:`actions`,page:`review`,binding:z(`a`,`d`),hint:`[data-review-menu] [data-delete]`},{id:`review.focus.toggle`,label:`Expand or collapse this section`,group:`workspace`,page:`review`,binding:B(`\\`),hint:`[data-focus-toggle]`},{id:`review.leave`,label:`Leave the Buddy AI field, Prepare feedback, or focus mode`,group:`workspace`,page:`review`,binding:B(`Escape`)}],Ue=[{page:`global`,keys:[`p`],label:`Add review`,combo:`p`},{page:`review`,keys:[`s`],label:`Sections`},{page:`review`,keys:[`m`],label:`Mark`},{page:`review`,keys:[`a`],label:`Actions`},{page:`review`,keys:[`b`],label:`Buddy AI`},{page:`reviews`,keys:[`l`],label:`List sections`}];function We(e,t=V){return t.filter(t=>t.page===`global`||t.page===e)}function Ge(e,t=V){let n={kind:`node`,key:``,label:`Commands`,children:[]},r=(t,r)=>{let i=n;for(let[n,a]of t.entries()){let o=i.children.find(e=>e.key===a);if(o?.kind===`leaf`)throw Error(`Chord ${t.slice(0,n+1).join(` `)} is a command and a namespace on ${e}`);if(o){i=o;continue}let s={kind:`node`,key:a,label:Ue.find(r=>(r.page===e||r.page===`global`)&&r.keys.join(` `)===t.slice(0,n+1).join(` `))?.label??r??a.toUpperCase(),children:[]};i.children.push(s),i=s}return i};for(let n of We(e,t)){if(n.binding.kind!==`chord`)continue;let t=n.binding.keys,i=r(t.slice(0,-1)),a=t[t.length-1];if(i.children.some(e=>e.key===a))throw Error(`Chord ${t.join(` `)} is bound twice on ${e}`);i.children.push({kind:`leaf`,key:a,command:n})}return n}function Ke(e){return We(e).filter(e=>e.binding.kind===`key`)}var qe=new Set([`Shift`,`Control`,`Alt`,`Meta`,`CapsLock`,`Fn`,`AltGraph`,`OS`]);function Je(e){return qe.has(e.key)}function Ye(e){let t=e.key;if(t.length===1){if(/^[a-z]$/i.test(t))return t.toLowerCase();let n=/^Key([A-Z])$/.exec(e.code??``);return n&&/\p{L}/u.test(t)?n[1].toLowerCase():t}return null}var Xe=new Set(V.flatMap(e=>e.binding.kind===`combo`?[e.binding.key]:[]));function Ze(e,t){let n=t?e.metaKey:e.ctrlKey,r=t?e.ctrlKey:e.metaKey;if(!n||r||e.altKey||e.shiftKey||e.isComposing)return null;let i=Ye(e);return i!==null&&Xe.has(i)?i:null}function Qe(e){return V.find(t=>t.binding.kind===`combo`&&t.binding.key===e)}function $e(e,t,n=!1){if(e.kind!==`key`||t.altKey||t.isComposing)return!1;let r=n?t.metaKey:t.ctrlKey;return(n?t.ctrlKey:t.metaKey)||r!==(e.primary===!0)||t.shiftKey!==(e.shift===!0)?!1:e.key===`\\`?t.key===`\\`||t.code===`Backslash`:e.key.length===1?Ye(t)===e.key:t.key===e.key}function et(e){let t=null,n=[];return{get at(){return t},get path(){return n},start(r=[]){let i=e,a=[];for(let e of r){let t=i.children.find(t=>t.key===e);if(t?.kind!==`node`)break;i=t,a.push(e)}t=i,n=a},press(e){let r=t?.children.find(t=>t.key===e);return r?r.kind===`leaf`?(t=null,n=[],{kind:`run`,command:r.command}):(t=r,n=[...n,e],{kind:`descend`,node:r}):(t=null,n=[],{kind:`cancel`})},reset(){t=null,n=[]}}}var tt={Escape:`Esc`,Enter:`Enter`,"\\":`\\`," ":`Space`};function H(e){return tt[e]??(e.length===1?e.toUpperCase():e)}function U(e,t=`k`){let n=t.toUpperCase();return e?`⌘${n}`:`Ctrl+${n}`}function W(e,t){let n=Ue.find(t=>t.combo!==void 0&&t.keys.every((t,n)=>e[n]===t));return n?[U(t,n.combo),...e.slice(n.keys.length).map(H)]:[U(t),...e.map(H)]}function G(e,t){return e.kind===`combo`?t?`⌘${H(e.key)}`:`Ctrl+${H(e.key)}`:e.kind===`chord`?W(e.keys,t).join(` `):e.primary?t?`⌘${H(e.key)}`:`Ctrl+${H(e.key)}`:e.shift?`Shift+${H(e.key)}`:H(e.key)}function nt(e,t){return e.kind===`chord`?W(e.keys,t):[G(e,t)]}function rt(e,t){if(e.kind===`chord`)return null;if(e.kind===`combo`)return`${t?`Meta`:`Control`}+${e.key.toUpperCase()}`;let n=e.key===` `?`Space`:e.key.length===1?e.key.toUpperCase():e.key;return e.primary?`${t?`Meta`:`Control`}+${n}`:e.shift?`Shift+${n}`:n}function it(e){return Be.map(t=>({group:t.id,label:t.label,rows:V.filter(e=>e.group===t.id).map(t=>({id:t.id,keys:nt(t.binding,e),label:t.label}))})).filter(e=>e.rows.length>0)}function K(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function q(e,t){return K(e,`kbd`,`prb-kbd`,t)}function at(e,t,n){let r=K(e,`dialog`,`prb-palette`);r.setAttribute(`data-command-palette`,``),r.setAttribute(`aria-labelledby`,`prb-palette-title`);let i=K(e,`div`,`prb-palette-panel`);i.tabIndex=-1,r.append(i),e.body.append(r),r.addEventListener(`click`,e=>{if(e.stopPropagation(),e.target===r)return n();let i=e.target?.closest?.(`[data-palette-key]`);i?.dataset.paletteKey!==void 0&&i.getAttribute(`aria-disabled`)!==`true`&&t(i.dataset.paletteKey)}),r.addEventListener(`cancel`,e=>{e.preventDefault(),n()});let a=(t,n)=>{let r=K(e,`div`,`prb-palette-head`),i=K(e,`span`,`prb-palette-trail`);for(let[n,r]of t.entries())n>0&&i.append(K(e,`span`,`prb-palette-sep`,`›`)),i.append(q(e,r));let a=K(e,`h2`,`prb-palette-title`,n);return a.id=`prb-palette-title`,r.append(i,a),r};return{dialog:r,show:t=>{i.replaceChildren(a(t.trail,t.title));let n=K(e,`div`,`prb-palette-list`);n.setAttribute(`role`,`group`),n.setAttribute(`aria-labelledby`,`prb-palette-title`);let o=null;for(let r of t.rows){t.groupLabels&&r.group!==o&&(n.append(K(e,`p`,`prb-palette-group`,t.groupLabels[r.group]??r.group)),o=r.group);let i=K(e,`button`,`prb-palette-row`);i.type=`button`,i.dataset.paletteKey=r.key,r.available||i.setAttribute(`aria-disabled`,`true`),r.namespace&&i.setAttribute(`aria-haspopup`,`true`),i.append(q(e,r.keyLabel),K(e,`span`,`prb-palette-label`,r.namespace?`${r.label}…`:r.label)),r.state&&i.append(K(e,`span`,`prb-palette-state`,r.state)),n.append(i)}if(t.rows.length===0&&n.append(K(e,`p`,`prb-palette-empty`,`Nothing here on this page.`)),i.append(n),t.footer.length>0){let n=K(e,`div`,`prb-palette-footer`);n.append(K(e,`p`,`prb-palette-group`,`Keys on this page`));let r=K(e,`ul`,`prb-palette-keys`);for(let n of t.footer){let t=K(e,`li`);t.append(q(e,n.keys),K(e,`span`,void 0,n.label)),r.append(t)}n.append(r),i.append(n)}r.open||r.showModal(),i.focus()},showPanel:(t,n,o)=>{i.replaceChildren(a(t,n.title));let s=K(e,`div`,`prb-palette-body`);i.append(s),r.open||r.showModal(),i.dataset.mode=n.title;let c=n.mount(s,o);return()=>{delete i.dataset.mode,c?.()}},close:()=>{r.open&&r.close()},isOpen:()=>r.open}}function ot(e,t,n){let r=[...e.querySelectorAll(`[data-palette-key]`)];if(r.length===0)return!1;let i=r.indexOf(n),a=t===`ArrowDown`?r[i<0?0:(i+1)%r.length]:t===`ArrowUp`?r[i<0?r.length-1:(i-1+r.length)%r.length]:t===`Home`?r[0]:t===`End`?r[r.length-1]:null;return a?(a.focus(),!0):!1}function st(e,t){let n=K(e,`div`,`prb-shortcuts-table`);for(let r of t){let t=K(e,`section`,`prb-shortcuts-group`);t.append(K(e,`h3`,`prb-shortcuts-heading`,r.label));let i=K(e,`dl`,`prb-shortcuts-list`);for(let t of r.rows){let n=K(e,`dt`,`prb-shortcuts-keys`);n.dataset.commandId=t.id;for(let r of t.keys)n.append(q(e,r));i.append(n,K(e,`dd`,`prb-shortcuts-label`,t.label))}t.append(i),n.append(t)}return n}function ct(e,t,n,r){let i=K(e,`dialog`,`prb-dialog prb-shortcuts`);i.setAttribute(`data-shortcuts-dialog`,``),i.setAttribute(`aria-labelledby`,`prb-shortcuts-title`);let a=K(e,`div`,`prb-shortcuts-head`),o=K(e,`h2`,void 0,`Keyboard shortcuts`);o.id=`prb-shortcuts-title`;let s=K(e,`button`,`prb-shortcuts-close`,`Close`);s.type=`button`,s.setAttribute(`data-shortcuts-close`,``),a.append(o,s),i.append(a,K(e,`p`,`prb-shortcuts-hint`,n),st(e,t)),e.body.append(i);let c=null;return s.addEventListener(`click`,()=>i.close()),i.addEventListener(`click`,e=>{e.target===i&&i.close()}),i.addEventListener(`close`,()=>{c?.isConnected&&c.focus(),c=null,r?.()}),{dialog:i,open:()=>{if(i.open)return;let t=e.activeElement;c=t instanceof HTMLElement&&t!==e.body?t:null,i.showModal(),s.focus()},isOpen:()=>i.open}}var lt=/https?:\/\/[^\s<>()"'`]+/gi,ut=/^https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)(?:[/?#]|$)/i,dt=/^https?:\/\/([^/]+)\/((?:[^/?#]+\/)+?)(?:-\/)?merge_requests\/(\d+)(?:[/?#]|$)/i,ft=/^https?:\/\/(?:www\.)?bitbucket\.org\/([^/?#]+)\/([^/?#]+)\/pull-requests\/(\d+)(?:[/?#]|$)/i;function pt(e){let t=e.replace(/[.,;:!?)\]]+$/,``),n=ut.exec(t);if(n){let[,e,t,r]=n,i=t.replace(/\.git$/i,``),a=Number(r);return{kind:`github`,owner:e,repo:i,number:a,url:`https://github.com/${e}/${i}/pull/${a}`,key:`${e}/${i}#${a}`.toLowerCase()}}let r=ft.exec(t);if(r){let[,e,n,i]=r;return{kind:`unsupported`,provider:`Bitbucket`,label:`${e}/${n} #${i}`,url:t,key:`bitbucket:${e}/${n}#${i}`.toLowerCase()}}let i=dt.exec(t);if(i){let[,e,n,r]=i,a=n.replace(/\/$/,``);return{kind:`unsupported`,provider:`GitLab`,label:`${a} !${r}`,url:t,key:`gitlab:${e}/${a}!${r}`.toLowerCase()}}return null}function mt(e){let t=[],n=new Set;for(let r of e.matchAll(lt)){let e=pt(r[0]);!e||n.has(e.key)||(n.add(e.key),t.push(e))}return t}function ht(e){return`${e} isn't supported yet`}function gt(e){return e.model?`Keeps its original agent and model: ${e.agent}, ${e.model}`:`Keeps its original agent: ${e.agent}`}var _t={waiting:`Waiting`,reviewing:`Reviewing`,"already-reviewed":`Already reviewed`,ready:`Ready`,failed:`Failed`},vt=250,yt=1500;async function J(e,t,n){try{let r=await e.fetch(t,n===void 0?{}:{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)}),i=await r.json().catch(()=>({}));return r.ok?{ok:!0,value:i}:{ok:!1,status:r.status,error:typeof i.error==`string`?i.error:`Something went wrong. Try again.`}}catch{return{ok:!1,status:0,error:`The workspace server did not answer. Check it is still running.`}}}function bt(e,t,n){let r=null,i=!1,a=()=>{r=e.setTimeout(async()=>{let r=await J(e,`/add-review/batches/${t}`);i||(r.ok?(n.rows(r.value.rows,r.value.finished),r.value.finished||a()):r.status===404?n.lost(r.error):a())},yt)};return a(),()=>{i=!0,r!==null&&e.clearTimeout(r)}}function Y(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function X(e,t,n){let r=Y(e,`option`,void 0,t);return r.value=n,r}function Z(e,t,n){let r=Y(e,`a`,`prb-addreview-link`,n);return r.href=`/open?id=${encodeURIComponent(t)}`,r}function xt(e,t,n){let r=Y(e,`details`,`prb-addreview-options`);r.append(Y(e,`summary`,void 0,`Review options`));let i=Y(e,`div`,`prb-addreview-grid`);r.append(i);let a=(t,n)=>{let r=Y(e,`label`,`prb-addreview-key`,t),a=`prb-addreview-${t.toLowerCase()}`;n.id=a,r.htmlFor=a,i.append(r,n)},o=Y(e,`select`,`prb-addreview-control`);o.setAttribute(`data-addreview-agent`,``);let s=Y(e,`input`,`prb-addreview-control`);s.type=`text`,s.placeholder=`Default`,s.spellcheck=!1,s.autocomplete=`off`,s.setAttribute(`data-addreview-model`,``);let c=Y(e,`input`,`prb-addreview-control`);c.type=`text`,c.placeholder=`Auto`,c.spellcheck=!1,c.autocomplete=`off`,c.setAttribute(`data-addreview-base`,``),a(`Agent`,o),a(`Model`,s),n&&a(`Base`,c);let l=Y(e,`p`,`prb-addreview-error`);l.hidden=!0,r.append(l);let u=null,d=!1;return{element:r,base:c,loaded:J(t,`/add-review/options`).then(t=>{if(d=!0,!t.ok)return l.textContent=t.error,l.hidden=!1,r.open=!0,null;let{agents:n,agent:i}=t.value,a=n.filter(e=>e.installed);i.kind!==`resolved`&&o.append(X(e,`Choose an agent`,``));for(let t of a)o.append(X(e,t.displayName,t.id));return i.kind===`resolved`?(u=i.id,a.some(e=>e.id===i.id)||o.append(X(e,i.displayName,i.id)),o.value=i.id):(o.value=``,r.open=!0,i.kind===`refused`&&(l.textContent=i.error,l.hidden=!1)),t.value}),complete:()=>d&&o.value!==``,values:()=>({...o.value&&o.value!==u?{agent:o.value}:{},...s.value.trim()?{model:s.value.trim()}:{},...n&&c.value.trim()?{base:c.value.trim()}:{}}),setBasePlaceholder:e=>{c.placeholder=e?`Auto (${e})`:`Auto`}}}function St(e){let t=Y(e,`button`,`prb-addreview-start`);return t.type=`button`,t.setAttribute(`data-addreview-start`,``),t}function Ct(e){return{title:`Add review`,escape:`close`,mount(t){let n=e.defaultView,r=Y(e,`div`,`prb-addreview`);r.setAttribute(`data-addreview`,`pull-requests`);let i=Y(e,`label`,`prb-addreview-label`,`Paste PR links`),a=Y(e,`textarea`,`prb-palette-input prb-addreview-paste`);a.id=`prb-addreview-paste`,i.htmlFor=a.id,a.rows=4,a.spellcheck=!1,a.autocomplete=`off`,a.placeholder=`https://github.com/owner/repo/pull/123`;let o=Y(e,`p`,`prb-palette-summary`);o.setAttribute(`aria-live`,`polite`);let s=Y(e,`ul`,`prb-addreview-rows`),c=xt(e,n,!1),l=Y(e,`p`,`prb-addreview-error`);l.hidden=!0;let u=Y(e,`p`,`prb-palette-summary`,`You can close this: the reviews carry on and appear in your list.`);u.hidden=!0;let d=Y(e,`p`,`prb-addreview-error`);d.setAttribute(`data-addreview-limit`,``),d.hidden=!0;let f=Y(e,`div`,`prb-addreview-footer`),p=St(e);f.append(p),r.append(Y(e,`p`,`prb-addreview-mode`,`Pull request`),i,a,o,d,s,u,c.element,l,f),t.append(r);let m=[],h=new Map,g=!1,_=0,v=null,y=null,b=!1,x=null,S=!1,C=()=>m.filter(e=>(e.ok||e.needsFolder)&&!!h.get(e.key)),w=0,T=()=>{let e=C().length;p.textContent=e>1?`Review ${e} PRs`:`Review PR`,p.disabled=x!==null||b||g||w>0||e===0||!c.complete(),p.hidden=x!==null},E=()=>{x===null&&(d.hidden=w===0,d.textContent=`At most 20 pull requests can be reviewed at once. Remove ${w} to continue.`)},D=(t,n)=>Y(e,`span`,`prb-addreview-status prb-addreview-${n}`,t),O=()=>{s.replaceChildren(...m.map(t=>{let n=Y(e,`li`,`prb-addreview-row`);n.dataset.rowKey=t.key;let r=t.ok||!!h.get(t.key);n.dataset.state=r?`ok`:`problem`;let i=Y(e,`div`,`prb-addreview-row-head`);if(i.append(Y(e,`span`,`prb-addreview-mark`,r?`✓`:`!`),Y(e,`span`,`prb-addreview-row-label`,t.label)),n.append(i),t.reviewed?.kept){let r=D(``,`muted`);r.append(Z(e,t.reviewed.reviewId,`Resumes where it stopped`)),n.append(r,D(gt(t.reviewed.kept),`muted`))}else if(t.reviewed){let r=D(``,`muted`);r.append(Z(e,t.reviewed.reviewId,`Already reviewed`)),n.append(r)}else t.ok?n.append(D(`Ready`,`muted`)):t.reason&&n.append(D(t.reason,`problem`));if(t.folders.length>1){let r=Y(e,`select`,`prb-addreview-control prb-addreview-folder`);r.setAttribute(`aria-label`,`Local folder for ${t.label}`);for(let n of t.folders)r.append(X(e,n.branch?`${n.display} (${n.branch})`:n.display,n.path));r.value=h.get(t.key)??t.folder??``,r.addEventListener(`change`,()=>h.set(t.key,r.value)),n.append(r)}else if(t.folders.length===1)n.append(Y(e,`span`,`prb-addreview-path`,t.folders[0].display));else if(t.needsFolder){let r=Y(e,`input`,`prb-addreview-control prb-addreview-folder`);r.type=`text`,r.placeholder=`Local folder for this repository, e.g. ~/code/repo`,r.setAttribute(`aria-label`,`Local folder for ${t.label}`),r.spellcheck=!1,r.autocomplete=`off`,r.value=h.get(t.key)??``,r.addEventListener(`input`,()=>{r.value.trim()?h.set(t.key,r.value.trim()):h.delete(t.key),n.dataset.state=r.value.trim()?`ok`:`problem`,T()}),n.append(r)}return n}))},k=t=>{s.replaceChildren(...t.map(t=>{let n=Y(e,`li`,`prb-addreview-row`);n.dataset.rowKey=t.key,n.dataset.status=t.status,n.dataset.state=t.status===`failed`?`problem`:`ok`;let r=Y(e,`div`,`prb-addreview-row-head`);return r.append(Y(e,`span`,`prb-addreview-mark`,t.status===`failed`?`!`:`✓`)),r.append(t.reviewId?Z(e,t.reviewId,t.label):Y(e,`span`,`prb-addreview-row-label`,t.label)),n.append(r),n.append(D(t.reason?`${_t[t.status]}: ${t.reason}`:_t[t.status],t.status===`failed`?`problem`:`muted`)),t.kept&&n.append(D(gt(t.kept),`muted`)),n})),o.textContent=A(t)},A=e=>{let t=[`reviewing`,`waiting`,`ready`,`already-reviewed`,`failed`].map(t=>[t,e.filter(e=>e.status===t).length]).filter(([,e])=>e>0);return[`${e.length} submitted`,...t.map(([e,t])=>`${t} ${_t[e].toLowerCase()}`)].join(` · `)},ee=()=>{let e=mt(a.value),t=e.filter(e=>e.kind===`github`).length;o.textContent=e.length===0?a.value.trim()?`No pull request links found.`:``:t===1?`1 pull request recognised`:`${t} pull requests recognised`,m=e.map(e=>e.kind===`github`?m.find(t=>t.key===e.key)??{key:e.key,label:`${e.owner}/${e.repo} #${e.number}`,url:e.url,ok:!1,folders:[]}:{key:e.key,label:`${e.provider} ${e.provider===`GitLab`?`merge request`:`pull request`}`,url:e.url,ok:!1,reason:ht(e.provider),folders:[]}),g=e.some(e=>e.kind===`github`),w=Math.max(0,t-20);let r=++_;O(),E(),T(),v!==null&&n.clearTimeout(v),g&&(v=n.setTimeout(async()=>{v=null;let e=await J(n,`/add-review/pull-requests/preview`,{text:a.value});if(!(S||r!==_)){if(g=!1,!e.ok)l.textContent=e.error,l.hidden=!1;else{l.hidden=!0,m=e.value.rows;for(let e of m)e.folder&&!h.has(e.key)&&h.set(e.key,e.folder)}O(),T()}},vt))},j=e=>{y=bt(n,e,{rows:e=>{x=e,k(e)},lost:e=>{l.textContent=e,l.hidden=!1,x&&k(x.map(e=>e.status===`waiting`?{...e,status:`failed`,reason:`Not started`}:e))}})},M=async()=>{if(T(),p.disabled)return;b=!0,T();let e=C().map(e=>({url:e.url,folder:h.get(e.key)})),t=await J(n,`/add-review/pull-requests`,{items:e,...c.values()});if(b=!1,!S){if(!t.ok){l.textContent=t.error,l.hidden=!1,T();return}l.hidden=!0,x=t.value.rows,a.readOnly=!0,c.element.open=!1,k(x),u.hidden=!1,T(),j(t.value.batchId)}};return a.addEventListener(`input`,ee),p.addEventListener(`click`,()=>void M()),r.addEventListener(`change`,()=>T()),r.addEventListener(`keydown`,e=>{if(e.key!==`Enter`||e.shiftKey||e.isComposing)return;let t=e.target;t.tagName!==`SELECT`&&t.tagName!==`BUTTON`&&t.tagName!==`A`&&t.tagName!==`SUMMARY`&&(e.preventDefault(),M())}),c.loaded.then(()=>T()),T(),a.focus(),()=>{S=!0,v!==null&&n.clearTimeout(v),y?.()}}}}function wt(e){return{title:`Add review`,escape:`close`,mount(t,n){let r=e.defaultView,i=Y(e,`div`,`prb-addreview`);i.setAttribute(`data-addreview`,`branch`);let a=Y(e,`label`,`prb-addreview-label`,`Working folder`),o=Y(e,`div`,`prb-addreview-pathrow`),s=Y(e,`input`,`prb-palette-input`);s.id=`prb-addreview-folder`,a.htmlFor=s.id,s.type=`text`,s.spellcheck=!1,s.autocomplete=`off`,s.placeholder=`~/code/project`;let c=Y(e,`button`,`prb-addreview-browse`,`Browse…`);c.type=`button`,c.hidden=!0,o.append(s,c);let l=Y(e,`div`,`prb-addreview-detected`);l.setAttribute(`aria-live`,`polite`);let u=Y(e,`p`,`prb-palette-group`,`Recent`),d=Y(e,`div`,`prb-palette-results prb-addreview-recent`);d.setAttribute(`role`,`group`),d.setAttribute(`aria-label`,`Recent folders`),u.hidden=!0;let f=xt(e,r,!0),p=Y(e,`p`,`prb-addreview-error`);p.hidden=!0;let m=Y(e,`div`,`prb-addreview-footer`),h=Y(e,`p`,`prb-palette-summary`,`Waiting to start: two reviews are already running, and this one starts when one of them finishes. You can close this.`);h.hidden=!0,h.setAttribute(`data-addreview-waiting`,``);let g=St(e);g.textContent=`Review branch`,m.append(g),i.append(Y(e,`p`,`prb-addreview-mode`,`Branch`),a,o,l,u,d,f.element,p,h,m),t.append(i);let _=null,v=null,y=!1,b=!1,x=null,S=!1,C=(e,t)=>`${e}\n${t.trim()}`,w=()=>C(s.value,f.base.value),T=()=>{g.disabled=y||b||!_?.result.ok||_.key!==w()||!f.complete()},E=t=>{if(l.replaceChildren(),!t)return;if(!t.ok){l.append(Y(e,`p`,`prb-addreview-error`,t.error??`This folder cannot be reviewed.`));return}let n=Y(e,`dl`,`prb-addreview-grid prb-addreview-facts`),r=(t,r)=>{let i=Y(e,`dd`);i.append(r),n.append(Y(e,`dt`,`prb-addreview-key`,t),i)};if(r(`Repository`,t.repo??``),r(`Branch`,t.branch??``),r(`Base`,t.base??`Not found`),t.reviewed?.kept){let n=Z(e,t.reviewed.reviewId,`Resumes where it stopped`),i=Y(e,`span`,`prb-addreview-kept`,gt(t.reviewed.kept)),a=Y(e,`span`);a.append(n,Y(e,`br`),i),r(`Review`,a)}else t.reviewed&&r(`Review`,Z(e,t.reviewed.reviewId,t.reviewed.inProgress?`Being reviewed now`:`Already reviewed`));l.append(n),f.setBasePlaceholder(t.base??null)},D=()=>{let e=s.value,t=f.base.value.trim(),n=C(e,t);return _?.key===n?Promise.resolve(_.result):e.trim()?J(r,`/add-review/folder/inspect`,{path:e,...t?{base:t}:{}}).then(e=>{let t=e.ok?e.value:{ok:!1,error:e.error};return!S&&w()===n&&(_={key:n,result:t},E(t),T()),t}):(_=null,E(null),T(),Promise.resolve({ok:!1}))},O=e=>{s.value=e,v!==null&&r.clearTimeout(v),T(),D(),s.focus()},k=async()=>{if(y||b)return;y=!0;let e=w(),t=s.value,i=f.values();T(),v!==null&&(r.clearTimeout(v),v=null);let a=await D();if(S)return;if(!a.ok||!f.complete()||w()!==e)return y=!1,T();let o=await J(r,`/add-review/branch`,{path:t,...i});if(y=!1,!S){if(!o.ok){p.textContent=o.error,p.hidden=!1,T();return}if(o.value.outcome===`waiting`&&o.value.batchId){b=!0,h.hidden=!1,g.hidden=!0,T();let e=e=>{x?.(),x=null,b=!1,h.hidden=!0,g.hidden=!1,p.textContent=e,p.hidden=!1,T()};x=bt(r,o.value.batchId,{rows:([t])=>{if(!(!t||t.status===`waiting`)){if(t.status===`failed`)return e(t.reason??`The review could not be started.`);n()}},lost:e});return}n()}},A=()=>{T(),v!==null&&r.clearTimeout(v),v=r.setTimeout(()=>{v=null,D()},vt)};return s.addEventListener(`input`,A),f.base.addEventListener(`input`,A),c.addEventListener(`click`,async()=>{let e=await J(r,`/add-review/folder/choose`,{});if(!S){if(!e.ok){p.textContent=e.error,p.hidden=!1;return}e.value.path?O(e.value.path):s.focus()}}),d.addEventListener(`click`,e=>{let t=e.target.closest(`[data-folder-path]`);t?.dataset.folderPath&&O(t.dataset.folderDisplay??t.dataset.folderPath)}),g.addEventListener(`click`,()=>void k()),i.addEventListener(`keydown`,e=>{if(e.isComposing)return;let t=[...d.querySelectorAll(`[data-folder-path]`)],n=t.indexOf(e.target);if(e.key===`ArrowDown`||e.key===`ArrowUp`){let r=e.key===`ArrowDown`?e.target===s?t[0]:n>=0?t[n+1]:null:n===0?s:n>0?t[n-1]:null;if(!r)return;e.preventDefault(),r.focus();return}if(e.key!==`Enter`||e.shiftKey||n>=0)return;let r=e.target;r.tagName!==`SELECT`&&r.tagName!==`BUTTON`&&r.tagName!==`A`&&r.tagName!==`SUMMARY`&&(e.preventDefault(),k())}),i.addEventListener(`change`,()=>T()),f.loaded.then(e=>{S||(c.hidden=!e?.canChooseFolder,T())}),J(r,`/add-review/folders`).then(t=>{S||!t.ok||(d.replaceChildren(...t.value.folders.map(t=>{let n=Y(e,`button`,`prb-palette-result`);return n.type=`button`,n.dataset.folderPath=t.path,n.dataset.folderDisplay=t.display,n.append(Y(e,`span`,`prb-palette-result-title`,t.branch?`${t.repo} · ${t.branch}`:t.repo),Y(e,`span`,`prb-palette-result-where`,t.display)),n})),u.hidden=t.value.folders.length===0)}),T(),s.focus(),()=>{S=!0,x?.(),v!==null&&r.clearTimeout(v)}}}}function Tt(e){return e.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)!==null}function Et(e){for(let t of e.children)return t.kind===`leaf`?t.command.group:Et(t);return`global`}function Dt(e,t,r={}){let i=r.win??window,a=r.doc??document,o=r.isMac??y(i.navigator),s=et(Ge(e)),c=null,l=e=>{let t=a.querySelector(`a[href="${e}"]:not([target])`);t?t.click():i.location.assign(e)},u=ct(a,it(o),`${U(o)} opens the command palette and ${U(o,`p`)} adds a review, from anywhere in the workspace. Single keys never act while you are typing.`,()=>r.onSettle?.()),d={"palette.open":{run:()=>w()},"add.open":{run:()=>w([`p`])},"add.pullRequest":{panel:Ct(a)},"add.branch":{panel:wt(a)},"navigate.reviews":{run:()=>l(`/`)},"navigate.notifications":{run:()=>l(`/notifications`)},"help.shortcuts":{run:()=>u.open()}},f=e=>d[e.id]??t[e.id],p=(e,t)=>{let n=f(e);return!!n&&(n.available?.(t)??!0)},m=null,h=`back`,g=[],_=()=>{m?.(),m=null},v=(e=`dismissed`)=>{_(),s.reset(),b.close();let t=c;c=null,t?.isConnected&&t.focus(),e===`dismissed`&&r.onSettle?.()},b=at(a,e=>T(e),v),x=Ke(e).map(e=>({keys:G(e.binding,o),label:e.label})),S=Object.fromEntries(Be.map(e=>[e.id,e.label])),C=()=>{let e=s.at;if(!e)return;let t=e.children.map(e=>e.kind===`leaf`?{key:e.key,keyLabel:e.key.toUpperCase(),label:f(e.command)?.label?.()??e.command.label,namespace:!1,available:p(e.command),group:e.command.group,state:f(e.command)?.state?.()??null}:{key:e.key,keyLabel:e.key.toUpperCase(),label:e.label,namespace:!0,available:!0,group:Et(e)}),n=s.path.length===0?Be.flatMap(e=>t.filter(t=>t.group===e.id)):t;b.show({trail:W(s.path,o),title:e.label,rows:n,groupLabels:s.path.length===0?S:null,footer:x})};function w(e=[]){if(b.isOpen())return v();r.onOpen?.();let t=a.activeElement;c=t instanceof HTMLElement&&t!==a.body?t:null,s.start(e),C()}function T(e){let t=s.press(e);if(t.kind===`descend`)return C();let n=t.kind===`run`&&p(t.command)?f(t.command):null;if(n?.panel&&t.kind===`run`)return E(t.command,n.panel);v(n?`running`:`dismissed`),n?.run?.()}function E(e,t){g=e.binding.kind===`chord`?e.binding.keys.slice(0,-1):[],h=t.escape??`back`;let n=e.binding.kind===`chord`?W(e.binding.keys,o):[U(o)];m=b.showPanel(n,t,()=>v(`running`))}function D(){_(),s.start();for(let e of g)s.press(e);C()}let O=Ke(e);return i.addEventListener(`keydown`,e=>{if(b.isOpen()){if(Je(e))return;let t=()=>{e.preventDefault(),e.stopPropagation()};if(m)return e.key===`Escape`&&!e.isComposing?(t(),h===`close`?v():D()):Ze(e,o)?(t(),v()):void 0;if(e.key===`Escape`||Ze(e,o))return t(),v();if([`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){t(),ot(b.dialog,e.key,a.activeElement);return}if(e.target?.closest?.(`[data-palette-key]`)&&(e.key===`Enter`||e.key===` `)||e.key===`Tab`||e.metaKey||e.ctrlKey||e.altKey)return;t(),T(Ye(e)??``);return}if(e.defaultPrevented||e.isComposing)return;let t=Ze(e,o),r=t?Qe(t):void 0;if(r){if(a.querySelector(`dialog[open]`))return;e.preventDefault(),e.stopPropagation(),f(r)?.run?.(e);return}for(let t of O){if(!$e(t.binding,e,o))continue;let r=t.within;if(r){if(!a.querySelector(r)?.matches(`[open]`))continue}else if(t.binding.kind===`key`&&t.binding.key!==`Escape`&&(n(e.target)||Tt(a)))continue;if(p(t,e)){e.preventDefault(),f(t).run?.(e);return}}},!0),i.addEventListener(`pagehide`,()=>{b.isOpen()&&v(`unloading`)}),Ot(a,e,o),{isOpen:()=>b.isOpen()||u.isOpen(),close:()=>v()}}function Ot(e,t,n){for(let r of We(t)){let t=r.hint;if(t)for(let i of e.querySelectorAll(t))if(r.binding.kind===`chord`)i.dataset.shortcutHint=G(r.binding,n);else{let e=rt(r.binding,n);if(e&&i.setAttribute(`aria-keyshortcuts`,e),r.showHint&&!i.querySelector(`:scope > .prb-key-hint`)){let e=i.ownerDocument.createElement(`kbd`);e.className=`prb-key-hint`,e.setAttribute(`aria-hidden`,`true`),e.textContent=G(r.binding,n),i.append(e)}}}}function kt(e){return`${e} more`}function At(e){return e===0?`Nothing unread`:`${e} unread`}function jt(e){return e===`restarting`?`Workspace server restarting`:e===`unreachable`?`Workspace server not running`:`Workspace server running`}function Q(e,t){let n=e.querySelector(`[data-server-status]`);if(!n)return;n.dataset.serverStatus=t;let r=n.querySelector(`[data-server-status-label]`);r&&(r.textContent=jt(t))}function Mt(e,t){let n=e.querySelector(`[data-server-status]`);!n||n.dataset.serverStatus===`restarting`||Q(e,t?`running`:`unreachable`)}var Nt=6e3,Pt=5e3;function Ft(e=document){let t=e.querySelector(`.prb-toasts`);if(t)return t;let n=e.createElement(`div`);return n.className=`prb-toasts`,n.setAttribute(`role`,`status`),n.setAttribute(`aria-live`,`polite`),e.body.append(n),n}function It(e,t,n=window){return Lt(e,{kind:t.kind,text:t.text},n)}function Lt(e,t,n){let r=e.ownerDocument,i=r.createElement(`div`);i.className=`prb-toast`,i.dataset.kind=t.kind;let a=r.createElement(`span`);a.className=`prb-toast-text`,a.textContent=t.text;let o=r.createElement(`a`);o.className=`prb-toast-open`,t.href!==void 0&&t.link!==void 0&&(o.href=t.href,o.textContent=t.link);let s=r.createElement(`button`);for(s.type=`button`,s.className=`prb-toast-close`,s.setAttribute(`aria-label`,`Dismiss: ${t.text}`),s.textContent=`×`,i.append(a,...t.href===void 0?[]:[o],s),e.append(i);e.children.length>3;)e.firstElementChild?.remove();let c=n.setTimeout(()=>i.remove(),Nt),l=()=>n.clearTimeout(c),u=()=>{n.clearTimeout(c),c=n.setTimeout(()=>i.remove(),Nt)};return i.addEventListener(`mouseenter`,l),i.addEventListener(`mouseleave`,u),i.addEventListener(`focusin`,l),i.addEventListener(`focusout`,u),s.addEventListener(`click`,()=>{n.clearTimeout(c),i.remove()}),i}function Rt(e,t,n=window){return Lt(e,{kind:t.tone,text:t.headline,href:`/notifications/open?id=${encodeURIComponent(t.id)}`,link:`Open`},n)}function zt(e,t,n=window){return Lt(e,{kind:`more`,text:kt(t),href:`/notifications`,link:`View all`},n)}function Bt(e=document,t=window){let n=Number(e.body.dataset.notificationsSince);if(!Number.isFinite(n)||n<=0)return;let r=Ft(e),i=async()=>{try{let i=await t.fetch(`/notifications/recent?after=${n}`);if(Mt(e,!0),i.status===403)return;if(i.ok){let e=await i.json();typeof e.now==`number`&&(n=e.now);for(let n of[...e.notifications??[]].reverse())Rt(r,n,t);typeof e.more==`number`&&e.more>0&&zt(r,e.more,t)}}catch{Mt(e,!1)}t.setTimeout(()=>void i(),Pt)};t.setTimeout(()=>void i(),Pt)}function Vt(e,t){if(typeof t==`number`)for(let n of e.querySelectorAll(`[data-unread-count]`))n.dataset.unreadStyle===`rail`&&(n.textContent=t===0?``:At(t)),n.hidden=t===0}function Ht(e,t){Vt(e,t.unread),typeof t.driving==`boolean`&&Ut(e,t.driving)}function Ut(e,t){let n=e.querySelector(`[data-restart]`),r=e.querySelector(`[data-restart-note]`);n&&(n.disabled=t),r&&(r.hidden=!t)}var Wt=`prb-server-restarted`;function Gt(e=document,t=window){let n=null;try{n=t.sessionStorage.getItem(Wt),t.sessionStorage.removeItem(Wt)}catch{}n!==null&&It(Ft(e),{kind:`ready`,text:`Server restarted. Workspace is back online.`},t)}var Kt=2e4,qt=300;function Jt(e){Gt();let t=document.querySelector(`[data-restart]`),n=document.querySelector(`[data-restart-note]`);t&&t.addEventListener(`click`,()=>{t.disabled=!0,Yt(e,t,n)})}async function Yt(e,t,n){let r,i=null;try{let a=await fetch(e,{method:`POST`});if(a.status===409){Ut(document,!0);return}if(!a.ok)return void $(t,n,await rn(a));let o=await a.json();r=typeof o.startedAt==`number`?o.startedAt:null,i=tn(window.location.href,o.port)}catch{$(t,n,`The workspace server could not be reached.`);return}if(document.body.dataset.restarting=`true`,Q(document,`restarting`),i!==null){if(await $t(Number(new URL(i).port)))return void window.location.assign(i)}else if(await Xt(r)){try{window.sessionStorage.setItem(Wt,`1`)}catch{}window.location.reload();return}if(delete document.body.dataset.restarting,await nn()){Q(document,`running`),$(t,n,`The server did not restart, and is still the one that was running.`);return}Q(document,`unreachable`),$(t,n,`Server restart failed. Run prreviewbuddy open to start the workspace again.`)}async function Xt(e){let t=Date.now()+Kt;for(;Date.now()<t;){await new Promise(e=>setTimeout(e,qt));try{let t=await fetch(`/health`,{cache:`no-store`});if(!t.ok)continue;let n=await t.json();if(typeof n.startedAt==`number`&&n.startedAt!==e)return!0}catch{}}return!1}var Zt=4,Qt={now:()=>Date.now(),sleep:e=>new Promise(t=>setTimeout(t,e))};async function $t(e,t=()=>en(e),n=Qt){let r=n.now()+Kt,i=0;for(;n.now()<r;){await n.sleep(qt);let e=await t();if(e===`moved`||(i=e===`gone`?i+1:0,i>=Zt))return!0}for(let e=0;e<Zt;e+=1){let e=await t();if(e!==`gone`)return e===`moved`;await n.sleep(qt)}return!0}async function en(e){try{let t=await fetch(`/health`,{cache:`no-store`});return t.ok&&(await t.json()).movedTo===e?`moved`:`here`}catch{return`gone`}}function tn(e,t){if(typeof t!=`number`||!Number.isInteger(t))return null;let n=new URL(e);return t===(n.port===``?n.protocol===`https:`?443:80:Number(n.port))?null:(n.port=String(t),n.href)}async function nn(){try{return(await fetch(`/health`,{cache:`no-store`})).ok}catch{return!1}}async function rn(e){try{return(await e.json()).error??`The server could not be restarted.`}catch{return`The server could not be restarted.`}}function $(e,t,n){e.disabled=!1,t&&(t.textContent=n,t.hidden=!1)}export{xe as A,te as B,fe as C,Ae as D,ke as E,le as F,k as G,C as H,I,A as J,O as K,ce as L,Fe as M,Pe as N,Ne as O,ie as P,ae as R,Se as S,Ce as T,y as U,ne as V,v as W,e as X,n as Y,Re as _,Bt as a,me as b,Q as c,st as d,it as f,Le as g,be as h,It as i,Ie as j,ze as k,At as l,ge as m,Ht as n,Ft as o,R as p,p as q,Vt as r,Mt as s,Jt as t,Dt as u,je as v,Oe as w,pe as x,we as y,P as z};
package/static/help.js CHANGED
@@ -1 +1 @@
1
- import{U as e,V as t,Y as n,d as r,f as i,t as a,u as o}from"./chunk-CXf6hwXL.js";t(),o(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(r(document,i(e(navigator)))),a(`/restart`),n(window,()=>window.location.reload());
1
+ import{U as e,V as t,X as n,d as r,f as i,t as a,u as o}from"./chunk-DqEA-C0S.js";t(),o(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(r(document,i(e(navigator)))),a(`/restart`),n(window,()=>window.location.reload());
@@ -1 +1 @@
1
- import{V as e,Y as t,l as n,r,t as i,u as a}from"./chunk-CXf6hwXL.js";import{t as o}from"./chunk-BadSI8AL.js";function s(e,t,n){let r=[...e.querySelectorAll(`[data-notification-id]`)];r.forEach((e,t)=>{e.hidden=t>=n}),t&&(t.hidden=r.length<=n)}function c(e){let t=e.querySelector(`[data-notifications-more]`),n=15;s(e,t,n),t?.addEventListener(`click`,()=>{n+=15,s(e,t,n)})}e(),i(`/restart`),c(document);var l=o({doc:document,item:`[data-notification-id]`,link:`a.prb-notification-open`,walk:()=>[...document.querySelectorAll(`[data-notification-id]:not([hidden])`)].filter(e=>e.querySelector(`a.prb-notification-open`)),background:()=>document.querySelector(`.prb-shell > main`)});a(`notifications`,{"notifications.next":{run:()=>l.move(1)},"notifications.previous":{run:()=>l.move(-1)},"notifications.open":{available:()=>l.enterOpens(),run:()=>l.open()},"notifications.openInNewTab":{available:()=>l.enterOpens(),run:()=>l.openInNewTab()}});var u=document.querySelector(`[data-notifications-count]`),d=document.querySelector(`[data-notifications-read-all]`);async function f(){try{let e=await fetch(`/notifications`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`read-all`})});if(!e.ok)return null;let t=await e.json();return typeof t.unread==`number`?t.unread:null}catch{return null}}function p(e){e.setAttribute(`data-read`,`true`);let t=e.querySelector(`.prb-notification-open`),n=t?.getAttribute(`aria-label`);t&&n?.startsWith(`Unread. `)&&t.setAttribute(`aria-label`,n.slice(8))}d?.addEventListener(`click`,()=>{d.disabled=!0,f().then(e=>{if(e===null){d.disabled=!1;return}document.querySelectorAll(`[data-notification-id]`).forEach(p),u&&(u.textContent=n(e)),r(document,e),d.disabled=e===0})}),t(window,()=>window.location.reload());
1
+ import{V as e,X as t,l as n,r,t as i,u as a}from"./chunk-DqEA-C0S.js";import{t as o}from"./chunk-C8kkSv38.js";function s(e,t,n){let r=[...e.querySelectorAll(`[data-notification-id]`)];r.forEach((e,t)=>{e.hidden=t>=n}),t&&(t.hidden=r.length<=n)}function c(e){let t=e.querySelector(`[data-notifications-more]`),n=15;s(e,t,n),t?.addEventListener(`click`,()=>{n+=15,s(e,t,n)})}e(),i(`/restart`),c(document);var l=o({doc:document,item:`[data-notification-id]`,link:`a.prb-notification-open`,walk:()=>[...document.querySelectorAll(`[data-notification-id]:not([hidden])`)].filter(e=>e.querySelector(`a.prb-notification-open`)),background:()=>document.querySelector(`.prb-shell > main`)});a(`notifications`,{"notifications.next":{run:()=>l.move(1)},"notifications.previous":{run:()=>l.move(-1)},"notifications.open":{available:()=>l.enterOpens(),run:()=>l.open()},"notifications.openInNewTab":{available:()=>l.enterOpens(),run:()=>l.openInNewTab()}});var u=document.querySelector(`[data-notifications-count]`),d=document.querySelector(`[data-notifications-read-all]`);async function f(){try{let e=await fetch(`/notifications`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`read-all`})});if(!e.ok)return null;let t=await e.json();return typeof t.unread==`number`?t.unread:null}catch{return null}}function p(e){e.setAttribute(`data-read`,`true`);let t=e.querySelector(`.prb-notification-open`),n=t?.getAttribute(`aria-label`);t&&n?.startsWith(`Unread. `)&&t.setAttribute(`aria-label`,n.slice(8))}d?.addEventListener(`click`,()=>{d.disabled=!0,f().then(e=>{if(e===null){d.disabled=!1;return}document.querySelectorAll(`[data-notification-id]`).forEach(p),u&&(u.textContent=n(e)),r(document,e),d.disabled=e===0})}),t(window,()=>window.location.reload());
package/static/reviews.js CHANGED
@@ -1 +1 @@
1
- import{A as e,C as t,D as n,F as r,G as i,H as a,J as o,K as s,L as c,M as ee,N as te,O as ne,P as re,S as l,T as ie,V as ae,Y as oe,_ as se,a as ce,b as le,g as ue,h as de,i as fe,j as pe,k as me,m as he,n as ge,o as _e,p as u,s as ve,t as ye,u as be,v as xe,w as Se,x as Ce,y as we,z as Te}from"./chunk-CXf6hwXL.js";import{a as Ee,i as De,n as Oe,o as ke,r as Ae,s as je,t as Me}from"./chunk-CndkgJPh.js";import{t as Ne}from"./chunk-BadSI8AL.js";function Pe(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function Fe(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;Ie(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return Ie(e,!r);n(r)}function Ie(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`&#9733;`:`&#9734;`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function Le(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function Re(e,t,n,r){return{limits:n,expanded:t.filter(e=>e.querySelector(`[data-history-list]:not([hidden])`)).map(e=>e.dataset.id??``).filter(e=>e!==``),main:r?.scrollTop??0,focus:a(e.activeElement,e.body)}}function ze(e,t){let n=e?.limits;if(!n||typeof n!=`object`)return t;let r={...t};for(let e of u){let t=n[e];typeof t==`number`&&Number.isInteger(t)&&t>r[e]&&(r[e]=t)}return r}function Be(e,t,n){if(!t)return;n.reveal(ze(t,n.limits));let r=new Set(o(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(e.dataset.id??``)&&Le(t,!0)}let a=i(t,`main`);n.pane&&a!==null&&(n.pane.scrollTop=a),s(e,t.focus)}function Ve(e,n){let r=Promise.resolve();for(let i of e){let e=i.dataset.section;if(!t(e))continue;let a=i.open;i.addEventListener(`toggle`,()=>{if(i.open===a)return;a=i.open;let t=!i.open;r=r.then(()=>n(e,t)).catch(()=>{})})}}var d=ae({ownsRestore:!0});ye(`/restart`);var f=[...document.querySelectorAll(`[data-card]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),He=Object.fromEntries(u.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),p=document.querySelector(`.prb-index`);function Ue(e){return{id:e.dataset.id??``,queue:e.dataset.queue===void 0?void 0:Number(e.dataset.queue),status:e.dataset.status??`new`,prState:e.dataset.prState}}var m=document.querySelector(`[data-search]`),h=document.querySelector(`[data-status-filter]`),g=document.querySelector(`[data-author-filter]`),_=document.querySelector(`[data-pr-filter]`),We=document.querySelector(`[data-no-matches]`),v=document.querySelector(`[data-count]`),y=l();function Ge(e){return{stored:Te({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:re(e.dataset)??{at:0,kind:`created`}}}function Ke(e){return e.dataset.pinned===`true`}function b(e){let{stored:t,activity:n}=Ge(e);return Ce(Ke(e),t,n,E.filter)}var x=document.querySelector(`[data-bulk]`),qe=document.querySelector(`[data-bulk-count]`),Je=document.querySelector(`[data-bulk-delete]`),Ye=document.querySelector(`[data-bulk-question]`),S=document.querySelector(`[data-bulk-confirm]`),C=document.querySelector(`[data-bulk-actions]`),w=document.querySelector(`[data-bulk-error]`),T=document.querySelector(`[data-bulk-select-all]`),E=ie(window.location.hash),D=new Set,O=!1,k=document.querySelector(`[data-bulk-fetch]`),A={},j=[],M=!1;function N(){let t=E.query.trim().toLowerCase();E.author!==``&&![...g?.options??[]].some(e=>e.value===E.author)&&(E.author=``);let n=le(xe(f.map(e=>({...Ue(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...E,query:t}).map(e=>e.card),b);j=n;let r=e(n,b,y),i=new Set(u.flatMap(e=>r[e].shown));for(let e of f)e.hidden=!i.has(e);for(let e of u){let t=He[e];t&&Pe(t,r[e].shown);let n=document.querySelector(`[data-load-more="${e}"]`);n&&(n.hidden=r[e].total<=r[e].shown.length);let i=document.querySelector(`[data-section="${e}"]`);i&&(i.hidden=r[e].total===0);let a=i?.querySelector(`[data-section-count]`);a&&(a.textContent=String(r[e].total))}if(m&&m.value!==E.query&&(m.value=E.query),g&&(g.value=E.author,E.author===``?delete g.dataset.active:g.dataset.active=``),_||(E.pr=`any`),_&&(_.value=E.pr,E.pr===`any`?delete _.dataset.active:_.dataset.active=``),h&&(h.value=E.filter,E.filter===`all`?delete h.dataset.active:h.dataset.active=``),v){let e=n.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);v.textContent=de(e,n.length)}We&&(We.hidden=n.length>0||f.length===0),tt(n)}var Xe=300,P=null;function F(){P!==null&&window.clearTimeout(P),P=null,d.replace(we(E),{})}function I(e,t){if(E={...E,...e},y=l(),N(),t===`now`)return F();P!==null&&window.clearTimeout(P),P=window.setTimeout(F,Xe)}window.addEventListener(`pagehide`,()=>{P!==null&&F()}),document.addEventListener(`click`,e=>{P!==null&&e.target?.closest?.(`a[href]`)&&F()},!0),m?.addEventListener(`input`,()=>I({query:m.value},`settled`)),m?.addEventListener(`keydown`,e=>{e.key===`Escape`&&m.value!==``&&(e.preventDefault(),I({query:``},`now`))}),h?.addEventListener(`change`,()=>{I({filter:h.value},`now`)}),g?.addEventListener(`change`,()=>{I({author:g.value},`now`)}),_?.addEventListener(`change`,()=>{I({pr:_.value},`now`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;!t||!u.includes(t)||(y={...y,[t]:y[t]+15},N())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{E=ie(window.location.hash),y=l(),N(),Qe()});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-pin]`);if(!t?.dataset.pin)return;e.preventDefault(),e.stopPropagation();let n=t.dataset.pin;Fe(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{let n=t.closest(`[data-card]`);n&&(n.dataset.pinned=String(e),J(n),N())})});async function Ze(e,t){let n;try{let r=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:e,action:t})});if(!r.ok)return;n=(await r.json()).queue}catch{return}L(n),N()}function L(e){let t=new Map(e.map((e,t)=>[e,t]));for(let e of f){let n=t.get(e.dataset.id??``);n===void 0?delete e.dataset.queue:e.dataset.queue=String(n),n!==void 0&&e.dataset.lifecycle!==`active`&&(e.dataset.lifecycle=`active`,delete e.dataset.lifecycleAt,J(e))}for(let e of document.querySelectorAll(`[data-queue-action][data-queue-id]`)){let r=t.has(e.dataset.queueId??``);e.dataset.queueAction=r?`remove`:`add`,e.textContent=n(r)}let r=document.querySelector(`[data-queue-option]`);r&&(r.textContent=ne(e.length))}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-history-toggle]`);if(!t)return;e.preventDefault(),e.stopPropagation();let n=t.parentElement?.querySelector(`[data-history-list]`);n&&Le(t,n.hidden!==!1)});var R=document.querySelector(`.prb-shell > main`);function Qe(){Be(document,d.current().ui,{cards:f,pane:R,limits:y,reveal:e=>{y=e,N()}})}d.setCapturer(()=>Re(document,f,y,R)),N(),Qe();function z(e){for(let t of document.querySelectorAll(`[data-menu]`)){if(t===e)continue;let n=t.querySelector(`[data-menu-panel]`),r=t.querySelector(`[data-menu-trigger]`);n&&(n.hidden=!0),r?.setAttribute(`aria-expanded`,`false`),B(t)}}function B(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`keydown`,e=>{e.key===`Escape`&&z()}),document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-menu]`);if(!n)return void z();let r=t.closest(`[data-menu-trigger]`);if(r){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-panel]`);if(!t)return;let i=t.hidden;z(n),B(n),t.hidden=!i,r.setAttribute(`aria-expanded`,String(i));return}let i=t.closest(`[data-copy-id]`);if(i?.dataset.copyId){e.preventDefault(),e.stopPropagation(),je(i,i.dataset.copyId);return}let a=t.closest(`[data-fetch-review]`);if(a?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),z();let t=a.closest(`[data-card]`);t&&St([t]);return}let o=t.closest(`[data-mark-status]`);if(o?.dataset.markId){e.preventDefault(),e.stopPropagation(),z(),mt(o.dataset.markId,o.dataset.markStatus===`complete`);return}let s=t.closest(`[data-lifecycle-set]`);if(s?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),z(),ht([s.dataset.lifecycleId],s.dataset.lifecycleSet);return}let c=t.closest(`[data-queue-action]`);if(c?.dataset.queueId){e.preventDefault(),e.stopPropagation(),z(),Ze(c.dataset.queueId,c.dataset.queueAction===`remove`?`remove`:`add`);return}if(t.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-items]`),r=n.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),r&&(r.hidden=!1);return}if(t.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),B(n);return}if(t.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),$e(n);return}e.preventDefault(),e.stopPropagation()});async function $e(e){let t=e.querySelector(`[data-delete]`),n=t?.dataset.delete;if(!n)return;let r=e.querySelector(`[data-menu-confirm]`),i=e.querySelector(`[data-confirm-delete]`);i&&(i.disabled=!0,i.textContent=`Deleting`);try{let r=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,scope:t?.dataset.scope??`review`})});if(r.ok)return void window.location.reload();et(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{et(e,`The workspace server did not answer. It may have stopped.`)}i&&(i.disabled=!1,i.textContent=`Delete`),r&&(r.hidden=!0);let a=e.querySelector(`[data-menu-items]`);a&&(a.hidden=!1)}function et(e,t){e.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=t,e.querySelector(`[data-menu-panel]`)?.append(n)}function V(e){O=e,e||D.clear(),p&&(e?p.dataset.selecting=``:delete p.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e));for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);H(),N()}function H(){S&&(S.hidden=!0),C&&(C.hidden=!1),w&&(w.hidden=!0,w.textContent=``)}function tt(e){for(let e of f){let t=D.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!x||(x.hidden=!O,!O))return;let t=new Set(e.filter(nt).map(e=>e.dataset.id)),n=[...D].filter(e=>!t.has(e)).length;qe&&(qe.textContent=ee(D.size,n)),T&&(T.textContent=pe(e.length),T.disabled=e.every(e=>D.has(e.dataset.id??``))),Je&&(Je.textContent=ue(dt()));for(let e of x.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-delete]`))e.disabled=D.size===0;k&&(k.hidden=!Oe(A,X(G())))}function nt(e){return!e.hidden&&e.closest(`details`)?.open!==!1}for(let e of document.querySelectorAll(`details[data-section]`))e.addEventListener(`toggle`,()=>tt(j));Ve(document.querySelectorAll(`details[data-section]`),(e,t)=>fetch(`/sections`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({section:e,collapsed:t})})),document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{V(!O)}),T?.addEventListener(`click`,()=>{for(let e of j)e.dataset.id&&D.add(e.dataset.id);H(),N()});function U(e){D.has(e)?D.delete(e):D.add(e),H(),N()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&U(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!O)return;let t=e.target,n=t.closest(`[data-card]`);n?.dataset.id&&(t.closest(`[data-select], [data-pin], [data-menu], [data-history-toggle]`)||(e.preventDefault(),U(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!O||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),U(t.dataset.id))});var W=Ne({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>j.filter(nt),enterAllowed:()=>!O,background:()=>R,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null}),rt=8;function it(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),P!==null&&F(),d.leaving(),at=!0,window.location.assign(t.href))}var at=!1,ot={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=m?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=m?.value??``;let r=document.createElement(`p`);r.className=`prb-palette-summary`,r.setAttribute(`aria-live`,`polite`);let i=document.createElement(`div`);i.className=`prb-palette-results`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,`Matching reviews`);let a=()=>{let e=j.slice(0,rt);i.replaceChildren(...e.map(e=>{let t=document.createElement(`button`);t.type=`button`,t.className=`prb-palette-result`,t.dataset.resultId=e.dataset.id??``;let n=document.createElement(`span`);n.className=`prb-palette-result-title`,n.textContent=e.querySelector(`.prb-card-head h2`)?.textContent??``;let r=document.createElement(`span`);return r.className=`prb-palette-result-where`,r.textContent=[e.querySelector(`.prb-card-repo`)?.textContent,e.querySelector(`.prb-card-branch`)?.textContent].filter(Boolean).join(` · `),t.append(n,r),t})),r.textContent=j.length===0?`No reviews match.`:j.length>e.length?`The first ${e.length} of ${v?.textContent??j.length}`:v?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=f.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),it(n))};n.addEventListener(`input`,()=>{m&&(m.value=n.value,m.dispatchEvent(new Event(`input`,{bubbles:!0})),a())}),i.addEventListener(`click`,e=>s(e.target.closest(`.prb-palette-result`)??void 0)),e.addEventListener(`keydown`,e=>{if(e.isComposing)return;let t=o(),r=t.indexOf(e.target);if(e.key===`Enter`&&e.target===n)return e.preventDefault(),s(t[0]);let i=e.key===`ArrowDown`?r<0?t[0]:t[r+1]:e.key===`ArrowUp`?r<=0?n:t[r-1]:null;i&&(e.preventDefault(),i.focus())}),e.append(n,r,i),a(),n.focus(),n.select()}},st={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=v?.textContent??``},r=[h,g,_].flatMap(e=>{if(!e)return[];let t=document.createElement(`label`);t.className=`prb-palette-field`;let r=document.createElement(`span`),i=(e.getAttribute(`aria-label`)??``).replace(/^Filter by /,``);r.textContent=i.charAt(0).toUpperCase()+i.slice(1);let a=document.createElement(`select`);for(let t of e.options)a.append(new Option(t.text,t.value));return a.value=e.value,a.addEventListener(`change`,()=>{e.value=a.value,e.dispatchEvent(new Event(`change`,{bubbles:!0})),n()}),t.append(r,a),[t]});e.append(...r,t),n(),r[0]?.querySelector(`select`)?.focus()}};function ct(e){let t=()=>document.querySelector(`details[data-section="${e}"]`);return{available:()=>!!(t()&&!t().hidden),state:()=>{let e=t();return e&&!e.hidden?e.open?`Expanded`:`Collapsed`:null},run:()=>{let e=t();e&&(e.open=!e.open)}}}var lt=Object.fromEntries(u.map(e=>[`reviews.section.${e}`,ct(e)])),ut=be(`reviews`,{...lt,"reviews.search":{available:()=>m!==null,panel:ot},"reviews.filters":{available:()=>h!==null,panel:st},"reviews.next":{run:()=>W.move(1)},"reviews.previous":{run:()=>W.move(-1)},"reviews.open":{available:()=>W.enterOpens(),run:()=>W.open()},"reviews.openInNewTab":{available:()=>W.enterOpens(),run:()=>W.openInNewTab()}},{onOpen:()=>z(),onSettle:()=>$()});function G(){return le(f.filter(e=>D.has(e.dataset.id??``)),b)}function dt(){return G().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function K(e){w&&(w.textContent=e,w.hidden=!1)}function q(e){for(let t of x?.querySelectorAll(`button`)??[])t.disabled=e}async function ft(e){let t=[...D];if(t.length!==0){q(!0);try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok)return q(!1),K(`That could not be saved. The workspace server refused it.`)}catch{return q(!1),K(`The workspace server did not answer. It may have stopped.`)}pt(G(),e),q(!1),V(!1)}}function pt(e,t){let n=t?`complete`:`in-progress`,r=t?`in-progress`:`complete`;for(let t of e){t.dataset.status=n;let e=t.querySelector(`.prb-card-status`);e&&(e.dataset.status=n,e.textContent=te(n));let i=t.querySelector(`[data-mark-status]`);i&&(i.dataset.markStatus=r,i.textContent=Se(r))}}async function mt(e,t){try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:[e],complete:t})})).ok)return}catch{return}pt(f.filter(t=>t.dataset.id===e),t),N()}async function ht(e,t){let n;try{let r=await fetch(`/lifecycle`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,state:t})});n=r.ok?await r.json().catch(()=>null):null}catch{n=null}if(!n)return!1;let r=new Set(e);for(let e of f)r.has(e.dataset.id??``)&&(e.dataset.lifecycle=t,t===`active`?delete e.dataset.lifecycleAt:e.dataset.lifecycleAt=String(n.at),J(e));return L(n.queue),N(),!0}function J(e){let{stored:t,activity:n}=Ge(e),i=e.querySelector(`[data-lifecycle-chip]`);if(i){let r=he(Ke(e),t,n);i.textContent=r??``,i.hidden=r===void 0}for(let i of e.querySelectorAll(`[data-lifecycle-set]`)){let e=i.dataset.lifecycleSet;i.hidden=!c(e,t,n),i.textContent=r(e,t,n)}}async function gt(e){let t=[...D];if(t.length===0)return;q(!0);let n=await ht(t,e);if(q(!1),!n)return K(`That could not be saved. The workspace server refused it or did not answer.`);V(!1)}async function _t(){let e=[...D];if(e.length===0)return;q(!0);let t=null;try{let n=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e})});if(t=n.ok?await n.json().catch(()=>null):null,!t)return q(!1),H(),K(`Nothing was deleted. The workspace server refused it.`)}catch{return q(!1),H(),K(`The workspace server did not answer. It may have stopped.`)}let n=t.blocked??[],r=new Set(n.map(e=>e.id));for(let e of G())r.has(e.dataset.id??``)||e.remove();f=f.filter(e=>e.isConnected),D.clear();for(let e of r)D.add(e);if(q(!1),H(),n.length===0)return V(!1);N(),K([...new Set(n.map(e=>e.error))].join(` `))}async function vt(){let e=G().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;q(!0);let t=null;try{let n=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,action:`add`})});t=n.ok?await n.json().catch(()=>null):null}catch{return q(!1),H(),K(`The workspace server did not answer. It may have stopped.`)}if(!t?.queue)return q(!1),H(),K(`Nothing was added. The workspace server refused it.`);L(t.queue);let n=t.refused??[];D.clear();for(let e of n)D.add(e.id);if(q(!1),H(),n.length===0)return V(!1);N(),K([...new Set(n.map(e=>e.error))].join(` `))}x?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-bulk-queue]`))return void vt();let n=t.closest(`[data-bulk-mark]`);if(n)return void ft(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void gt(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Ye&&(Ye.textContent=se(dt())),C&&(C.hidden=!0),S&&(S.hidden=!1);return}if(t.closest(`[data-bulk-confirm-delete]`))return void _t();if(t.closest(`[data-bulk-cancel-delete]`))return H();if(t.closest(`[data-bulk-cancel]`))return V(!1)}),oe(window,()=>window.location.reload());var Y=`prb-fetch-summary`;function X(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function yt(e){return Ae(X(e),A)}function bt(){for(let e of f){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!Oe(A,X([e])))}}async function xt(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;A=(await e.json()).targets??{}}catch{return}bt(),N()}async function St(e,t){let n=yt(e);if(M||n.repositories===0)return;M=!0;let r=[k,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=Ee(n.repositories));let i=null;try{let e=await fetch(`/fetch-updates`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:n.ids})});e.ok&&(i=await e.json())}catch{}M=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Me),N();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:De(a)};if(a.moved>0||Q){try{window.sessionStorage.setItem(Y,JSON.stringify(o))}catch{}if(!wt())return void window.location.reload();Q=!0}fe(_e(),o)}try{let e=window.sessionStorage.getItem(Y);if(e){window.sessionStorage.removeItem(Y);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&fe(_e(),{kind:t.kind,text:t.text})}}catch{}k?.addEventListener(`click`,()=>void St(G(),k)),xt();var Ct=document.body.dataset.indexRevision??``,Z=document.body.dataset.live===`true`?Date.now():0,Q=!1;function wt(){return D.size>0||document.activeElement===m||M||ut.isOpen()||at}function $(){Q&&!wt()&&window.location.reload()}async function Tt(){try{let e=await fetch(`/revision`);if(e.ok){ve(document,!0);let t=await e.json();ge(document,t),t.live&&Z===0&&(Z=Date.now()),t.live||(Z=0);let n=me(Ct,t.revision??``,wt());if(n===`reload`)return void window.location.reload();n===`hold`&&(Q=!0)}}catch{ve(document,!1)}window.setTimeout(()=>void Tt(),ke(Z===0?2**53-1:Date.now()-Z))}Tt(),m?.addEventListener(`blur`,$),document.addEventListener(`click`,()=>window.setTimeout($,0)),ce();
1
+ import{A as e,C as t,D as n,F as r,G as i,H as a,J as o,K as s,L as ee,M as te,N as ne,O as re,P as ie,S as c,T as ae,V as oe,X as se,_ as ce,a as le,b as ue,g as de,h as fe,i as pe,j as me,k as he,m as ge,n as _e,o as ve,p as l,s as ye,t as be,u as xe,v as Se,w as Ce,x as we,y as Te,z as Ee}from"./chunk-DqEA-C0S.js";import{a as De,c as Oe,i as ke,n as Ae,o as je,r as Me,s as Ne,t as Pe}from"./chunk-BsU84lX4.js";import{t as Fe}from"./chunk-C8kkSv38.js";function Ie(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function Le(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;Re(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return Re(e,!r);n(r)}function Re(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`&#9733;`:`&#9734;`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function ze(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function Be(e,t,n,r){return{limits:n,expanded:t.filter(e=>e.querySelector(`[data-history-list]:not([hidden])`)).map(e=>e.dataset.id??``).filter(e=>e!==``),main:r?.scrollTop??0,focus:a(e.activeElement,e.body)}}function Ve(e,t){let n=e?.limits;if(!n||typeof n!=`object`)return t;let r={...t};for(let e of l){let t=n[e];typeof t==`number`&&Number.isInteger(t)&&t>r[e]&&(r[e]=t)}return r}function He(e,t,n){if(!t)return;n.reveal(Ve(t,n.limits));let r=new Set(o(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(e.dataset.id??``)&&ze(t,!0)}let a=i(t,`main`);n.pane&&a!==null&&(n.pane.scrollTop=a),s(e,t.focus)}function Ue(e,n){let r=Promise.resolve();for(let i of e){let e=i.dataset.section;if(!t(e))continue;let a=i.open;i.addEventListener(`toggle`,()=>{if(i.open===a)return;a=i.open;let t=!i.open;r=r.then(()=>n(e,t)).catch(()=>{})})}}var u=oe({ownsRestore:!0});be(`/restart`);var d=[...document.querySelectorAll(`[data-card]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),We=Object.fromEntries(l.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),f=document.querySelector(`.prb-index`);function Ge(e){return{id:e.dataset.id??``,queue:e.dataset.queue===void 0?void 0:Number(e.dataset.queue),status:e.dataset.status??`new`,prState:e.dataset.prState}}var p=document.querySelector(`[data-search]`),m=document.querySelector(`[data-status-filter]`),h=document.querySelector(`[data-author-filter]`),g=document.querySelector(`[data-pr-filter]`),Ke=document.querySelector(`[data-no-matches]`),_=document.querySelector(`[data-count]`),v=c();function qe(e){return{stored:Ee({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:ie(e.dataset)??{at:0,kind:`created`}}}function Je(e){return e.dataset.pinned===`true`}function y(e){let{stored:t,activity:n}=qe(e);return we(Je(e),t,n,T.filter)}var b=document.querySelector(`[data-bulk]`),Ye=document.querySelector(`[data-bulk-count]`),Xe=document.querySelector(`[data-bulk-delete]`),Ze=document.querySelector(`[data-bulk-question]`),x=document.querySelector(`[data-bulk-confirm]`),S=document.querySelector(`[data-bulk-actions]`),C=document.querySelector(`[data-bulk-error]`),w=document.querySelector(`[data-bulk-select-all]`),T=ae(window.location.hash),E=new Set,D=!1,O=document.querySelector(`[data-bulk-fetch]`),k={},A=[],j=!1;function M(){let t=T.query.trim().toLowerCase();T.author!==``&&![...h?.options??[]].some(e=>e.value===T.author)&&(T.author=``);let n=ue(Se(d.map(e=>({...Ge(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...T,query:t}).map(e=>e.card),y);A=n;let r=e(n,y,v),i=new Set(l.flatMap(e=>r[e].shown));for(let e of d)e.hidden=!i.has(e);for(let e of l){let t=We[e];t&&Ie(t,r[e].shown);let n=document.querySelector(`[data-load-more="${e}"]`);n&&(n.hidden=r[e].total<=r[e].shown.length);let i=document.querySelector(`[data-section="${e}"]`);i&&(i.hidden=r[e].total===0);let a=i?.querySelector(`[data-section-count]`);a&&(a.textContent=String(r[e].total))}if(p&&p.value!==T.query&&(p.value=T.query),h&&(h.value=T.author,T.author===``?delete h.dataset.active:h.dataset.active=``),g||(T.pr=`any`),g&&(g.value=T.pr,T.pr===`any`?delete g.dataset.active:g.dataset.active=``),m&&(m.value=T.filter,T.filter===`all`?delete m.dataset.active:m.dataset.active=``),_){let e=n.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);_.textContent=fe(e,n.length)}Ke&&(Ke.hidden=n.length>0||d.length===0),rt(n)}var Qe=300,N=null;function P(){N!==null&&window.clearTimeout(N),N=null,u.replace(Te(T),{})}function F(e,t){if(T={...T,...e},v=c(),M(),t===`now`)return P();N!==null&&window.clearTimeout(N),N=window.setTimeout(P,Qe)}window.addEventListener(`pagehide`,()=>{N!==null&&P()}),document.addEventListener(`click`,e=>{N!==null&&e.target?.closest?.(`a[href]`)&&P()},!0),p?.addEventListener(`input`,()=>F({query:p.value},`settled`)),p?.addEventListener(`keydown`,e=>{e.key===`Escape`&&p.value!==``&&(e.preventDefault(),F({query:``},`now`))}),m?.addEventListener(`change`,()=>{F({filter:m.value},`now`)}),h?.addEventListener(`change`,()=>{F({author:h.value},`now`)}),g?.addEventListener(`change`,()=>{F({pr:g.value},`now`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;!t||!l.includes(t)||(v={...v,[t]:v[t]+15},M())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{T=ae(window.location.hash),v=c(),M(),et()});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-pin]`);if(!t?.dataset.pin)return;e.preventDefault(),e.stopPropagation();let n=t.dataset.pin;Le(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{let n=t.closest(`[data-card]`);n&&(n.dataset.pinned=String(e),q(n),M())})});async function $e(e,t){let n;try{let r=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:e,action:t})});if(!r.ok)return;n=(await r.json()).queue}catch{return}I(n),M()}function I(e){let t=new Map(e.map((e,t)=>[e,t]));for(let e of d){let n=t.get(e.dataset.id??``);n===void 0?delete e.dataset.queue:e.dataset.queue=String(n),n!==void 0&&e.dataset.lifecycle!==`active`&&(e.dataset.lifecycle=`active`,delete e.dataset.lifecycleAt,q(e))}for(let e of document.querySelectorAll(`[data-queue-action][data-queue-id]`)){let r=t.has(e.dataset.queueId??``);e.dataset.queueAction=r?`remove`:`add`,e.textContent=n(r)}let r=document.querySelector(`[data-queue-option]`);r&&(r.textContent=re(e.length))}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-history-toggle]`);if(!t)return;e.preventDefault(),e.stopPropagation();let n=t.parentElement?.querySelector(`[data-history-list]`);n&&ze(t,n.hidden!==!1)});var L=document.querySelector(`.prb-shell > main`);function et(){He(document,u.current().ui,{cards:d,pane:L,limits:v,reveal:e=>{v=e,M()}})}u.setCapturer(()=>Be(document,d,v,L)),M(),et();var R=Ne(document,{onOpen:z,onClose:z});function z(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-menu]`);if(!n)return;let r=t.closest(`[data-copy-id]`);if(r?.dataset.copyId){e.preventDefault(),e.stopPropagation(),Oe(r,r.dataset.copyId);return}let i=t.closest(`[data-fetch-review]`);if(i?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),R.closeAll();let t=i.closest(`[data-card]`);t&&Tt([t]);return}let a=t.closest(`[data-mark-status]`);if(a?.dataset.markId){e.preventDefault(),e.stopPropagation(),R.closeAll(),_t(a.dataset.markId,a.dataset.markStatus===`complete`);return}let o=t.closest(`[data-lifecycle-set]`);if(o?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),R.closeAll(),vt([o.dataset.lifecycleId],o.dataset.lifecycleSet);return}let s=t.closest(`[data-queue-action]`);if(s?.dataset.queueId){e.preventDefault(),e.stopPropagation(),R.closeAll(),$e(s.dataset.queueId,s.dataset.queueAction===`remove`?`remove`:`add`);return}if(t.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-items]`),r=n.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),r&&(r.hidden=!1),e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),z(n),e.detail===0&&n.querySelector(`[data-delete]`)?.focus();return}if(t.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),tt(n);return}e.preventDefault(),e.stopPropagation()});async function tt(e){let t=e.querySelector(`[data-delete]`),n=t?.dataset.delete;if(!n)return;let r=e.querySelector(`[data-menu-confirm]`),i=e.querySelector(`[data-confirm-delete]`);i&&(i.disabled=!0,i.textContent=`Deleting`);try{let r=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,scope:t?.dataset.scope??`review`})});if(r.ok)return void window.location.reload();nt(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{nt(e,`The workspace server did not answer. It may have stopped.`)}i&&(i.disabled=!1,i.textContent=`Delete`),r&&(r.hidden=!0);let a=e.querySelector(`[data-menu-items]`);a&&(a.hidden=!1)}function nt(e,t){e.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=t,e.querySelector(`[data-menu-panel]`)?.append(n)}function B(e){D=e,e||E.clear(),f&&(e?f.dataset.selecting=``:delete f.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e));for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);V(),M()}function V(){x&&(x.hidden=!0),S&&(S.hidden=!1),C&&(C.hidden=!0,C.textContent=``)}function rt(e){for(let e of d){let t=E.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!b||(b.hidden=!D,!D))return;let t=new Set(e.filter(it).map(e=>e.dataset.id)),n=[...E].filter(e=>!t.has(e)).length;Ye&&(Ye.textContent=te(E.size,n)),w&&(w.textContent=me(e.length),w.disabled=e.every(e=>E.has(e.dataset.id??``))),Xe&&(Xe.textContent=de(mt()));for(let e of b.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-delete]`))e.disabled=E.size===0;O&&(O.hidden=!Ae(k,Y(W())))}function it(e){return!e.hidden&&e.closest(`details`)?.open!==!1}for(let e of document.querySelectorAll(`details[data-section]`))e.addEventListener(`toggle`,()=>rt(A));Ue(document.querySelectorAll(`details[data-section]`),(e,t)=>fetch(`/sections`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({section:e,collapsed:t})})),document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{B(!D)}),w?.addEventListener(`click`,()=>{for(let e of A)e.dataset.id&&E.add(e.dataset.id);V(),M()});function H(e){E.has(e)?E.delete(e):E.add(e),V(),M()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&H(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!D)return;let t=e.target,n=t.closest(`[data-card]`);n?.dataset.id&&(t.closest(`[data-select], [data-pin], [data-menu], [data-history-toggle]`)||(e.preventDefault(),H(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!D||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),H(t.dataset.id))});var U=Fe({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>A.filter(it),enterAllowed:()=>!D,background:()=>L,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function at(){return U.holdsKeys()?U.current()?.querySelector(`:scope > [data-menu]`)??null:null}var ot=8;function st(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),N!==null&&P(),u.leaving(),ct=!0,window.location.assign(t.href))}var ct=!1,lt={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=p?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=p?.value??``;let r=document.createElement(`p`);r.className=`prb-palette-summary`,r.setAttribute(`aria-live`,`polite`);let i=document.createElement(`div`);i.className=`prb-palette-results`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,`Matching reviews`);let a=()=>{let e=A.slice(0,ot);i.replaceChildren(...e.map(e=>{let t=document.createElement(`button`);t.type=`button`,t.className=`prb-palette-result`,t.dataset.resultId=e.dataset.id??``;let n=document.createElement(`span`);n.className=`prb-palette-result-title`,n.textContent=e.querySelector(`.prb-card-head h2`)?.textContent??``;let r=document.createElement(`span`);return r.className=`prb-palette-result-where`,r.textContent=[e.querySelector(`.prb-card-repo`)?.textContent,e.querySelector(`.prb-card-branch`)?.textContent].filter(Boolean).join(` · `),t.append(n,r),t})),r.textContent=A.length===0?`No reviews match.`:A.length>e.length?`The first ${e.length} of ${_?.textContent??A.length}`:_?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=d.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),st(n))};n.addEventListener(`input`,()=>{p&&(p.value=n.value,p.dispatchEvent(new Event(`input`,{bubbles:!0})),a())}),i.addEventListener(`click`,e=>s(e.target.closest(`.prb-palette-result`)??void 0)),e.addEventListener(`keydown`,e=>{if(e.isComposing)return;let t=o(),r=t.indexOf(e.target);if(e.key===`Enter`&&e.target===n)return e.preventDefault(),s(t[0]);let i=e.key===`ArrowDown`?r<0?t[0]:t[r+1]:e.key===`ArrowUp`?r<=0?n:t[r-1]:null;i&&(e.preventDefault(),i.focus())}),e.append(n,r,i),a(),n.focus(),n.select()}},ut={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=_?.textContent??``},r=[m,h,g].flatMap(e=>{if(!e)return[];let t=document.createElement(`label`);t.className=`prb-palette-field`;let r=document.createElement(`span`),i=(e.getAttribute(`aria-label`)??``).replace(/^Filter by /,``);r.textContent=i.charAt(0).toUpperCase()+i.slice(1);let a=document.createElement(`select`);for(let t of e.options)a.append(new Option(t.text,t.value));return a.value=e.value,a.addEventListener(`change`,()=>{e.value=a.value,e.dispatchEvent(new Event(`change`,{bubbles:!0})),n()}),t.append(r,a),[t]});e.append(...r,t),n(),r[0]?.querySelector(`select`)?.focus()}};function dt(e){let t=()=>document.querySelector(`details[data-section="${e}"]`);return{available:()=>!!(t()&&!t().hidden),state:()=>{let e=t();return e&&!e.hidden?e.open?`Expanded`:`Collapsed`:null},run:()=>{let e=t();e&&(e.open=!e.open)}}}var ft=Object.fromEntries(l.map(e=>[`reviews.section.${e}`,dt(e)])),pt=xe(`reviews`,{...ft,"reviews.search":{available:()=>p!==null,panel:lt},"reviews.filters":{available:()=>m!==null,panel:ut},"reviews.next":{run:()=>U.move(1)},"reviews.previous":{run:()=>U.move(-1)},"reviews.open":{available:()=>U.enterOpens(),run:()=>U.open()},"reviews.openInNewTab":{available:()=>U.enterOpens(),run:()=>U.openInNewTab()},"reviews.menu":{available:()=>at()!==null,run:()=>{let e=at();e&&R.open(e,{focusFirst:!0,returnFocus:()=>U.refocus()})}}},{onOpen:()=>R.closeAll(),onSettle:()=>$()});function W(){return ue(d.filter(e=>E.has(e.dataset.id??``)),y)}function mt(){return W().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function G(e){C&&(C.textContent=e,C.hidden=!1)}function K(e){for(let t of b?.querySelectorAll(`button`)??[])t.disabled=e}async function ht(e){let t=[...E];if(t.length!==0){K(!0);try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok)return K(!1),G(`That could not be saved. The workspace server refused it.`)}catch{return K(!1),G(`The workspace server did not answer. It may have stopped.`)}gt(W(),e),K(!1),B(!1)}}function gt(e,t){let n=t?`complete`:`in-progress`,r=t?`in-progress`:`complete`;for(let t of e){t.dataset.status=n;let e=t.querySelector(`.prb-card-status`);e&&(e.dataset.status=n,e.textContent=ne(n));let i=t.querySelector(`[data-mark-status]`);i&&(i.dataset.markStatus=r,i.textContent=Ce(r))}}async function _t(e,t){try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:[e],complete:t})})).ok)return}catch{return}gt(d.filter(t=>t.dataset.id===e),t),M()}async function vt(e,t){let n;try{let r=await fetch(`/lifecycle`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,state:t})});n=r.ok?await r.json().catch(()=>null):null}catch{n=null}if(!n)return!1;let r=new Set(e);for(let e of d)r.has(e.dataset.id??``)&&(e.dataset.lifecycle=t,t===`active`?delete e.dataset.lifecycleAt:e.dataset.lifecycleAt=String(n.at),q(e));return I(n.queue),M(),!0}function q(e){let{stored:t,activity:n}=qe(e),i=e.querySelector(`[data-lifecycle-chip]`);if(i){let r=ge(Je(e),t,n);i.textContent=r??``,i.hidden=r===void 0}for(let i of e.querySelectorAll(`[data-lifecycle-set]`)){let e=i.dataset.lifecycleSet;i.hidden=!ee(e,t,n),i.textContent=r(e,t,n)}}async function yt(e){let t=[...E];if(t.length===0)return;K(!0);let n=await vt(t,e);if(K(!1),!n)return G(`That could not be saved. The workspace server refused it or did not answer.`);B(!1)}async function bt(){let e=[...E];if(e.length===0)return;K(!0);let t=null;try{let n=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e})});if(t=n.ok?await n.json().catch(()=>null):null,!t)return K(!1),V(),G(`Nothing was deleted. The workspace server refused it.`)}catch{return K(!1),V(),G(`The workspace server did not answer. It may have stopped.`)}let n=t.blocked??[],r=new Set(n.map(e=>e.id));for(let e of W())r.has(e.dataset.id??``)||e.remove();d=d.filter(e=>e.isConnected),E.clear();for(let e of r)E.add(e);if(K(!1),V(),n.length===0)return B(!1);M(),G([...new Set(n.map(e=>e.error))].join(` `))}async function xt(){let e=W().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;K(!0);let t=null;try{let n=await fetch(`/queue`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e,action:`add`})});t=n.ok?await n.json().catch(()=>null):null}catch{return K(!1),V(),G(`The workspace server did not answer. It may have stopped.`)}if(!t?.queue)return K(!1),V(),G(`Nothing was added. The workspace server refused it.`);I(t.queue);let n=t.refused??[];E.clear();for(let e of n)E.add(e.id);if(K(!1),V(),n.length===0)return B(!1);M(),G([...new Set(n.map(e=>e.error))].join(` `))}b?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-bulk-queue]`))return void xt();let n=t.closest(`[data-bulk-mark]`);if(n)return void ht(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void yt(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Ze&&(Ze.textContent=ce(mt())),S&&(S.hidden=!0),x&&(x.hidden=!1);return}if(t.closest(`[data-bulk-confirm-delete]`))return void bt();if(t.closest(`[data-bulk-cancel-delete]`))return V();if(t.closest(`[data-bulk-cancel]`))return B(!1)}),se(window,()=>window.location.reload());var J=`prb-fetch-summary`;function Y(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function St(e){return Me(Y(e),k)}function Ct(){for(let e of d){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!Ae(k,Y([e])))}}async function wt(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;k=(await e.json()).targets??{}}catch{return}Ct(),M()}async function Tt(e,t){let n=St(e);if(j||n.repositories===0)return;j=!0;let r=[O,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=De(n.repositories));let i=null;try{let e=await fetch(`/fetch-updates`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:n.ids})});e.ok&&(i=await e.json())}catch{}j=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Pe),M();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:ke(a)};if(a.moved>0||Z){try{window.sessionStorage.setItem(J,JSON.stringify(o))}catch{}if(!Q())return void window.location.reload();Z=!0}pe(ve(),o)}try{let e=window.sessionStorage.getItem(J);if(e){window.sessionStorage.removeItem(J);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&pe(ve(),{kind:t.kind,text:t.text})}}catch{}O?.addEventListener(`click`,()=>void Tt(W(),O)),wt();var Et=document.body.dataset.indexRevision??``,X=document.body.dataset.live===`true`?Date.now():0,Z=!1;function Q(){return E.size>0||document.activeElement===p||j||pt.isOpen()||ct}function $(){Z&&!Q()&&window.location.reload()}async function Dt(){try{let e=await fetch(`/revision`);if(e.ok){ye(document,!0);let t=await e.json();_e(document,t),t.live&&X===0&&(X=Date.now()),t.live||(X=0);let n=he(Et,t.revision??``,Q());if(n===`reload`)return void window.location.reload();n===`hold`&&(Z=!0)}}catch{ye(document,!1)}window.setTimeout(()=>void Dt(),je(X===0?2**53-1:Date.now()-X))}Dt(),p?.addEventListener(`blur`,$),document.addEventListener(`click`,()=>window.setTimeout($,0)),le();
@@ -1 +1 @@
1
- import{V as e,Y as t,a as n,c as r,t as i,u as a}from"./chunk-CXf6hwXL.js";function o(e,t){if(e===``)return null;try{let n=new URL(e);return n.origin===t&&/^\/r\/[^/]+$/.test(n.pathname)?n.href:null}catch{return null}}function s(e){let t=[...document.querySelectorAll(`[data-shutdown]`)],n=document.querySelector(`[data-shutdown-dialog]`),r=document.querySelector(`[data-shutdown-confirm]`);for(let e of t)e.addEventListener(`click`,()=>n?.showModal());document.querySelector(`[data-shutdown-cancel]`)?.addEventListener(`click`,()=>n?.close()),r?.addEventListener(`click`,()=>{r.disabled=!0,r.textContent=`Stopping…`,fetch(e,{method:`POST`}).then(e=>{if(!e.ok)throw Error(`Shutdown refused: ${e.status}`);n?.close(),c(t)}).catch(()=>{r.disabled=!1,r.textContent=`Stop server`})})}function c(e){document.body.dataset.serverStopped=`true`,r(document,`unreachable`);let t=document.createElement(`div`);t.className=`prb-stopped-notice`,t.setAttribute(`role`,`status`);let n=document.body.dataset.wayBack;t.textContent=n?`Workspace server stopped. This page is no longer being served. Run ${n} to bring it back.`:`Workspace server stopped. This page is no longer being served.`,document.body.prepend(t);for(let t of e)t.disabled=!0,t.classList.contains(`prb-strip-action`)||(t.textContent=`Server stopped`)}var l=[{id:`system`,label:`System`,help:`Follow your device setting`},{id:`light`,label:`Light`,help:`Always use light mode`},{id:`dark`,label:`Dark`,help:`Always use dark mode`}];function u(e){return l.some(t=>t.id===e)}function d(e){let t=e.querySelector(`[data-settings-theme]:checked`)?.value;return u(t)?t:void 0}function f(e,t){e.documentElement.dataset.theme=t}function p(e){for(let t of e.querySelectorAll(`[data-settings-theme]`))t.addEventListener(`change`,()=>{let t=d(e);t&&f(e,t)})}s(`/shutdown`),e(),a(`global`,{}),i(`/restart`);function m(){let e=document.querySelector(`[data-settings-back]`),t=o(document.referrer,window.location.origin);if(!e||t===null)return;e.href=t,e.textContent=``;let n=document.createElement(`span`);n.setAttribute(`aria-hidden`,`true`),n.textContent=`‹`,e.append(n,` Back to the review`)}m(),p(document);var h=document.querySelector(`[data-settings-save]`),g=document.querySelector(`[data-settings-status]`),_=document.querySelector(`[data-settings-port]`),v=document.querySelector(`[data-settings-port-error]`),y=document.querySelector(`[data-settings-agent]`);function b(){let e=document.querySelector(`[data-settings-usage]:checked`);return e?e.value===`on`:void 0}function x(e,t){g&&(g.textContent=e,g.dataset.kind=t)}function S(e){v&&(v.textContent=e??``),_&&(e?(_.setAttribute(`aria-invalid`,`true`),_.focus(),_.select()):_.removeAttribute(`aria-invalid`))}async function C(){if(!h)return;let e=b(),t=d(document),n={..._?{port:_.value.trim()}:{},...y?{agent:y.value}:{},...e===void 0?{}:{usageCounts:e},...t===void 0?{}:{theme:t}};h.disabled=!0,h.textContent=`Saving`;try{let e=await(await fetch(`/settings`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)})).json().catch(()=>null);if(!e){x(`Nothing was saved. The workspace server did not answer.`,`error`);return}if(e.error){S(e.error),x(`Nothing was saved.`,`error`);return}S(null),_&&(_.value=String(e.port.configured)),f(document,e.theme),x(e.restartRequired?`Saved. This page is served on port ${e.port.current}; the workspace moves to ${e.port.configured} the next time it starts.`:`Saved.`,`saved`)}catch{x(`Nothing was saved. The workspace server could not be reached.`,`error`)}finally{h.disabled=!1,h.textContent=`Save changes`}}h?.addEventListener(`click`,()=>void C()),n(),t(window,()=>window.location.reload());
1
+ import{V as e,X as t,a as n,c as r,t as i,u as a}from"./chunk-DqEA-C0S.js";function o(e,t){if(e===``)return null;try{let n=new URL(e);return n.origin===t&&/^\/r\/[^/]+$/.test(n.pathname)?n.href:null}catch{return null}}function s(e){let t=[...document.querySelectorAll(`[data-shutdown]`)],n=document.querySelector(`[data-shutdown-dialog]`),r=document.querySelector(`[data-shutdown-confirm]`);for(let e of t)e.addEventListener(`click`,()=>n?.showModal());document.querySelector(`[data-shutdown-cancel]`)?.addEventListener(`click`,()=>n?.close()),r?.addEventListener(`click`,()=>{r.disabled=!0,r.textContent=`Stopping…`,fetch(e,{method:`POST`}).then(e=>{if(!e.ok)throw Error(`Shutdown refused: ${e.status}`);n?.close(),c(t)}).catch(()=>{r.disabled=!1,r.textContent=`Stop server`})})}function c(e){document.body.dataset.serverStopped=`true`,r(document,`unreachable`);let t=document.createElement(`div`);t.className=`prb-stopped-notice`,t.setAttribute(`role`,`status`);let n=document.body.dataset.wayBack;t.textContent=n?`Workspace server stopped. This page is no longer being served. Run ${n} to bring it back.`:`Workspace server stopped. This page is no longer being served.`,document.body.prepend(t);for(let t of e)t.disabled=!0,t.classList.contains(`prb-strip-action`)||(t.textContent=`Server stopped`)}var l=[{id:`system`,label:`System`,help:`Follow your device setting`},{id:`light`,label:`Light`,help:`Always use light mode`},{id:`dark`,label:`Dark`,help:`Always use dark mode`}];function u(e){return l.some(t=>t.id===e)}function d(e){let t=e.querySelector(`[data-settings-theme]:checked`)?.value;return u(t)?t:void 0}function f(e,t){e.documentElement.dataset.theme=t}function p(e){for(let t of e.querySelectorAll(`[data-settings-theme]`))t.addEventListener(`change`,()=>{let t=d(e);t&&f(e,t)})}s(`/shutdown`),e(),a(`global`,{}),i(`/restart`);function m(){let e=document.querySelector(`[data-settings-back]`),t=o(document.referrer,window.location.origin);if(!e||t===null)return;e.href=t,e.textContent=``;let n=document.createElement(`span`);n.setAttribute(`aria-hidden`,`true`),n.textContent=`‹`,e.append(n,` Back to the review`)}m(),p(document);var h=document.querySelector(`[data-settings-save]`),g=document.querySelector(`[data-settings-status]`),_=document.querySelector(`[data-settings-port]`),v=document.querySelector(`[data-settings-port-error]`),y=document.querySelector(`[data-settings-agent]`);function b(){let e=document.querySelector(`[data-settings-usage]:checked`);return e?e.value===`on`:void 0}function x(e,t){g&&(g.textContent=e,g.dataset.kind=t)}function S(e){v&&(v.textContent=e??``),_&&(e?(_.setAttribute(`aria-invalid`,`true`),_.focus(),_.select()):_.removeAttribute(`aria-invalid`))}async function C(){if(!h)return;let e=b(),t=d(document),n={..._?{port:_.value.trim()}:{},...y?{agent:y.value}:{},...e===void 0?{}:{usageCounts:e},...t===void 0?{}:{theme:t}};h.disabled=!0,h.textContent=`Saving`;try{let e=await(await fetch(`/settings`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)})).json().catch(()=>null);if(!e){x(`Nothing was saved. The workspace server did not answer.`,`error`);return}if(e.error){S(e.error),x(`Nothing was saved.`,`error`);return}S(null),_&&(_.value=String(e.port.configured)),f(document,e.theme),x(e.restartRequired?`Saved. This page is served on port ${e.port.current}; the workspace moves to ${e.port.configured} the next time it starts.`:`Saved.`,`saved`)}catch{x(`Nothing was saved. The workspace server could not be reached.`,`error`)}finally{h.disabled=!1,h.textContent=`Save changes`}}h?.addEventListener(`click`,()=>void C()),n(),t(window,()=>window.location.reload());
package/static/shell.css CHANGED
@@ -1810,7 +1810,15 @@ a.prb-rail-item { text-decoration: none; }
1810
1810
  background: var(--brand);
1811
1811
  color: var(--on-brand);
1812
1812
  }
1813
+ /* Buddy's answer on a card of its own, so the log reads as turns: purple for the reviewer, a
1814
+ neutral card for Buddy. Raised as cards are, white on the pane in the light theme; in the dark
1815
+ one --surface-raised is the pane's own colour, so the border is what draws it, as for every
1816
+ card there. The corner it hangs from mirrors the question's. */
1813
1817
  .prb-msg-assistant {
1818
+ padding: 10px 14px;
1819
+ border: 1px solid var(--border);
1820
+ border-radius: 12px 12px 12px 2px;
1821
+ background: var(--surface-raised);
1814
1822
  color: var(--text-secondary);
1815
1823
  /* The assistant is asked to cite `path/to/file.rb:42`, and a long path is one unbreakable token.
1816
1824
  Without this the panel scrolls sideways and the citation is cut off mid-path — which breaks
@@ -3662,6 +3670,8 @@ a.prb-guide-pick { text-decoration: none; }
3662
3670
  box-shadow: 0 10px 28px var(--shadow-float);
3663
3671
  text-align: left;
3664
3672
  }
3673
+ /* Above the trigger, the same gap away, when the whole panel would not show below it (menu.ts). */
3674
+ .prb-menu-panel[data-menu-placement='above'] { top: auto; bottom: 30px; }
3665
3675
  .prb-menu-item {
3666
3676
  display: block;
3667
3677
  width: 100%;
@@ -5622,6 +5632,7 @@ body .prb-body[data-focus='buddy'] .prb-msg-user { max-width: min(90%, 78ch); }
5622
5632
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);
5623
5633
  color: var(--pane-ink);
5624
5634
  }
5635
+ .prb-doc .prb-ask-buddy-panel[data-menu-placement='above'] { top: auto; bottom: 28px; }
5625
5636
  .prb-doc .prb-ask-buddy-panel .pr-helper-selection-menu-item {
5626
5637
  display: block;
5627
5638
  width: 100%;
@@ -5817,6 +5828,14 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
5817
5828
  .prb-notification[data-keyboard-current] .prb-notification-open { box-shadow: inset 0 0 0 2px var(--brand-hover); border-radius: 9px; }
5818
5829
  .prb-notification[data-keyboard-current] a.prb-notification-open:focus-visible { outline: none; }
5819
5830
 
5831
+ /* A review's Issues and Questions cursor, the same ring on the card's own border, in the pane's
5832
+ focus colour: the pane is light in both themes. The card itself holds focus while the ring is on
5833
+ it, so the ring is its focus indicator. The scroll margin keeps a card J or K brings on screen
5834
+ off the pane's edge, and clear of the feedback tray while there is one at the foot. */
5835
+ .prb-doc [data-finding-card] { scroll-margin-block: 16px; }
5836
+ .prb-doc [data-finding-card][data-keyboard-current] { outline: 2px solid var(--pane-accent); outline-offset: -1px; }
5837
+ .prb-body[data-feedback-selecting] .prb-doc [data-finding-card] { scroll-margin-block-end: 88px; }
5838
+
5820
5839
  /* The palette's modes (Search and Filters on the Reviews list): a field or two under the trail,
5821
5840
  and what they find. Same tokens as the palette rows, so a mode reads as the palette, not a form. */
5822
5841
  .prb-palette-body { display: flex; flex-direction: column; gap: 8px; padding-top: 10px; }
@@ -5877,6 +5896,66 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
5877
5896
  }
5878
5897
  .prb-palette-prompt[data-enter-target] { background: var(--surface-2); }
5879
5898
 
5899
+ /* Add review (⌘P P, ⌘P B): a palette mode with more to show than a search, so the palette is wider
5900
+ while it holds one. Rows say what each pasted link will do; the options stay folded unless there
5901
+ is a question in them. */
5902
+ .prb-palette:has(.prb-addreview) { width: min(600px, calc(100vw - 32px)); max-height: min(86vh, 760px); }
5903
+ .prb-addreview { display: flex; flex-direction: column; gap: 8px; }
5904
+ .prb-addreview-mode { margin: 0 2px; color: var(--text-secondary); font-size: var(--t-meta); font-weight: 600; }
5905
+ .prb-addreview-label { margin: 0 2px; color: var(--text-secondary); font-size: var(--t-micro); font-weight: 600; }
5906
+ .prb-addreview-paste { resize: vertical; min-height: 5.5em; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace; font-size: var(--t-meta); }
5907
+ .prb-addreview-rows { display: flex; flex-direction: column; gap: 6px; max-height: 32vh; margin: 0; padding: 0; overflow: auto; list-style: none; }
5908
+ .prb-addreview-rows:empty { display: none; }
5909
+ .prb-addreview-row { display: flex; flex-direction: column; gap: 3px; padding: 6px 8px; border-radius: 6px; background: var(--surface); }
5910
+ .prb-addreview-row-head { display: flex; align-items: baseline; gap: 8px; font-size: var(--t-meta); font-weight: 600; }
5911
+ .prb-addreview-mark { flex: none; width: 1em; text-align: center; color: var(--success); }
5912
+ .prb-addreview-row[data-state='problem'] .prb-addreview-mark { color: var(--danger); }
5913
+ .prb-addreview-status { padding-left: calc(1em + 8px); font-size: var(--t-micro); }
5914
+ .prb-addreview-muted { color: var(--text-muted); }
5915
+ .prb-addreview-problem { color: var(--danger-ink); }
5916
+ .prb-addreview-path { padding-left: calc(1em + 8px); color: var(--text-muted); font-size: var(--t-micro); font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace; }
5917
+ .prb-addreview-row .prb-addreview-folder { margin-left: calc(1em + 8px); width: calc(100% - 1em - 8px); }
5918
+ .prb-addreview-link { color: inherit; }
5919
+ .prb-addreview-control {
5920
+ min-width: 0;
5921
+ padding: 5px 8px;
5922
+ border: 1px solid var(--border);
5923
+ border-radius: 6px;
5924
+ background: var(--surface);
5925
+ color: var(--text-primary);
5926
+ font: inherit;
5927
+ font-size: var(--t-meta);
5928
+ }
5929
+ .prb-addreview-control:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -1px; }
5930
+ .prb-addreview-options summary { cursor: pointer; color: var(--text-secondary); font-size: var(--t-micro); font-weight: 600; }
5931
+ .prb-addreview-grid { display: grid; grid-template-columns: max-content 1fr; align-items: center; gap: 6px 12px; margin: 8px 0 0; }
5932
+ .prb-addreview-key { color: var(--text-muted); font-size: var(--t-micro); }
5933
+ .prb-addreview-facts dd { margin: 0; font-size: var(--t-meta); overflow-wrap: anywhere; }
5934
+ .prb-addreview-kept { color: var(--text-muted); font-size: var(--t-micro); }
5935
+ .prb-addreview-detected:empty { display: none; }
5936
+ .prb-addreview-pathrow { display: flex; gap: 6px; }
5937
+ .prb-addreview-pathrow .prb-palette-input { flex: 1; }
5938
+ .prb-addreview-browse,
5939
+ .prb-addreview-start {
5940
+ flex: none;
5941
+ padding: 6px 12px;
5942
+ border: 1px solid var(--border);
5943
+ border-radius: 8px;
5944
+ background: var(--surface);
5945
+ color: var(--text-primary);
5946
+ font: inherit;
5947
+ font-size: var(--t-meta);
5948
+ cursor: pointer;
5949
+ }
5950
+ .prb-addreview-start { border-color: var(--brand); background: var(--brand); color: var(--on-brand); font-weight: 600; }
5951
+ .prb-addreview-start:disabled { opacity: 0.5; cursor: default; }
5952
+ .prb-addreview-browse:focus-visible,
5953
+ .prb-addreview-start:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
5954
+ /* Pinned to the bottom of the palette as the rows scroll, so the button Enter presses is always in sight. */
5955
+ .prb-addreview-footer { position: sticky; bottom: -12px; display: flex; justify-content: flex-end; margin: 0 -12px -12px; padding: 8px 12px 12px; background: var(--surface-raised); }
5956
+ .prb-addreview-error { margin: 0 2px; color: var(--danger-ink); font-size: var(--t-micro); }
5957
+ .prb-addreview-recent { max-height: 30vh; }
5958
+
5880
5959
  /* ── Feedback selection ──
5881
5960
  Choosing the Issues and Questions to raise with the author. The checkboxes ship on every card
5882
5961
  and show only while the body carries the mode, so entering it is a stylesheet change, as the
@@ -5969,6 +6048,11 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
5969
6048
  .prb-selection-button:disabled { opacity: 0.5; cursor: default; }
5970
6049
  .prb-selection-primary { border-color: var(--pane-accent); background: var(--pane-accent); color: #fff; font-weight: 600; }
5971
6050
  .prb-selection-primary:hover:not(:disabled) { color: #fff; border-color: var(--pane-accent-ink); background: var(--pane-accent-ink); }
6051
+ /* A button's own key, drawn after its word (command_layer.ts paintHints): in the button's colour,
6052
+ quieter, so it reads as a hint on the action rather than a second label. */
6053
+ .prb-key-hint { margin-left: 8px; font: inherit; font-size: 0.85em; font-weight: 400; opacity: 0.75; white-space: nowrap; }
6054
+ /* Copy Markdown is a flex row with a 6px gap already; together they make the tray's 8px. */
6055
+ .prb-draft-dialog .pr-helper-msg-copy .prb-key-hint { margin-left: 2px; }
5972
6056
  /* "2 selected" under Issues or Questions in the rail: the selection is a place's contents too. */
5973
6057
  .prb-rail-selected { display: block; font-size: var(--t-micro); color: var(--text-muted); }
5974
6058
  .prb-rail-selected[hidden] { display: none; }
@@ -1244,6 +1244,8 @@
1244
1244
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
1245
1245
  text-align: left;
1246
1246
  }
1247
+ /* Above the trigger when the whole panel would not show below it (menu.ts). */
1248
+ .pr-helper-extension .prb-ask-buddy-panel[data-menu-placement='above'] { top: auto; bottom: 26px; }
1247
1249
  /* The card whose menu is open comes forward. A dismissed card's opacity makes it its own layer,
1248
1250
  where the panel's z-index counts only inside the card: the next card's Copy and sparkle painted
1249
1251
  across the open menu, and the menu was drawn faded. */