prreviewbuddy 0.63.0 → 0.69.1
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/CHANGELOG.md +152 -0
- package/dist/{delete_review-CeJo9t7h.js → delete_review-CRPRIRKg.js} +7115 -6620
- package/dist/main.js +2 -328
- package/dist/server.js +1010 -137
- package/package.json +1 -1
- package/static/chunk-2P5KTb9d.js +1 -0
- package/static/chunk-C8kkSv38.js +1 -0
- package/static/help.js +1 -1
- package/static/notifications.js +1 -1
- package/static/reviews.js +1 -1
- package/static/settings.js +1 -1
- package/static/shell.css +265 -22
- package/static/sidebar.css +2 -0
- package/static/workspace.js +83 -77
- package/static/chunk-BadSI8AL.js +0 -1
- package/static/chunk-CxNfDBSA.js +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prreviewbuddy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.69.1",
|
|
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
|
+
function e(e,t){e.addEventListener(`pageshow`,e=>{e.persisted&&t()})}var t=`prbNav`,n=`prb-workspace`,r=`prb-nav-session`,i=`prb-nav-head`,a=`prb-nav-handoff`,o=`prb-nav-places`,s=`unstored`;function c(e){if(!e||typeof e!=`object`)return null;let n=e[t];if(!n||typeof n!=`object`)return null;let{v:r,owner:i,session:a,idx:o,id:s,ui:c}=n;if(r!==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:r,owner:i,session:a,idx:o,...typeof s==`string`&&s!==``?{id:s}:{},ui:l}}function l(e){if(!e||typeof e!=`object`)return{};let{[t]:n,...r}=e;return r}function u(e,t){if(!e||typeof e!=`object`)return!1;let n=e;return n.owner===`prb-workspace`&&n.session===t}function d(e,t){try{return e?.getItem(t)??null}catch{return null}}function f(e,t,n){try{n===null?e?.removeItem(t):e?.setItem(t,n)}catch{}}function p(e){let{history:p,storage:m,location:h}=e,g=e.navigation??null,_=[],v=null,y=null,b=null,x=t=>{b!==null&&e.clearTimeout(b),b=t?t():null,e.capturePending(b!==null)},S=null,C=(()=>{if(!m)return s;let t=d(m,r);if(t)return t;let n=e.uuid();return f(m,r,n),d(m,r)===n?n:s})(),w=()=>`${h.pathname}${h.search}`,T=e=>`${w()}${e}`,E=()=>{try{g?.updateCurrentEntry({state:{owner:n,session:C}})}catch{}},D=()=>{for(let e of _)e()},O=(e,t)=>{t===void 0?p.replaceState(e,``):p.replaceState(e,``,t),E()},k=()=>Number(d(m,i)??0)||0,A=()=>{try{let e=JSON.parse(d(m,o)??`{}`);return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch{return{}}},j=(e,t)=>{if(!e||!m)return;let n=A();delete n[e],n[e]=t;let r=Object.keys(n);for(let e of r.slice(0,Math.max(0,r.length-200)))delete n[e];f(m,o,JSON.stringify(n))},ee=e=>{if(!e)return null;let t=e.id?A()[e.id]:void 0;return t&&typeof t==`object`&&!Array.isArray(t)?t:e.ui},M=()=>{if(!v)return null;try{return v()}catch{return null}},N=()=>{let r=c(p.state);if(r&&r.session===C&&r.id){S=r.id,E();return}let o=r?.idx??0;if(!r){let t=d(m,a);f(m,a,null),o=0;try{let n=t?JSON.parse(t):null,r=e.referrer!==``&&new URL(e.referrer).origin===h.origin;n&&r&&n.session===C&&typeof n.idx==`number`&&typeof n.at==`number`&&e.now()-n.at<15e3&&(o=n.idx+1)}catch{o=0}f(m,i,String(o))}let s=r?.id??e.uuid();S=s;let u={v:1,owner:n,session:C,idx:o,id:s,ui:r?.ui??null};O({...l(p.state),[t]:u})},P=()=>c(p.state)??{v:1,owner:`prb-workspace`,session:C,idx:0,ui:null},F=()=>{b!==null&&x(null);let e=M();if(!e||!S)return;let n=JSON.stringify(e),r=c(p.state);if(!r||r.id!==S){j(S,e);return}(n!==y||JSON.stringify(r.ui)!==n)&&(y=n,j(S,e),O({...l(p.state),[t]:{...r,ui:e}}))},I=e=>{if(g){let t=g.currentEntry?.index;if(typeof t!=`number`||t<0)return!1;let n=g.entries()[t+e];if(!n)return!1;try{return u(n.getState(),C)}catch{return!1}}let t=c(p.state);return!t||t.session!==C||p.length<2?!1:e===-1?t.idx>0:t.idx<k()};N();try{p.scrollRestoration=`manual`}catch{}return{session:C,current(){return{route:l(p.state),ui:ee(c(p.state))}},push(r,a){if(r!==``&&!r.startsWith(`#`))throw Error(`Workspace history pushes within this document only; "${r}" is not a fragment.`);if(T(r)===`${w()}${h.hash}`)return!1;F();let o=P().idx+1;f(m,i,String(o));let s=e.uuid(),c={v:1,owner:n,session:C,idx:o,id:s,ui:null};return S=s,p.pushState({...l(a),[t]:c},``,T(r)),y=null,E(),D(),!0},replace(e,n){if(e!==``&&!e.startsWith(`#`))throw Error(`Workspace history replaces within this document only; "${e}" is not a fragment.`);O({...l(n),[t]:P()},T(e))},setCapturer(e){v=e},captureNow:F,scheduleCapture(){x(()=>e.setTimeout(F,250))},leaving(){F(),f(m,a,JSON.stringify({session:C,idx:P().idx,at:e.now()}))},canGoBack:()=>I(-1),canGoForward:()=>I(1),back(){return I(-1)?(F(),p.back(),!0):!1},forward(){return I(1)?(F(),p.forward(),!0):!1},moved(){b!==null&&x(null);let e=M();e&&j(S,e),y=null,S=c(p.state)?.id??null;let t=c(p.state);!t||!t.id||t.session!==C?N():E(),D()},onAvailability(e){_.push(e)}}}function m(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function h(e){let t=e?.userAgentData?.platform??e?.platform??``;return/mac|iphone|ipad/i.test(t)}var g=[`checkbox`,`radio`,`button`,`submit`,`reset`].map(e=>`:not([type="${e}"])`).join(``);function _(e){if(!e||typeof e.closest!=`function`)return!1;let t=e;return t.isContentEditable?!0:t.closest(`input${g}, textarea, select, [contenteditable=""], [contenteditable="true"]`)!==null}function v(e,t,n){if(e.defaultPrevented||e.isComposing)return null;let r=t?e.metaKey:e.ctrlKey,i=t?e.ctrlKey:e.metaKey;if(!r||i||e.altKey||e.shiftKey)return null;let a=e.key===`[`||e.key!==`]`&&e.code===`BracketLeft`?`back`:e.key===`]`||e.code===`BracketRight`?`forward`:null;return!a||_(e.target)||n.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)?null:a}var y=[`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 b(e){if(e.id)return{attrs:[[`id`,e.id]]};let t=y.filter(t=>e.hasAttribute(t)).map(t=>[t,e.getAttribute(t)??``]);return t.length>0?{attrs:t}:null}function x(e,t){if(!e||e===t||!t.contains(e))return null;let n=[],r=e;for(;r&&r!==t&&n.length<3;){let t=b(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 S(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&&y.concat(`id`).includes(e[0])&&typeof e[1]==`string`)}function C(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 w(e,t){let n=t.attrs?`[${t.attrs[0][0]}]`:t.tag;for(let r of e.querySelectorAll(n))if(C(r,t))return r;return null}function T(e,t){if(!Array.isArray(t)||t.length===0||!t.every(S))return null;let n=null,r=e;for(let e of t){let t=w(r,e);if(!t)return n;n=t,r=t}return n}function E(e,t){let n=T(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 D(e,t){let n=e?.[t];return typeof n==`number`&&Number.isFinite(n)&&n>=0?n:null}function O(e,t){let n=e?.[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function k(e){try{return e.sessionStorage}catch{return null}}function A(e,t){let n=e===`back`?`[`:`]`;return`${e===`back`?`Back`:`Forward`} (${t?`⌘${n}`:`Ctrl+${n}`})`}function j(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 ee(e,t){let n=e.querySelector(`[data-nav-announce]`);!n||!t||(n.textContent=``,e.defaultView?.setTimeout(()=>{n.textContent=t},50))}function M(e={},t=window,n=document){let r=t.navigation??null,i=p({history:t.history,navigation:r,storage:k(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=h(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=A(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=v(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||!m(e)||e.defaultPrevented||j(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:x(n.activeElement,n.body)}));let{ui:t}=i.current(),r=D(t,`main`);e&&r!==null&&(e.scrollTop=r),t&&E(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 te=[`created`,`updated`,`merged`,`closed`,`reopened`];function ne(e){return re({at:Number(e.activityAt),kind:e.activityKind,...e.activityMovedAt===void 0?{}:{movedAt:Number(e.activityMovedAt)}})}function re(e){if(typeof e!=`object`||!e)return;let{at:t,kind:n,movedAt:r}=e;if(!(typeof t!=`number`||!Number.isFinite(t)||!te.includes(n)))return{at:t,kind:n,...typeof r==`number`&&Number.isFinite(r)?{movedAt:r}:{}}}function ie(e,t){return!e||e.state===`waiting`&&ae(e,t)?`active`:e.state}function L(e,t){if(!e||!t)return;if(e.state===`waiting`)return ae(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 ae(e,t){return t!==void 0&&t.kind!==`created`&&t.at>e.at}function oe(e,t,n){return L(t,n)!==void 0||e!==(t?.state??`active`)}function se(e,t,n){return e===`done`&&t?.state===`done`&&L(t,n)!==void 0?`Keep done`:F(e)}var R=[`pinned`,`active`,`waiting`,`done`],ce=e=>N.find(t=>t.id===e).name,le={pinned:{title:`Pinned`,key:`p`},active:{title:ce(`active`),key:`a`},waiting:{title:ce(`waiting`),key:`w`},done:{title:ce(`done`),key:`d`}};function ue(e){return typeof e==`string`&&R.includes(e)}function de(e,t,n,r){return e&&!pe(r)?`pinned`:ie(t,n)}function fe(e,t){let n=e=>R.indexOf(t(e));return[...e].sort((e,t)=>n(e)-n(t))}function pe(e){return e===`queue`}function me(e,t,n){return e?I(t,n)?.text:L(t,n)}var he=[`all`,`queue`,`in-progress`,`complete`],ge=[`any`,`open`,`merged`,`closed`],_e=[`q`,`f`,`by`,`pr`,`page`];function ve(e,t){let n=`${e} review${e===1?``:`s`}`;return e===t?n:`${n} · ${t} branch${t===1?``:`es`}`}function ye(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 be(){return{pinned:15,active:15,waiting:15,done:15}}function xe(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`f`)??``,r=t.get(`pr`)??``,i=new URLSearchParams;for(let[e,n]of t)!_e.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:he.includes(n)?n:`all`,author:t.get(`by`)??``,pr:ge.includes(r)?r:`any`,...a===``?{}:{extra:a}}}function Se(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??``))_e.includes(n)||t.append(n,r);let n=t.toString();return n===``?``:`#${n}`}function Ce(e,t){return t===`all`||t===`queue`?!0:t===`in-progress`?e.status!==`complete`:e.status===t}function we(e,t){return t===`any`||e.prState===t}function Te(e,t){return t===``||e===t}function Ee(e){return e===`complete`?`Mark reviewed`:`Mark not reviewed`}function De(e){return e?`Unpin review`:`Pin review`}function Oe(e){return e?`Remove from review queue`:`Add to review queue`}function ke(e,t){let n=t.query.trim().toLowerCase();return Ae(e.filter(e=>(!n||e.searchText.includes(n))&&Ce(e,t.filter)&&Te(e.author,t.author)&&we(e,t.pr)),t.filter)}function Ae(e,t){return pe(t)?e.filter(e=>e.queue!==void 0).sort((e,t)=>(e.queue??0)-(t.queue??0)):e}function je(e){return e===0?`Queue`:`Queue (${e})`}function Me(e){return e===`complete`?`Reviewed`:e===`in-progress`?`Not reviewed`:`New`}function Ne(e,t){if(e===0)return`Nothing selected`;let n=`${e} selected`;return t>0?`${n} · ${t} not shown`:n}function Pe(e){return e===0?`Select all`:`Select all ${e}`}function Fe(e){return e===0?`Delete`:`Delete ${e} review${e===1?``:`s`}`}function Ie(e){return`${Fe(e)}?`}function Le(e,t,n){return e===``||t===``||t===e?`wait`:n?`hold`:`reload`}var Re=[{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}:{}}),ze=e=>({kind:`key`,key:e,primary:!0}),Be=R.map(e=>({id:`reviews.section.${e}`,label:`${le[e].title} section`,group:`reviews`,page:`reviews`,binding:z(`l`,le[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`)},...Be,{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:`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:ze(`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:ze(`Enter`),hint:`[data-feedback-prepare]`,showHint:!0},{id:`review.feedback.copyDraft`,label:`Copy the feedback draft`,group:`findings`,page:`review`,binding:ze(`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`)}],Ve=[{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 He(e,t=V){return t.filter(t=>t.page===`global`||t.page===e)}function Ue(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:Ve.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 He(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 We(e){return He(e).filter(e=>e.binding.kind===`key`)}var Ge=new Set([`Shift`,`Control`,`Alt`,`Meta`,`CapsLock`,`Fn`,`AltGraph`,`OS`]);function Ke(e){return Ge.has(e.key)}function qe(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 Je=new Set(V.flatMap(e=>e.binding.kind===`combo`?[e.binding.key]:[]));function Ye(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=qe(e);return i!==null&&Je.has(i)?i:null}function Xe(e){return V.find(t=>t.binding.kind===`combo`&&t.binding.key===e)}function Ze(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?qe(t)===e.key:t.key===e.key}function Qe(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 $e={Escape:`Esc`,Enter:`Enter`,"\\":`\\`," ":`Space`};function H(e){return $e[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=Ve.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 et(e,t){return e.kind===`chord`?W(e.keys,t):[G(e,t)]}function tt(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 nt(e){return Re.map(t=>({group:t.id,label:t.label,rows:V.filter(e=>e.group===t.id).map(t=>({id:t.id,keys:et(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 rt(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 it(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 at(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 ot(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),at(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 st=/https?:\/\/[^\s<>()"'`]+/gi,ct=/^https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)(?:[/?#]|$)/i,lt=/^https?:\/\/([^/]+)\/((?:[^/?#]+\/)+?)(?:-\/)?merge_requests\/(\d+)(?:[/?#]|$)/i,ut=/^https?:\/\/(?:www\.)?bitbucket\.org\/([^/?#]+)\/([^/?#]+)\/pull-requests\/(\d+)(?:[/?#]|$)/i;function dt(e){let t=e.replace(/[.,;:!?)\]]+$/,``),n=ct.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=ut.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=lt.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 ft(e){let t=[],n=new Set;for(let r of e.matchAll(st)){let e=dt(r[0]);!e||n.has(e.key)||(n.add(e.key),t.push(e))}return t}function pt(e){return`${e} isn't supported yet`}function mt(e){return e.model?`Keeps its original agent and model: ${e.agent}, ${e.model}`:`Keeps its original agent: ${e.agent}`}var ht={waiting:`Waiting`,reviewing:`Reviewing`,"already-reviewed":`Already reviewed`,ready:`Ready`,failed:`Failed`},gt=250,_t=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 vt(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())},_t)};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 yt(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 bt(e){let t=Y(e,`button`,`prb-addreview-start`);return t.type=`button`,t.setAttribute(`data-addreview-start`,``),t}function xt(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=yt(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=bt(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(mt(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?`${ht[t.status]}: ${t.reason}`:ht[t.status],t.status===`failed`?`problem`:`muted`)),t.kept&&n.append(D(mt(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} ${ht[e].toLowerCase()}`)].join(` · `)},j=()=>{let e=ft(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:pt(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()}},gt))},ee=e=>{y=vt(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(),ee(t.value.batchId)}};return a.addEventListener(`input`,j),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 St(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=yt(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=bt(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`,mt(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=vt(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()},gt)};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 Ct(e){return e.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)!==null}function wt(e){for(let t of e.children)return t.kind===`leaf`?t.command.group:wt(t);return`global`}function Tt(e,t,n={}){let r=n.win??window,i=n.doc??document,a=n.isMac??h(r.navigator),o=Qe(Ue(e)),s=null,c=e=>{let t=i.querySelector(`a[href="${e}"]:not([target])`);t?t.click():r.location.assign(e)},l=ot(i,nt(a),`${U(a)} opens the command palette and ${U(a,`p`)} adds a review, from anywhere in the workspace. Single keys never act while you are typing.`,()=>n.onSettle?.()),u={"palette.open":{run:()=>w()},"add.open":{run:()=>w([`p`])},"add.pullRequest":{panel:xt(i)},"add.branch":{panel:St(i)},"navigate.reviews":{run:()=>c(`/`)},"navigate.notifications":{run:()=>c(`/notifications`)},"help.shortcuts":{run:()=>l.open()}},d=e=>u[e.id]??t[e.id],f=(e,t)=>{let n=d(e);return!!n&&(n.available?.(t)??!0)},p=null,m=`back`,g=[],v=()=>{p?.(),p=null},y=(e=`dismissed`)=>{v(),o.reset(),b.close();let t=s;s=null,t?.isConnected&&t.focus(),e===`dismissed`&&n.onSettle?.()},b=rt(i,e=>T(e),y),x=We(e).map(e=>({keys:G(e.binding,a),label:e.label})),S=Object.fromEntries(Re.map(e=>[e.id,e.label])),C=()=>{let e=o.at;if(!e)return;let t=e.children.map(e=>e.kind===`leaf`?{key:e.key,keyLabel:e.key.toUpperCase(),label:d(e.command)?.label?.()??e.command.label,namespace:!1,available:f(e.command),group:e.command.group,state:d(e.command)?.state?.()??null}:{key:e.key,keyLabel:e.key.toUpperCase(),label:e.label,namespace:!0,available:!0,group:wt(e)}),n=o.path.length===0?Re.flatMap(e=>t.filter(t=>t.group===e.id)):t;b.show({trail:W(o.path,a),title:e.label,rows:n,groupLabels:o.path.length===0?S:null,footer:x})};function w(e=[]){if(b.isOpen())return y();n.onOpen?.();let t=i.activeElement;s=t instanceof HTMLElement&&t!==i.body?t:null,o.start(e),C()}function T(e){let t=o.press(e);if(t.kind===`descend`)return C();let n=t.kind===`run`&&f(t.command)?d(t.command):null;if(n?.panel&&t.kind===`run`)return E(t.command,n.panel);y(n?`running`:`dismissed`),n?.run?.()}function E(e,t){g=e.binding.kind===`chord`?e.binding.keys.slice(0,-1):[],m=t.escape??`back`;let n=e.binding.kind===`chord`?W(e.binding.keys,a):[U(a)];p=b.showPanel(n,t,()=>y(`running`))}function D(){v(),o.start();for(let e of g)o.press(e);C()}let O=We(e);return r.addEventListener(`keydown`,e=>{if(b.isOpen()){if(Ke(e))return;let t=()=>{e.preventDefault(),e.stopPropagation()};if(p)return e.key===`Escape`&&!e.isComposing?(t(),m===`close`?y():D()):Ye(e,a)?(t(),y()):void 0;if(e.key===`Escape`||Ye(e,a))return t(),y();if([`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){t(),it(b.dialog,e.key,i.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(qe(e)??``);return}if(e.defaultPrevented||e.isComposing)return;let t=Ye(e,a),n=t?Xe(t):void 0;if(n){if(i.querySelector(`dialog[open]`))return;e.preventDefault(),e.stopPropagation(),d(n)?.run?.(e);return}for(let t of O){if(!Ze(t.binding,e,a))continue;let n=t.within;if(n){if(!i.querySelector(n)?.matches(`[open]`))continue}else if(t.binding.kind===`key`&&t.binding.key!==`Escape`&&(_(e.target)||Ct(i)))continue;if(f(t,e)){e.preventDefault(),d(t).run?.(e);return}}},!0),r.addEventListener(`pagehide`,()=>{b.isOpen()&&y(`unloading`)}),Et(i,e,a),{isOpen:()=>b.isOpen()||l.isOpen(),close:()=>y()}}function Et(e,t,n){for(let r of He(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=tt(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 Dt(e){return`${e} more`}function Ot(e){return e===0?`Nothing unread`:`${e} unread`}function kt(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=kt(t))}function At(e,t){let n=e.querySelector(`[data-server-status]`);!n||n.dataset.serverStatus===`restarting`||Q(e,t?`running`:`unreachable`)}var jt=6e3,Mt=5e3;function Nt(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 Pt(e,t,n=window){return Ft(e,{kind:t.kind,text:t.text},n)}function Ft(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(),jt),l=()=>n.clearTimeout(c),u=()=>{n.clearTimeout(c),c=n.setTimeout(()=>i.remove(),jt)};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 It(e,t,n=window){return Ft(e,{kind:t.tone,text:t.headline,href:`/notifications/open?id=${encodeURIComponent(t.id)}`,link:`Open`},n)}function Lt(e,t,n=window){return Ft(e,{kind:`more`,text:Dt(t),href:`/notifications`,link:`View all`},n)}function Rt(e=document,t=window){let n=Number(e.body.dataset.notificationsSince);if(!Number.isFinite(n)||n<=0)return;let r=Nt(e),i=async()=>{try{let i=await t.fetch(`/notifications/recent?after=${n}`);if(At(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())It(r,n,t);typeof e.more==`number`&&e.more>0&&Lt(r,e.more,t)}}catch{At(e,!1)}t.setTimeout(()=>void i(),Mt)};t.setTimeout(()=>void i(),Mt)}function zt(e,t){if(typeof t==`number`)for(let n of e.querySelectorAll(`[data-unread-count]`))n.dataset.unreadStyle===`rail`&&(n.textContent=t===0?``:Ot(t)),n.hidden=t===0}function Bt(e,t){zt(e,t.unread),typeof t.driving==`boolean`&&Vt(e,t.driving)}function Vt(e,t){let n=e.querySelector(`[data-restart]`),r=e.querySelector(`[data-restart-note]`);n&&(n.disabled=t),r&&(r.hidden=!t)}var Ht=`prb-server-restarted`;function Ut(e=document,t=window){let n=null;try{n=t.sessionStorage.getItem(Ht),t.sessionStorage.removeItem(Ht)}catch{}n!==null&&Pt(Nt(e),{kind:`ready`,text:`Server restarted. Workspace is back online.`},t)}var Wt=2e4,Gt=300;function Kt(e){Ut();let t=document.querySelector(`[data-restart]`),n=document.querySelector(`[data-restart-note]`);t&&t.addEventListener(`click`,()=>{t.disabled=!0,qt(e,t,n)})}async function qt(e,t,n){let r,i=null;try{let a=await fetch(e,{method:`POST`});if(a.status===409){Vt(document,!0);return}if(!a.ok)return void $(t,n,await tn(a));let o=await a.json();r=typeof o.startedAt==`number`?o.startedAt:null,i=$t(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 Zt(Number(new URL(i).port)))return void window.location.assign(i)}else if(await Jt(r)){try{window.sessionStorage.setItem(Ht,`1`)}catch{}window.location.reload();return}if(delete document.body.dataset.restarting,await en()){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 Jt(e){let t=Date.now()+Wt;for(;Date.now()<t;){await new Promise(e=>setTimeout(e,Gt));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 Yt=4,Xt={now:()=>Date.now(),sleep:e=>new Promise(t=>setTimeout(t,e))};async function Zt(e,t=()=>Qt(e),n=Xt){let r=n.now()+Wt,i=0;for(;n.now()<r;){await n.sleep(Gt);let e=await t();if(e===`moved`||(i=e===`gone`?i+1:0,i>=Yt))return!0}for(let e=0;e<Yt;e+=1){let e=await t();if(e!==`gone`)return e===`moved`;await n.sleep(Gt)}return!0}async function Qt(e){try{let t=await fetch(`/health`,{cache:`no-store`});return t.ok&&(await t.json()).movedTo===e?`moved`:`here`}catch{return`gone`}}function $t(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 en(){try{return(await fetch(`/health`,{cache:`no-store`})).ok}catch{return!1}}async function tn(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{ye as A,ee as B,ue as C,Oe as D,De as E,se as F,m as G,x as H,I,l as J,D as K,oe as L,Ne as M,Me as N,je as O,ne as P,re as R,be as S,xe as T,_ as U,M as V,h as W,e as X,O as Y,Ie as _,Rt as a,fe as b,Q as c,at as d,nt as f,Fe as g,ve as h,Pt as i,Pe as j,Le as k,Ot as l,me as m,Bt as n,Nt as o,R as p,E as q,zt as r,At as s,Kt as t,Tt as u,ke as v,Ee as w,de as x,Se as y,P as z};
|
|
@@ -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};
|
package/static/help.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{V as e,W as t,X as n,d as r,f as i,t as a,u as o}from"./chunk-2P5KTb9d.js";e(),o(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(r(document,i(t(navigator)))),a(`/restart`),n(window,()=>window.location.reload());
|
package/static/notifications.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as e,
|
|
1
|
+
import{V as e,X as t,l as n,r,t as i,u as a}from"./chunk-2P5KTb9d.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-CxNfDBSA.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?`★`:`☆`,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,H as i,K as a,L as o,M as s,N as c,O as ee,P as te,S as l,T as ne,V as re,X as ie,Y as ae,_ as oe,a as se,b as ce,g as le,h as ue,i as de,j as fe,k as pe,m as me,n as he,o as ge,p as u,q as _e,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-2P5KTb9d.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-C8kkSv38.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?`★`:`☆`,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:i(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(ae(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 i=a(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),_e(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=re({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:te(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=ne(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=ce(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=ue(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=ne(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=ee(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=s(D.size,n)),T&&(T.textContent=fe(e.length),T.disabled=e.every(e=>D.has(e.dataset.id??``))),Je&&(Je.textContent=le(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 ce(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=c(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=me(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=!o(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=oe(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)}),ie(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}de(ge(),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`&&de(ge(),{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();he(document,t),t.live&&Z===0&&(Z=Date.now()),t.live||(Z=0);let n=pe(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)),se();
|
package/static/settings.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as e,
|
|
1
|
+
import{V as e,X as t,a as n,c as r,t as i,u as a}from"./chunk-2P5KTb9d.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
|
@@ -3139,25 +3139,9 @@ a.prb-guide-pick { text-decoration: none; }
|
|
|
3139
3139
|
font-size: var(--t-body);
|
|
3140
3140
|
}
|
|
3141
3141
|
.prb-index-search:focus { outline: none; border-color: var(--brand); }
|
|
3142
|
-
.
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
padding: 7px 32px 7px 10px;
|
|
3146
|
-
border: 1px solid var(--border);
|
|
3147
|
-
border-radius: 8px;
|
|
3148
|
-
background-color: var(--surface-2);
|
|
3149
|
-
color: var(--text-primary);
|
|
3150
|
-
font: inherit;
|
|
3151
|
-
font-size: var(--t-meta);
|
|
3152
|
-
cursor: pointer;
|
|
3153
|
-
}
|
|
3154
|
-
.prb-index-author:hover { border-color: var(--border-strong); }
|
|
3155
|
-
.prb-index-author:focus-visible { outline: none; border-color: var(--brand); }
|
|
3156
|
-
/* Filled like a pressed pill once it narrows the list, so a filtered view is never mistaken for all of it. */
|
|
3157
|
-
.prb-index-author[data-active] { border-color: var(--brand); background-color: var(--brand); color: var(--on-brand); }
|
|
3158
|
-
/* Status: one control where five chips were. The box is the label, so "Status:" reads as part of the
|
|
3159
|
-
control rather than a caption beside it; the select inside is bare and carries the chevron. Same
|
|
3160
|
-
border, radius, height and fill-when-narrowing as the author filter beside it. */
|
|
3142
|
+
/* Review state: one control where five chips were. The box is the label, so "Review state:" reads
|
|
3143
|
+
as part of the control rather than a caption beside it; the select inside is bare and carries the
|
|
3144
|
+
chevron. Author and PR are the same control. */
|
|
3161
3145
|
.prb-index-status {
|
|
3162
3146
|
display: flex;
|
|
3163
3147
|
align-items: center;
|
|
@@ -3183,6 +3167,9 @@ a.prb-guide-pick { text-decoration: none; }
|
|
|
3183
3167
|
.prb-index-status select:focus-visible { outline: none; }
|
|
3184
3168
|
.prb-index-status:has(select[data-active]) { border-color: var(--brand); background-color: var(--brand); color: var(--on-brand-quiet); }
|
|
3185
3169
|
.prb-index-status select[data-active] { color: var(--on-brand); }
|
|
3170
|
+
/* The GitHub mark on Author and PR. currentColor, so it is muted beside "Author:" at rest and goes
|
|
3171
|
+
light with it once the filter fills. */
|
|
3172
|
+
.prb-index-forge-mark { flex: none; margin-right: 6px; }
|
|
3186
3173
|
|
|
3187
3174
|
.prb-cards {
|
|
3188
3175
|
display: flex;
|
|
@@ -3675,6 +3662,8 @@ a.prb-guide-pick { text-decoration: none; }
|
|
|
3675
3662
|
box-shadow: 0 10px 28px var(--shadow-float);
|
|
3676
3663
|
text-align: left;
|
|
3677
3664
|
}
|
|
3665
|
+
/* Above the trigger, the same gap away, when the whole panel would not show below it (menu.ts). */
|
|
3666
|
+
.prb-menu-panel[data-menu-placement='above'] { top: auto; bottom: 30px; }
|
|
3678
3667
|
.prb-menu-item {
|
|
3679
3668
|
display: block;
|
|
3680
3669
|
width: 100%;
|
|
@@ -5212,7 +5201,6 @@ span.prb-arch-location:hover { text-decoration: none; }
|
|
|
5212
5201
|
*
|
|
5213
5202
|
* Both selects in the workspace are listed here rather than each carrying its own copy: it is one
|
|
5214
5203
|
* control with two sizes, and a caret that differed between them would be a bug nobody could name. */
|
|
5215
|
-
.prb-index-author,
|
|
5216
5204
|
.prb-index-status select,
|
|
5217
5205
|
.prb-settings-field select {
|
|
5218
5206
|
appearance: none;
|
|
@@ -5223,7 +5211,6 @@ span.prb-arch-location:hover { text-decoration: none; }
|
|
|
5223
5211
|
background-size: 12px;
|
|
5224
5212
|
}
|
|
5225
5213
|
/* Filled purple, so the grey would disappear into it. */
|
|
5226
|
-
.prb-index-author[data-active],
|
|
5227
5214
|
.prb-index-status select[data-active] {
|
|
5228
5215
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
|
|
5229
5216
|
}
|
|
@@ -5637,6 +5624,7 @@ body .prb-body[data-focus='buddy'] .prb-msg-user { max-width: min(90%, 78ch); }
|
|
|
5637
5624
|
box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);
|
|
5638
5625
|
color: var(--pane-ink);
|
|
5639
5626
|
}
|
|
5627
|
+
.prb-doc .prb-ask-buddy-panel[data-menu-placement='above'] { top: auto; bottom: 28px; }
|
|
5640
5628
|
.prb-doc .prb-ask-buddy-panel .pr-helper-selection-menu-item {
|
|
5641
5629
|
display: block;
|
|
5642
5630
|
width: 100%;
|
|
@@ -5811,7 +5799,7 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
|
|
|
5811
5799
|
font: 500 var(--t-micro) / 1 ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
|
|
5812
5800
|
white-space: nowrap;
|
|
5813
5801
|
}
|
|
5814
|
-
/* The same item reads "Mark
|
|
5802
|
+
/* The same item reads "Mark not reviewed" once a review is marked; the chord marks reviewed only. */
|
|
5815
5803
|
.prb-menu-item[data-mark-status='in-progress']::after { content: none; }
|
|
5816
5804
|
.prb-menu-item[data-shortcut-hint][hidden] { display: none; }
|
|
5817
5805
|
|
|
@@ -5832,6 +5820,14 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
|
|
|
5832
5820
|
.prb-notification[data-keyboard-current] .prb-notification-open { box-shadow: inset 0 0 0 2px var(--brand-hover); border-radius: 9px; }
|
|
5833
5821
|
.prb-notification[data-keyboard-current] a.prb-notification-open:focus-visible { outline: none; }
|
|
5834
5822
|
|
|
5823
|
+
/* A review's Issues and Questions cursor, the same ring on the card's own border, in the pane's
|
|
5824
|
+
focus colour: the pane is light in both themes. The card itself holds focus while the ring is on
|
|
5825
|
+
it, so the ring is its focus indicator. The scroll margin keeps a card J or K brings on screen
|
|
5826
|
+
off the pane's edge, and clear of the feedback tray while there is one at the foot. */
|
|
5827
|
+
.prb-doc [data-finding-card] { scroll-margin-block: 16px; }
|
|
5828
|
+
.prb-doc [data-finding-card][data-keyboard-current] { outline: 2px solid var(--pane-accent); outline-offset: -1px; }
|
|
5829
|
+
.prb-body[data-feedback-selecting] .prb-doc [data-finding-card] { scroll-margin-block-end: 88px; }
|
|
5830
|
+
|
|
5835
5831
|
/* The palette's modes (Search and Filters on the Reviews list): a field or two under the trail,
|
|
5836
5832
|
and what they find. Same tokens as the palette rows, so a mode reads as the palette, not a form. */
|
|
5837
5833
|
.prb-palette-body { display: flex; flex-direction: column; gap: 8px; padding-top: 10px; }
|
|
@@ -5891,3 +5887,250 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
|
|
|
5891
5887
|
font-size: var(--t-micro);
|
|
5892
5888
|
}
|
|
5893
5889
|
.prb-palette-prompt[data-enter-target] { background: var(--surface-2); }
|
|
5890
|
+
|
|
5891
|
+
/* Add review (⌘P P, ⌘P B): a palette mode with more to show than a search, so the palette is wider
|
|
5892
|
+
while it holds one. Rows say what each pasted link will do; the options stay folded unless there
|
|
5893
|
+
is a question in them. */
|
|
5894
|
+
.prb-palette:has(.prb-addreview) { width: min(600px, calc(100vw - 32px)); max-height: min(86vh, 760px); }
|
|
5895
|
+
.prb-addreview { display: flex; flex-direction: column; gap: 8px; }
|
|
5896
|
+
.prb-addreview-mode { margin: 0 2px; color: var(--text-secondary); font-size: var(--t-meta); font-weight: 600; }
|
|
5897
|
+
.prb-addreview-label { margin: 0 2px; color: var(--text-secondary); font-size: var(--t-micro); font-weight: 600; }
|
|
5898
|
+
.prb-addreview-paste { resize: vertical; min-height: 5.5em; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace; font-size: var(--t-meta); }
|
|
5899
|
+
.prb-addreview-rows { display: flex; flex-direction: column; gap: 6px; max-height: 32vh; margin: 0; padding: 0; overflow: auto; list-style: none; }
|
|
5900
|
+
.prb-addreview-rows:empty { display: none; }
|
|
5901
|
+
.prb-addreview-row { display: flex; flex-direction: column; gap: 3px; padding: 6px 8px; border-radius: 6px; background: var(--surface); }
|
|
5902
|
+
.prb-addreview-row-head { display: flex; align-items: baseline; gap: 8px; font-size: var(--t-meta); font-weight: 600; }
|
|
5903
|
+
.prb-addreview-mark { flex: none; width: 1em; text-align: center; color: var(--success); }
|
|
5904
|
+
.prb-addreview-row[data-state='problem'] .prb-addreview-mark { color: var(--danger); }
|
|
5905
|
+
.prb-addreview-status { padding-left: calc(1em + 8px); font-size: var(--t-micro); }
|
|
5906
|
+
.prb-addreview-muted { color: var(--text-muted); }
|
|
5907
|
+
.prb-addreview-problem { color: var(--danger-ink); }
|
|
5908
|
+
.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; }
|
|
5909
|
+
.prb-addreview-row .prb-addreview-folder { margin-left: calc(1em + 8px); width: calc(100% - 1em - 8px); }
|
|
5910
|
+
.prb-addreview-link { color: inherit; }
|
|
5911
|
+
.prb-addreview-control {
|
|
5912
|
+
min-width: 0;
|
|
5913
|
+
padding: 5px 8px;
|
|
5914
|
+
border: 1px solid var(--border);
|
|
5915
|
+
border-radius: 6px;
|
|
5916
|
+
background: var(--surface);
|
|
5917
|
+
color: var(--text-primary);
|
|
5918
|
+
font: inherit;
|
|
5919
|
+
font-size: var(--t-meta);
|
|
5920
|
+
}
|
|
5921
|
+
.prb-addreview-control:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -1px; }
|
|
5922
|
+
.prb-addreview-options summary { cursor: pointer; color: var(--text-secondary); font-size: var(--t-micro); font-weight: 600; }
|
|
5923
|
+
.prb-addreview-grid { display: grid; grid-template-columns: max-content 1fr; align-items: center; gap: 6px 12px; margin: 8px 0 0; }
|
|
5924
|
+
.prb-addreview-key { color: var(--text-muted); font-size: var(--t-micro); }
|
|
5925
|
+
.prb-addreview-facts dd { margin: 0; font-size: var(--t-meta); overflow-wrap: anywhere; }
|
|
5926
|
+
.prb-addreview-kept { color: var(--text-muted); font-size: var(--t-micro); }
|
|
5927
|
+
.prb-addreview-detected:empty { display: none; }
|
|
5928
|
+
.prb-addreview-pathrow { display: flex; gap: 6px; }
|
|
5929
|
+
.prb-addreview-pathrow .prb-palette-input { flex: 1; }
|
|
5930
|
+
.prb-addreview-browse,
|
|
5931
|
+
.prb-addreview-start {
|
|
5932
|
+
flex: none;
|
|
5933
|
+
padding: 6px 12px;
|
|
5934
|
+
border: 1px solid var(--border);
|
|
5935
|
+
border-radius: 8px;
|
|
5936
|
+
background: var(--surface);
|
|
5937
|
+
color: var(--text-primary);
|
|
5938
|
+
font: inherit;
|
|
5939
|
+
font-size: var(--t-meta);
|
|
5940
|
+
cursor: pointer;
|
|
5941
|
+
}
|
|
5942
|
+
.prb-addreview-start { border-color: var(--brand); background: var(--brand); color: var(--on-brand); font-weight: 600; }
|
|
5943
|
+
.prb-addreview-start:disabled { opacity: 0.5; cursor: default; }
|
|
5944
|
+
.prb-addreview-browse:focus-visible,
|
|
5945
|
+
.prb-addreview-start:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
|
|
5946
|
+
/* Pinned to the bottom of the palette as the rows scroll, so the button Enter presses is always in sight. */
|
|
5947
|
+
.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); }
|
|
5948
|
+
.prb-addreview-error { margin: 0 2px; color: var(--danger-ink); font-size: var(--t-micro); }
|
|
5949
|
+
.prb-addreview-recent { max-height: 30vh; }
|
|
5950
|
+
|
|
5951
|
+
/* ── Feedback selection ──
|
|
5952
|
+
Choosing the Issues and Questions to raise with the author. The checkboxes ship on every card
|
|
5953
|
+
and show only while the body carries the mode, so entering it is a stylesheet change, as the
|
|
5954
|
+
inbox's Select mode is. Quiet at rest: Select sits at the weight of the focus toggle beside it. */
|
|
5955
|
+
.pr-helper-feedback-pick { display: none; }
|
|
5956
|
+
.prb-body[data-feedback-selecting] .pr-helper-feedback-pick {
|
|
5957
|
+
display: block;
|
|
5958
|
+
flex: none;
|
|
5959
|
+
width: 16px;
|
|
5960
|
+
height: 16px;
|
|
5961
|
+
margin: 2px 0 0;
|
|
5962
|
+
accent-color: var(--pane-accent);
|
|
5963
|
+
cursor: pointer;
|
|
5964
|
+
}
|
|
5965
|
+
.prb-doc .prb-doc-head .prb-selection-toggle { align-self: center; margin-left: auto; }
|
|
5966
|
+
.prb-doc .prb-doc-head .prb-selection-toggle + .prb-focus-toggle { margin-left: -8px; }
|
|
5967
|
+
.prb-selection-toggle {
|
|
5968
|
+
padding: 3px 10px;
|
|
5969
|
+
border: 1px solid var(--pane-line);
|
|
5970
|
+
border-radius: 8px;
|
|
5971
|
+
background: transparent;
|
|
5972
|
+
color: var(--pane-ink-muted);
|
|
5973
|
+
font: inherit;
|
|
5974
|
+
font-size: var(--t-meta);
|
|
5975
|
+
cursor: pointer;
|
|
5976
|
+
}
|
|
5977
|
+
.prb-selection-toggle:hover { color: var(--pane-ink); border-color: var(--pane-ink-faint); }
|
|
5978
|
+
.prb-selection-toggle[aria-pressed="true"] {
|
|
5979
|
+
border-color: var(--pane-accent);
|
|
5980
|
+
background: var(--pane-accent);
|
|
5981
|
+
color: #fff;
|
|
5982
|
+
}
|
|
5983
|
+
/* Two faces, Choose feedback and Done, one shown by the pressed state. */
|
|
5984
|
+
.prb-selection-toggle :is(.prb-selection-toggle-idle, .prb-selection-toggle-active) { display: inline-flex; align-items: center; gap: 6px; }
|
|
5985
|
+
.prb-selection-toggle[aria-pressed="true"] .prb-selection-toggle-idle,
|
|
5986
|
+
.prb-selection-toggle:not([aria-pressed="true"]) .prb-selection-toggle-active { display: none; }
|
|
5987
|
+
/* At the foot of the pane, on the pane's own column. Sticky, so a selection made at the top of a
|
|
5988
|
+
long list is acted on from wherever the reader has scrolled to; and the pane is a column while
|
|
5989
|
+
selecting, so on a short list the tray sits at the foot rather than straight after the last card,
|
|
5990
|
+
halfway up the screen. The side margins are the pane's 32px padding, and on a wide pane the gap
|
|
5991
|
+
either side of its 860px column, so the tray's edges are the cards' edges. */
|
|
5992
|
+
.prb-body[data-feedback-selecting] .prb-doc { display: flex; flex-direction: column; }
|
|
5993
|
+
.prb-body[data-feedback-selecting] .prb-doc > .prb-pane { flex: 1 0 auto; width: 100%; }
|
|
5994
|
+
.prb-selection-tray {
|
|
5995
|
+
position: sticky;
|
|
5996
|
+
bottom: 16px;
|
|
5997
|
+
z-index: 3;
|
|
5998
|
+
display: flex;
|
|
5999
|
+
flex-wrap: wrap;
|
|
6000
|
+
align-items: center;
|
|
6001
|
+
gap: 8px;
|
|
6002
|
+
margin: auto max(32px, calc((100% - 796px) / 2)) 16px;
|
|
6003
|
+
padding: 10px 14px;
|
|
6004
|
+
border: 1px solid var(--pane-accent);
|
|
6005
|
+
border-radius: 12px;
|
|
6006
|
+
background: var(--pane-surface);
|
|
6007
|
+
box-shadow: 0 6px 20px rgba(15, 23, 42, 0.12);
|
|
6008
|
+
}
|
|
6009
|
+
.prb-selection-tray[hidden] { display: none; }
|
|
6010
|
+
.prb-selection-count {
|
|
6011
|
+
margin: 0;
|
|
6012
|
+
font-size: var(--t-meta);
|
|
6013
|
+
color: var(--pane-ink);
|
|
6014
|
+
font-weight: 600;
|
|
6015
|
+
}
|
|
6016
|
+
.prb-selection-goto {
|
|
6017
|
+
padding: 0;
|
|
6018
|
+
border: 0;
|
|
6019
|
+
background: none;
|
|
6020
|
+
color: var(--pane-accent-ink);
|
|
6021
|
+
font: inherit;
|
|
6022
|
+
font-weight: 400;
|
|
6023
|
+
cursor: pointer;
|
|
6024
|
+
}
|
|
6025
|
+
.prb-selection-goto[hidden] { display: none; }
|
|
6026
|
+
.prb-selection-sep { color: var(--pane-ink-faint); white-space: pre; }
|
|
6027
|
+
.prb-selection-goto:hover [data-feedback-goto-label] { text-decoration: underline; }
|
|
6028
|
+
.prb-selection-spacer { flex: 1; }
|
|
6029
|
+
.prb-selection-button {
|
|
6030
|
+
padding: 6px 12px;
|
|
6031
|
+
border: 1px solid var(--pane-line);
|
|
6032
|
+
border-radius: 8px;
|
|
6033
|
+
background: transparent;
|
|
6034
|
+
color: var(--pane-ink-muted);
|
|
6035
|
+
font: inherit;
|
|
6036
|
+
font-size: var(--t-meta);
|
|
6037
|
+
cursor: pointer;
|
|
6038
|
+
}
|
|
6039
|
+
.prb-selection-button:hover:not(:disabled) { color: var(--pane-ink); border-color: var(--pane-ink-faint); }
|
|
6040
|
+
.prb-selection-button:disabled { opacity: 0.5; cursor: default; }
|
|
6041
|
+
.prb-selection-primary { border-color: var(--pane-accent); background: var(--pane-accent); color: #fff; font-weight: 600; }
|
|
6042
|
+
.prb-selection-primary:hover:not(:disabled) { color: #fff; border-color: var(--pane-accent-ink); background: var(--pane-accent-ink); }
|
|
6043
|
+
/* A button's own key, drawn after its word (command_layer.ts paintHints): in the button's colour,
|
|
6044
|
+
quieter, so it reads as a hint on the action rather than a second label. */
|
|
6045
|
+
.prb-key-hint { margin-left: 8px; font: inherit; font-size: 0.85em; font-weight: 400; opacity: 0.75; white-space: nowrap; }
|
|
6046
|
+
/* Copy Markdown is a flex row with a 6px gap already; together they make the tray's 8px. */
|
|
6047
|
+
.prb-draft-dialog .pr-helper-msg-copy .prb-key-hint { margin-left: 2px; }
|
|
6048
|
+
/* "2 selected" under Issues or Questions in the rail: the selection is a place's contents too. */
|
|
6049
|
+
.prb-rail-selected { display: block; font-size: var(--t-micro); color: var(--text-muted); }
|
|
6050
|
+
.prb-rail-selected[hidden] { display: none; }
|
|
6051
|
+
/* The draft is read here, so it gets most of the window: 80% of it each way, a column of head, tabs,
|
|
6052
|
+
one scrolling panel and the actions, with only the panel scrolling. `[open]` because a closed
|
|
6053
|
+
dialog's own display:none must stay in charge. */
|
|
6054
|
+
.prb-draft-dialog { width: 80vw; height: 80vh; max-width: none; max-height: none; box-sizing: border-box; }
|
|
6055
|
+
.prb-draft-dialog[open] { display: flex; flex-direction: column; }
|
|
6056
|
+
.prb-draft-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 12px; }
|
|
6057
|
+
.prb-draft-head h2 { margin: 0; }
|
|
6058
|
+
.prb-dialog .prb-draft-count { margin: 0; font-size: var(--t-meta); }
|
|
6059
|
+
.prb-draft-tabs { display: flex; gap: 4px; margin: 14px 0 0; border-bottom: 1px solid var(--border); }
|
|
6060
|
+
.prb-dialog-actions .prb-draft-tab,
|
|
6061
|
+
.prb-draft-tab {
|
|
6062
|
+
margin-bottom: -1px;
|
|
6063
|
+
padding: 7px 12px;
|
|
6064
|
+
border: 0;
|
|
6065
|
+
border-bottom: 2px solid transparent;
|
|
6066
|
+
border-radius: 0;
|
|
6067
|
+
background: none;
|
|
6068
|
+
color: var(--text-secondary);
|
|
6069
|
+
font: inherit;
|
|
6070
|
+
font-size: var(--t-body);
|
|
6071
|
+
cursor: pointer;
|
|
6072
|
+
}
|
|
6073
|
+
.prb-draft-tab:hover { color: var(--text-primary); }
|
|
6074
|
+
.prb-draft-tab[aria-selected="true"] { color: var(--text-primary); border-bottom-color: var(--brand); font-weight: 600; }
|
|
6075
|
+
.prb-draft-tab:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -2px; }
|
|
6076
|
+
.prb-draft-panel { flex: 1 1 auto; min-height: 0; margin-top: 14px; }
|
|
6077
|
+
.prb-draft-panel[hidden] { display: none; }
|
|
6078
|
+
/* Preview: for reading. The panel's full width, the review's own Markdown styles, and a scroll of its own. */
|
|
6079
|
+
.prb-draft-preview { overflow-y: auto; padding: 4px 4px 4px 0; font-size: var(--t-body); line-height: var(--lh-body); color: var(--text-secondary); }
|
|
6080
|
+
.prb-draft-preview h5 { margin: 18px 0 8px; font-size: var(--t-section); color: var(--text-primary); }
|
|
6081
|
+
.prb-draft-preview > h5:first-child { margin-top: 0; }
|
|
6082
|
+
.prb-draft-preview ol { padding-left: 22px; }
|
|
6083
|
+
.prb-draft-preview li + li { margin-top: 14px; }
|
|
6084
|
+
.prb-draft-preview li > p { margin: 0 0 6px; }
|
|
6085
|
+
.prb-draft-preview code {
|
|
6086
|
+
padding: 1px 4px;
|
|
6087
|
+
border-radius: 4px;
|
|
6088
|
+
background: var(--surface-2);
|
|
6089
|
+
color: var(--text-primary);
|
|
6090
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
6091
|
+
font-size: var(--t-code);
|
|
6092
|
+
overflow-wrap: anywhere;
|
|
6093
|
+
}
|
|
6094
|
+
.prb-draft-preview:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; border-radius: 4px; }
|
|
6095
|
+
.prb-dialog .prb-draft-empty { color: var(--text-muted); }
|
|
6096
|
+
/* Markdown: for editing. The whole panel is the box. */
|
|
6097
|
+
.prb-draft-text {
|
|
6098
|
+
display: block;
|
|
6099
|
+
width: 100%;
|
|
6100
|
+
height: 100%;
|
|
6101
|
+
box-sizing: border-box;
|
|
6102
|
+
padding: 10px 12px;
|
|
6103
|
+
border: 1px solid var(--border);
|
|
6104
|
+
border-radius: 8px;
|
|
6105
|
+
background: var(--surface-2);
|
|
6106
|
+
color: var(--text-primary);
|
|
6107
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
6108
|
+
font-size: var(--t-code);
|
|
6109
|
+
line-height: 1.5;
|
|
6110
|
+
resize: none;
|
|
6111
|
+
}
|
|
6112
|
+
.prb-draft-text:focus { outline: none; border-color: var(--brand); }
|
|
6113
|
+
/* At phone width the window is the margin: the 16px gutter either side, and most of the height. */
|
|
6114
|
+
@media (max-width: 600px) {
|
|
6115
|
+
.prb-draft-dialog { width: calc(100vw - 32px); height: calc(100vh - 32px); padding: 18px 16px; }
|
|
6116
|
+
}
|
|
6117
|
+
/* Copy Markdown: the copy control with its word showing, as KISS's Copy draft comment is, dressed
|
|
6118
|
+
as the dialog's primary action. The word says Copied or Copy failed after a click, so the hover
|
|
6119
|
+
bubble that would repeat it is not drawn, and the colour stays the button's. */
|
|
6120
|
+
.prb-draft-dialog .pr-helper-msg-copy.pr-helper-finding-copy {
|
|
6121
|
+
width: auto;
|
|
6122
|
+
height: auto;
|
|
6123
|
+
margin: 0;
|
|
6124
|
+
gap: 6px;
|
|
6125
|
+
padding: 7px 14px;
|
|
6126
|
+
border: 1px solid var(--brand);
|
|
6127
|
+
border-radius: 8px;
|
|
6128
|
+
background: var(--brand);
|
|
6129
|
+
color: var(--on-brand);
|
|
6130
|
+
font-size: var(--t-body);
|
|
6131
|
+
font-weight: 600;
|
|
6132
|
+
opacity: 1;
|
|
6133
|
+
}
|
|
6134
|
+
.prb-draft-dialog .pr-helper-finding-copy::after { display: none; }
|
|
6135
|
+
.prb-draft-dialog .pr-helper-msg-copy .pr-helper-msg-copy-label[hidden] { display: none; }
|
|
6136
|
+
.prb-draft-dialog .pr-helper-msg-copy.pr-helper-finding-copy:is(:hover, .copied, .failed) { background: var(--brand-hover); color: var(--on-brand); }
|