prreviewbuddy 0.76.9 → 0.78.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 +43 -0
- package/dist/{delete_review-BX3lu5Q7.js → delete_review-BHOzMQ0_.js} +49 -1
- package/dist/main.js +1 -1
- package/dist/server.js +334 -92
- package/package.json +1 -1
- package/static/chunk-BMAMO0Tf.js +1 -0
- package/static/{chunk-egI_P3oB.js → chunk-D8xJNBjR.js} +1 -1
- 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 +145 -8
- package/static/workspace.js +17 -17
- package/static/chunk-C0lM8IBt.js +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prreviewbuddy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.78.1",
|
|
4
4
|
"description": "Understand code changes before you approve them. Local branch and pull request reviews with Claude Code, Codex or Gemini CLI.",
|
|
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=[`checkbox`,`radio`,`button`,`submit`,`reset`].map(e=>`:not([type="${e}"])`).join(``);function n(e){if(!e||typeof e.closest!=`function`)return!1;let n=e;return n.isContentEditable?!0:n.closest(`input${t}, textarea, select, [contenteditable=""], [contenteditable="true"]`)!==null}var r=`prbNav`,i=`prb-workspace`,a=`prb-nav-session`,o=`prb-nav-head`,s=`prb-nav-handoff`,c=`prb-nav-places`,l=200,u=15e3,d=`unstored`;function f(e){if(!e||typeof e!=`object`)return null;let t=e[r];if(!t||typeof t!=`object`)return null;let{v:n,owner:i,session:a,idx:o,id:s,ui:c}=t;if(n!==1||i!==`prb-workspace`||typeof a!=`string`||a===``||typeof o!=`number`||!Number.isInteger(o)||o<0)return null;let l=c&&typeof c==`object`&&!Array.isArray(c)?c:null;return{v:n,owner:i,session:a,idx:o,...typeof s==`string`&&s!==``?{id:s}:{},ui:l}}function p(e){if(!e||typeof e!=`object`)return{};let{[r]:t,...n}=e;return n}function m(e,t){if(!e||typeof e!=`object`)return!1;let n=e;return n.owner===`prb-workspace`&&n.session===t}function h(e,t){try{return e?.getItem(t)??null}catch{return null}}function g(e,t,n){try{n===null?e?.removeItem(t):e?.setItem(t,n)}catch{}}function _(e){let{history:t,storage:n,location:_}=e,v=e.navigation??null,y=[],b=null,x=null,S=null,C=t=>{S!==null&&e.clearTimeout(S),S=t?t():null,e.capturePending(S!==null)},w=null,T=(()=>{if(!n)return d;let t=h(n,a);if(t)return t;let r=e.uuid();return g(n,a,r),h(n,a)===r?r:d})(),E=()=>`${_.pathname}${_.search}`,D=e=>`${E()}${e}`,O=()=>{try{v?.updateCurrentEntry({state:{owner:i,session:T}})}catch{}},k=()=>{for(let e of y)e()},A=(e,n)=>{n===void 0?t.replaceState(e,``):t.replaceState(e,``,n),O()},j=()=>Number(h(n,o)??0)||0,M=()=>{try{let e=JSON.parse(h(n,c)??`{}`);return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch{return{}}},N=(e,t)=>{if(!e||!n)return;let r=M();delete r[e],r[e]=t;let i=Object.keys(r);for(let e of i.slice(0,Math.max(0,i.length-l)))delete r[e];g(n,c,JSON.stringify(r))},ee=e=>{if(!e)return null;let t=e.id?M()[e.id]:void 0;return t&&typeof t==`object`&&!Array.isArray(t)?t:e.ui},te=()=>{if(!b)return null;try{return b()}catch{return null}},P=()=>{let a=f(t.state);if(a&&a.session===T&&a.id){w=a.id,O();return}let c=a?.idx??0;if(!a){let t=h(n,s);g(n,s,null),c=0;try{let n=t?JSON.parse(t):null,r=e.referrer!==``&&new URL(e.referrer).origin===_.origin;n&&r&&n.session===T&&typeof n.idx==`number`&&typeof n.at==`number`&&e.now()-n.at<u&&(c=n.idx+1)}catch{c=0}g(n,o,String(c))}let l=a?.id??e.uuid();w=l;let d={v:1,owner:i,session:T,idx:c,id:l,ui:a?.ui??null};A({...p(t.state),[r]:d})},ne=()=>f(t.state)??{v:1,owner:`prb-workspace`,session:T,idx:0,ui:null},F=()=>{S!==null&&C(null);let e=te();if(!e||!w)return;let n=JSON.stringify(e),i=f(t.state);if(!i||i.id!==w){N(w,e);return}(n!==x||JSON.stringify(i.ui)!==n)&&(x=n,N(w,e),A({...p(t.state),[r]:{...i,ui:e}}))},I=e=>{if(v){let t=v.currentEntry?.index;if(typeof t!=`number`||t<0)return!1;let n=v.entries()[t+e];if(!n)return!1;try{return m(n.getState(),T)}catch{return!1}}let n=f(t.state);return!n||n.session!==T||t.length<2?!1:e===-1?n.idx>0:n.idx<j()};P();try{t.scrollRestoration=`manual`}catch{}return{session:T,current(){return{route:p(t.state),ui:ee(f(t.state))}},push(a,s){if(a!==``&&!a.startsWith(`#`))throw Error(`Workspace history pushes within this document only; "${a}" is not a fragment.`);if(D(a)===`${E()}${_.hash}`)return!1;F();let c=ne().idx+1;g(n,o,String(c));let l=e.uuid(),u={v:1,owner:i,session:T,idx:c,id:l,ui:null};return w=l,t.pushState({...p(s),[r]:u},``,D(a)),x=null,O(),k(),!0},replace(e,t){if(e!==``&&!e.startsWith(`#`))throw Error(`Workspace history replaces within this document only; "${e}" is not a fragment.`);A({...p(t),[r]:ne()},D(e))},setCapturer(e){b=e},captureNow:F,scheduleCapture(){C(()=>e.setTimeout(F,250))},leaving(){F(),g(n,s,JSON.stringify({session:T,idx:ne().idx,at:e.now()}))},canGoBack:()=>I(-1),canGoForward:()=>I(1),back(){return I(-1)?(F(),t.back(),!0):!1},forward(){return I(1)?(F(),t.forward(),!0):!1},moved(){S!==null&&C(null);let e=te();e&&N(w,e),x=null,w=f(t.state)?.id??null;let n=f(t.state);!n||!n.id||n.session!==T?P():O(),k()},onAvailability(e){y.push(e)}}}function v(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function y(e){let t=e?.userAgentData?.platform??e?.platform??``;return/mac|iphone|ipad/i.test(t)}function b(e,t,r){if(e.defaultPrevented||e.isComposing)return null;let i=t?e.metaKey:e.ctrlKey,a=t?e.ctrlKey:e.metaKey;if(!i||a||e.altKey||e.shiftKey)return null;let o=e.key===`[`||e.key!==`]`&&e.code===`BracketLeft`?`back`:e.key===`]`||e.code===`BracketRight`?`forward`:null;return!o||n(e.target)||r.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)?null:o}var x=[`data-id`,`data-finding-card`,`data-goto-section`,`data-view-nav`,`data-file`,`data-line`,`data-history`,`data-history-toggle`,`data-load-more`,`data-select`,`data-pin`,`data-focus-toggle`,`data-ask-toggle`,`data-rail-toggle`,`data-search`,`data-status-filter`,`data-author-filter`,`data-pr-filter`,`data-card`,`data-notification-id`,`data-guide-section`,`data-guide-detail`,`data-view`];function S(e){if(e.id)return{attrs:[[`id`,e.id]]};let t=x.filter(t=>e.hasAttribute(t)).map(t=>[t,e.getAttribute(t)??``]);return t.length>0?{attrs:t}:null}function C(e,t){if(!e||e===t||!t.contains(e))return null;let n=[],r=e;for(;r&&r!==t&&n.length<3;){let t=S(r);t?n.unshift(t):r===e&&n.unshift({tag:r.tagName.toLowerCase(),...r.classList[0]?{cls:r.classList[0]}:{}}),r=r.parentElement}return n.length>0?n:null}function w(e){if(!e||typeof e!=`object`)return!1;let{attrs:t,tag:n,cls:r}=e;return t===void 0?typeof n==`string`&&/^[a-z][a-z0-9-]*$/.test(n)&&(r===void 0||typeof r==`string`):Array.isArray(t)&&t.length>0&&t.every(e=>Array.isArray(e)&&e.length===2&&x.concat(`id`).includes(e[0])&&typeof e[1]==`string`)}function T(e,t){return t.attrs?t.attrs.every(([t,n])=>e.getAttribute(t)===n):e.tagName.toLowerCase()===t.tag&&(t.cls===void 0||e.classList.contains(t.cls))}function E(e,t){let n=t.attrs?`[${t.attrs[0][0]}]`:t.tag;for(let r of e.querySelectorAll(n))if(T(r,t))return r;return null}function D(e,t){if(!Array.isArray(t)||t.length===0||!t.every(w))return null;let n=null,r=e;for(let e of t){let t=E(r,e);if(!t)return n;n=t,r=t}return n}function O(e,t){let n=D(e,t);if(n){if(n.tabIndex<0&&!n.matches(`a[href], button, input, select, textarea, summary`)){n.querySelector(`a[href], button:not([disabled]), input, select, textarea, [tabindex="0"]`)?.focus({preventScroll:!0});return}n.focus({preventScroll:!0})}}function k(e,t){let n=e?.[t];return typeof n==`number`&&Number.isFinite(n)&&n>=0?n:null}function A(e,t){let n=e?.[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function j(e){try{return e.sessionStorage}catch{return null}}function M(e,t){let n=e===`back`?`[`:`]`;return`${e===`back`?`Back`:`Forward`} (${t?`⌘${n}`:`Ctrl+${n}`})`}function N(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 te(e={},t=window,n=document){let r=t.navigation??null,i=_({history:t.history,navigation:r,storage:j(t),location:t.location,referrer:n.referrer,now:()=>Date.now(),uuid:()=>t.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,setTimeout:(e,n)=>t.setTimeout(e,n),clearTimeout:e=>t.clearTimeout(e),capturePending:e=>n.documentElement.toggleAttribute(`data-nav-capture-pending`,e)}),a=y(t.navigator),o=[...n.querySelectorAll(`[data-history]`)],s=()=>{for(let e of o)e.disabled=!((e.dataset.history===`forward`?`forward`:`back`)==`back`?i.canGoBack():i.canGoForward())};for(let e of o){let t=e.dataset.history===`forward`?`forward`:`back`;e.dataset.tip=M(t,a),e.addEventListener(`click`,()=>{t===`back`?i.back():i.forward()})}s(),i.onAvailability(s),r?.addEventListener?.(`currententrychange`,s),t.addEventListener(`keydown`,e=>{let t=b(e,a,n);t&&(e.preventDefault(),t===`back`?i.back():i.forward())}),t.addEventListener(`popstate`,()=>i.moved()),t.addEventListener(`pagehide`,()=>i.captureNow()),n.addEventListener(`visibilitychange`,()=>{n.visibilityState===`hidden`&&i.captureNow()}),n.addEventListener(`click`,e=>{let n=e.target?.closest?.(`a[href]`);!n||!v(e)||e.defaultPrevented||N(n,t.location)&&i.leaving()},!0),n.addEventListener(`pointerdown`,e=>{(e.button===3||e.button===4)&&i.captureNow()},!0);let c=()=>i.scheduleCapture();for(let e of[`scroll`,`click`,`input`,`toggle`,`focusin`])n.addEventListener(e,c,{capture:!0,passive:!0});if(!e.ownsRestore){let e=n.querySelector(`.prb-shell > main`);i.setCapturer(()=>({main:e?.scrollTop??0,focus:C(n.activeElement,n.body)}));let{ui:t}=i.current(),r=k(t,`main`);e&&r!==null&&(e.scrollTop=r),t&&O(n,t.focus)}return i}var P=[{id:`active`,name:`Active`,action:`Move to active`},{id:`waiting`,name:`Waiting`,action:`Mark waiting`},{id:`done`,name:`Done`,action:`Mark done`}];function ne(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 P.find(t=>t.id===e).action}function I(e,t){if(!e)return;let n=L(e,t);return n===void 0?{text:P.find(t=>t.id===e.state).name,changed:!1}:{text:n,changed:!0}}var re=[`created`,`updated`,`merged`,`closed`,`reopened`];function ie(e){return ae({at:Number(e.activityAt),kind:e.activityKind,...e.activityMovedAt===void 0?{}:{movedAt:Number(e.activityMovedAt)}})}function ae(e){if(typeof e!=`object`||!e)return;let{at:t,kind:n,movedAt:r}=e;if(!(typeof t!=`number`||!Number.isFinite(t)||!re.includes(n)))return{at:t,kind:n,...typeof r==`number`&&Number.isFinite(r)?{movedAt:r}:{}}}function oe(e,t){return!e||e.state===`waiting`&&se(e,t)?`active`:e.state}function L(e,t){if(!e||!t)return;if(e.state===`waiting`)return se(e,t)?`Changed while waiting`:void 0;if(t.kind===`reopened`&&t.at>e.at)return`Reopened since done`;let n=t.movedAt??(t.kind===`updated`?t.at:void 0);return n!==void 0&&n>e.at?`Changed since done`:void 0}function se(e,t){return t!==void 0&&t.kind!==`created`&&t.at>e.at}function ce(e,t,n){return L(t,n)!==void 0||e!==(t?.state??`active`)}function le(e,t,n){return e===`done`&&t?.state===`done`&&L(t,n)!==void 0?`Keep done`:F(e)}var R=[`pinned`,`active`,`waiting`,`done`],ue=e=>P.find(t=>t.id===e).name,de={pinned:{title:`Pinned`,key:`p`},active:{title:ue(`active`),key:`a`},waiting:{title:ue(`waiting`),key:`w`},done:{title:ue(`done`),key:`d`}};function fe(e){return typeof e==`string`&&R.includes(e)}function pe(e,t,n,r){return e&&!he(r)?`pinned`:oe(t,n)}function me(e,t){let n=e=>R.indexOf(t(e));return[...e].sort((e,t)=>n(e)-n(t))}function he(e){return e===`queue`}function ge(e,t,n){return e?I(t,n)?.text:L(t,n)}var _e=[`all`,`queue`,`in-progress`,`complete`],ve=[`any`,`open`,`merged`,`closed`],ye=[`q`,`f`,`by`,`pr`,`page`],z={query:``,filter:`all`,author:``,pr:`any`};function be(e){return e.query.trim()!==``||e.filter!==z.filter||e.author!==z.author||e.pr!==z.pr}function xe(e,t,n){let r=n===void 0?`${e} review${e===1?``:`s`}`:`${e} of ${n} review${n===1?``:`s`}`;return e===t?r:`${r} · ${t} branch${t===1?``:`es`}`}function Se(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 Ce(){return{pinned:15,active:15,waiting:15,done:15}}function we(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`f`)??``,r=t.get(`pr`)??``,i=new URLSearchParams;for(let[e,n]of t)!ye.includes(e)&&/^[a-z][a-z0-9_-]*$/i.test(e)&&n!==``&&i.append(e,n);let a=i.toString();return{query:t.get(`q`)??``,filter:_e.includes(n)?n:`all`,author:t.get(`by`)??``,pr:ve.includes(r)?r:`any`,...a===``?{}:{extra:a}}}function Te(e){let t=new URLSearchParams;e.query!==``&&t.set(`q`,e.query),e.filter!==`all`&&t.set(`f`,e.filter),e.author!==``&&t.set(`by`,e.author),e.pr!==`any`&&t.set(`pr`,e.pr);for(let[n,r]of new URLSearchParams(e.extra??``))ye.includes(n)||t.append(n,r);let n=t.toString();return n===``?``:`#${n}`}function Ee(e,t){return t===`all`||t===`queue`?!0:t===`in-progress`?e.status!==`complete`:e.status===t}function De(e,t){return t===`any`||e.prState===t}function Oe(e,t){return t===``||e===t}function ke(e){return e===`complete`?`Mark reviewed`:`Mark not reviewed`}function Ae(e){return e?`Unpin review`:`Pin review`}function je(e){return e?`Remove from review queue`:`Add to review queue`}function Me(e,t){let n=t.query.trim().toLowerCase();return Ne(e.filter(e=>(!n||e.searchText.includes(n))&&Ee(e,t.filter)&&Oe(e.author,t.author)&&De(e,t.pr)),t.filter)}function Ne(e,t){return he(t)?e.filter(e=>e.queue!==void 0).sort((e,t)=>(e.queue??0)-(t.queue??0)):e}function Pe(e){return e===0?`Queue`:`Queue (${e})`}function Fe(e){return e===`complete`?`Reviewed`:e===`in-progress`?`Not reviewed`:`New`}function Ie(e,t){if(e===0)return`Nothing selected`;let n=`${e} selected`;return t>0?`${n} · ${t} not shown`:n}function Le(e){return e===0?`Select all`:`Select all ${e}`}function Re(e){return e===0?`Delete`:`Delete ${e} review${e===1?``:`s`}`}function ze(e){return`${Re(e)}?`}function Be(e,t,n){return e===``||t===``||t===e?`wait`:n?`hold`:`reload`}var Ve=[{id:`global`,label:`Global`},{id:`reviews`,label:`Reviews list`},{id:`notifications`,label:`Activity 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`}],B=(...e)=>({kind:`chord`,keys:e}),V=(e,t)=>({kind:`key`,key:e,...t?{shift:t}:{}}),He=e=>({kind:`key`,key:e,primary:!0}),Ue=R.map(e=>({id:`reviews.section.${e}`,label:`${de[e].title} section`,group:`reviews`,page:`reviews`,binding:B(`l`,de[e].key)})),H=[{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:B(`p`,`p`)},{id:`add.branch`,label:`Review branch`,group:`global`,page:`global`,binding:B(`p`,`b`)},{id:`navigate.reviews`,label:`Go to Reviews`,group:`global`,page:`global`,binding:B(`r`)},{id:`navigate.notifications`,label:`Go to Activity`,group:`global`,page:`global`,binding:B(`n`)},{id:`help.shortcuts`,label:`Keyboard shortcuts`,group:`global`,page:`global`,binding:B(`?`)},{id:`reviews.search`,label:`Search reviews`,group:`reviews`,page:`reviews`,binding:B(`s`)},{id:`reviews.filters`,label:`Filters`,group:`reviews`,page:`reviews`,binding:B(`f`)},...Ue,{id:`reviews.next`,label:`Next review`,group:`reviews`,page:`reviews`,binding:V(`j`)},{id:`reviews.previous`,label:`Previous review`,group:`reviews`,page:`reviews`,binding:V(`k`)},{id:`reviews.open`,label:`Open review`,group:`reviews`,page:`reviews`,binding:V(`Enter`)},{id:`reviews.openInNewTab`,label:`Open review in new tab`,group:`reviews`,page:`reviews`,binding:V(`Enter`,!0)},{id:`reviews.menu`,label:`Open review menu`,group:`reviews`,page:`reviews`,binding:V(` `)},{id:`notifications.next`,label:`Next activity`,group:`notifications`,page:`notifications`,binding:V(`j`)},{id:`notifications.previous`,label:`Previous activity`,group:`notifications`,page:`notifications`,binding:V(`k`)},{id:`notifications.open`,label:`Open activity`,group:`notifications`,page:`notifications`,binding:V(`Enter`)},{id:`notifications.openInNewTab`,label:`Open activity in new tab`,group:`notifications`,page:`notifications`,binding:V(`Enter`,!0)},{id:`review.findings.next`,label:`Next card`,group:`findings`,page:`review`,binding:V(`j`)},{id:`review.findings.previous`,label:`Previous card`,group:`findings`,page:`review`,binding:V(`k`)},{id:`review.findings.askBuddy`,label:`Ask Buddy about the card`,group:`findings`,page:`review`,binding:V(` `)},{id:`review.findings.copy`,label:`Copy the card`,group:`findings`,page:`review`,binding:He(`c`)},{id:`review.findings.choose`,label:`Include in feedback, or leave out`,group:`findings`,page:`review`,binding:V(`Enter`)},{id:`review.feedback.prepare`,label:`Prepare feedback from the chosen cards`,group:`findings`,page:`review`,binding:He(`Enter`),hint:`[data-feedback-prepare]`,showHint:!0},{id:`review.feedback.copyDraft`,label:`Copy the feedback draft`,group:`findings`,page:`review`,binding:He(`c`),within:`[data-feedback-dialog]`,hint:`[data-feedback-copy]`,showHint:!0},{id:`review.section.review`,label:`Review overview`,group:`sections`,page:`review`,binding:B(`s`,`r`)},{id:`review.section.kiss`,label:`KISS`,group:`sections`,page:`review`,binding:B(`s`,`k`)},{id:`review.section.issues`,label:`Issues`,group:`sections`,page:`review`,binding:B(`s`,`i`)},{id:`review.section.diagrams`,label:`Diagrams`,group:`sections`,page:`review`,binding:B(`s`,`g`)},{id:`review.section.questions`,label:`Questions`,group:`sections`,page:`review`,binding:B(`s`,`q`)},{id:`review.section.files`,label:`Files`,group:`sections`,page:`review`,binding:B(`s`,`f`)},{id:`review.buddy.open`,label:`Open Buddy AI`,group:`buddy`,page:`review`,binding:B(`b`,`o`)},{id:`review.buddy.prompt`,label:`Choose a prompt`,group:`buddy`,page:`review`,binding:B(`b`,`p`)},{id:`review.mark.reviewed`,label:`Mark reviewed`,group:`actions`,page:`review`,binding:B(`m`,`r`),hint:`[data-review-menu] [data-mark-status]`},{id:`review.mark.waiting`,label:`Mark waiting`,group:`actions`,page:`review`,binding:B(`m`,`w`),hint:`[data-review-menu] [data-lifecycle-set="waiting"]`},{id:`review.mark.done`,label:`Mark done`,group:`actions`,page:`review`,binding:B(`m`,`d`),hint:`[data-review-menu] [data-lifecycle-set="done"]`},{id:`review.checkUpdates`,label:`Check for updates`,group:`actions`,page:`review`,binding:B(`a`,`c`),hint:`[data-review-menu] [data-fresh-check]`},{id:`review.update`,label:`Update review`,group:`actions`,page:`review`,binding:B(`a`,`u`)},{id:`review.queue.toggle`,label:`Queue`,group:`actions`,page:`review`,binding:B(`a`,`q`),hint:`[data-review-menu] [data-queue-action]`},{id:`review.feedback.toggle`,label:`Start or exit Prepare feedback`,group:`actions`,page:`review`,binding:B(`a`,`p`)},{id:`review.delete`,label:`Delete`,group:`actions`,page:`review`,binding:B(`a`,`d`),hint:`[data-review-menu] [data-delete]`},{id:`review.focus.toggle`,label:`Expand or collapse this section`,group:`workspace`,page:`review`,binding:V(`\\`),hint:`[data-focus-toggle]`},{id:`review.leave`,label:`Leave the Buddy AI field, Prepare feedback, or focus mode`,group:`workspace`,page:`review`,binding:V(`Escape`)}],We=[{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 Ge(e,t=H){return t.filter(t=>t.page===`global`||t.page===e)}function Ke(e,t=H){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:We.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 Ge(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 qe(e){return Ge(e).filter(e=>e.binding.kind===`key`)}var Je=new Set([`Shift`,`Control`,`Alt`,`Meta`,`CapsLock`,`Fn`,`AltGraph`,`OS`]);function Ye(e){return Je.has(e.key)}function Xe(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 Ze=new Set(H.flatMap(e=>e.binding.kind===`combo`?[e.binding.key]:[]));function Qe(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=Xe(e);return i!==null&&Ze.has(i)?i:null}function $e(e){return H.find(t=>t.binding.kind===`combo`&&t.binding.key===e)}function et(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?Xe(t)===e.key:t.key===e.key}function tt(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 nt={Escape:`Esc`,Enter:`Enter`,"\\":`\\`," ":`Space`};function U(e){return nt[e]??(e.length===1?e.toUpperCase():e)}function W(e,t=`k`){let n=t.toUpperCase();return e?`⌘${n}`:`Ctrl+${n}`}function G(e,t){let n=We.find(t=>t.combo!==void 0&&t.keys.every((t,n)=>e[n]===t));return n?[W(t,n.combo),...e.slice(n.keys.length).map(U)]:[W(t),...e.map(U)]}function K(e,t){return e.kind===`combo`?t?`⌘${U(e.key)}`:`Ctrl+${U(e.key)}`:e.kind===`chord`?G(e.keys,t).join(` `):e.primary?t?`⌘${U(e.key)}`:`Ctrl+${U(e.key)}`:e.shift?`Shift+${U(e.key)}`:U(e.key)}function rt(e,t){return e.kind===`chord`?G(e.keys,t):[K(e,t)]}function it(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 at(e){return Ve.map(t=>({group:t.id,label:t.label,rows:H.filter(e=>e.group===t.id).map(t=>({id:t.id,keys:rt(t.binding,e),label:t.label}))})).filter(e=>e.rows.length>0)}function q(e,t,n,r){let i=e.createElement(t);return n&&(i.className=n),r!==void 0&&(i.textContent=r),i}function ot(e,t){return q(e,`kbd`,`prb-kbd`,t)}function st(e,t,n){let r=q(e,`dialog`,`prb-palette`);r.setAttribute(`data-command-palette`,``),r.setAttribute(`aria-labelledby`,`prb-palette-title`);let i=q(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=q(e,`div`,`prb-palette-head`),i=q(e,`span`,`prb-palette-trail`);for(let[n,r]of t.entries())n>0&&i.append(q(e,`span`,`prb-palette-sep`,`›`)),i.append(ot(e,r));let a=q(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=q(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(q(e,`p`,`prb-palette-group`,t.groupLabels[r.group]??r.group)),o=r.group);let i=q(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(ot(e,r.keyLabel),q(e,`span`,`prb-palette-label`,r.namespace?`${r.label}…`:r.label)),r.state&&i.append(q(e,`span`,`prb-palette-state`,r.state)),n.append(i)}if(t.rows.length===0&&n.append(q(e,`p`,`prb-palette-empty`,`Nothing here on this page.`)),i.append(n),t.footer.length>0){let n=q(e,`div`,`prb-palette-footer`);n.append(q(e,`p`,`prb-palette-group`,`Keys on this page`));let r=q(e,`ul`,`prb-palette-keys`);for(let n of t.footer){let t=q(e,`li`);t.append(ot(e,n.keys),q(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=q(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 ct(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 lt(e,t){let n=q(e,`div`,`prb-shortcuts-table`);for(let r of t){let t=q(e,`section`,`prb-shortcuts-group`);t.append(q(e,`h3`,`prb-shortcuts-heading`,r.label));let i=q(e,`dl`,`prb-shortcuts-list`);for(let t of r.rows){let n=q(e,`dt`,`prb-shortcuts-keys`);n.dataset.commandId=t.id;for(let r of t.keys)n.append(ot(e,r));i.append(n,q(e,`dd`,`prb-shortcuts-label`,t.label))}t.append(i),n.append(t)}return n}function ut(e,t,n,r){let i=q(e,`dialog`,`prb-dialog prb-shortcuts`);i.setAttribute(`data-shortcuts-dialog`,``),i.setAttribute(`aria-labelledby`,`prb-shortcuts-title`);let a=q(e,`div`,`prb-shortcuts-head`),o=q(e,`h2`,void 0,`Keyboard shortcuts`);o.id=`prb-shortcuts-title`;let s=q(e,`button`,`prb-shortcuts-close`,`Close`);s.type=`button`,s.setAttribute(`data-shortcuts-close`,``),a.append(o,s),i.append(a,q(e,`p`,`prb-shortcuts-hint`,n),lt(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 dt=/https?:\/\/[^\s<>()"'`]+/gi,ft=/^https?:\/\/(?:www\.)?github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)(?:[/?#]|$)/i,pt=/^https?:\/\/([^/]+)\/((?:[^/?#]+\/)+?)(?:-\/)?merge_requests\/(\d+)(?:[/?#]|$)/i,mt=/^https?:\/\/(?:www\.)?bitbucket\.org\/([^/?#]+)\/([^/?#]+)\/pull-requests\/(\d+)(?:[/?#]|$)/i;function ht(e){let t=e.replace(/[.,;:!?)\]]+$/,``),n=ft.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=mt.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=pt.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 gt(e){let t=[],n=new Set;for(let r of e.matchAll(dt)){let e=ht(r[0]);!e||n.has(e.key)||(n.add(e.key),t.push(e))}return t}function _t(e){return`${e} isn't supported yet`}function vt(e){return e.model?`Keeps its original agent and model: ${e.agent}, ${e.model}`:`Keeps its original agent: ${e.agent}`}var yt={waiting:`Queued`,reviewing:`Analysing`,"already-reviewed":`Already reviewed`,ready:`Ready`,failed:`Failed`},bt={waiting:`○`,reviewing:`◐`,"already-reviewed":`✓`,ready:`✓`,failed:`!`},xt=250,St=1500,Ct=6e4;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(()=>({}));if(!r.ok){let e=i;return{...e,ok:!1,status:r.status,error:typeof e.error==`string`?e.error:`Something went wrong. Try again.`}}return{ok:!0,value:i}}catch{return{ok:!1,status:0,error:`The workspace server did not answer. Check it is still running.`}}}function wt(e,t,n){let r=null,i=!1,a=o=>{r=e.setTimeout(async()=>{let r=await J(e,`/add-review/batches/${t}`);i||(r.ok?(n.rows(r.value.rows,r.value.finished),a(r.value.finished?Ct:St)):r.status===404?n.lost(r.error):a(St))},o)};return a(St),()=>{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 Tt(e,t,n){let r=Y(e,`option`,void 0,t);return r.value=n,r}function X(e,t,n){let r=Y(e,`a`,`prb-addreview-link`,n);return r.href=`/open?id=${encodeURIComponent(t)}`,r}function Et(e,t){let n=Y(e,`details`,`prb-addreview-technical`);return n.append(Y(e,`summary`,void 0,`Technical details`),Y(e,`pre`,void 0,t)),n}function Dt(e){let t=Y(e,`div`,`prb-addreview-problemblock`);t.setAttribute(`role`,`alert`);let n=Y(e,`p`,`prb-addreview-error`);return n.hidden=!0,t.append(n),{element:t,show(r){n.textContent=r.error,n.hidden=!1,t.querySelector(`.prb-addreview-technical`)?.remove(),r.detail&&t.append(Et(e,r.detail))},hide(){n.hidden=!0,t.querySelector(`.prb-addreview-technical`)?.remove()}}}function Ot(e,t,n=`prb-addreview-path`){let r=Y(e,`span`,n),i=t.replace(/\/+$/,``).lastIndexOf(`/`);return i<=0?r.textContent=t:r.append(Y(e,`span`,`prb-addreview-path-parent`,t.slice(0,i+1)),Y(e,`span`,`prb-addreview-path-name`,t.slice(i+1))),r}function Z(e,t){return Y(e,`code`,void 0,t)}var Q=e=>`${e} commit${e===1?``:`s`}`;function kt(e,t){let n=t.options.find(e=>e.where===`remote`)?.display??`origin/${t.name}`,r=Y(e,`p`,`prb-addreview-choice-text`),i=t.divergence,a=i&&i.ahead>0&&i.behind>0?[`Your local `,Z(e,t.name),` and `,Z(e,n),` have diverged: ${Q(i.ahead)} on the local side, ${Q(i.behind)} on the remote.`]:i&&i.ahead>0?[`Your local `,Z(e,t.name),` is ${Q(i.ahead)} ahead of `,Z(e,n),`.`]:i&&i.behind>0?[`Your local `,Z(e,t.name),` is ${Q(i.behind)} behind `,Z(e,n),`.`]:[`Your local `,Z(e,t.name),` and `,Z(e,n),` are different commits.`];return r.append(...a),r}function At(e,t,n){let r=t.baseChoice,i=Y(e,`div`,`prb-addreview-choice`);i.setAttribute(`data-addreview-base-choice`,``);let a=Y(e,`p`,`prb-addreview-choice-title`,`Choose a base branch`);a.id=`prb-addreview-choice-title`;let o=Y(e,`div`,`prb-addreview-choice-options`);o.setAttribute(`role`,`radiogroup`),o.setAttribute(`aria-labelledby`,a.id);for(let t of r.options){let i=Y(e,`label`,`prb-addreview-choice-option`),a=Y(e,`input`);a.type=`radio`,a.name=`prb-addreview-base-choice`,a.value=t.base,a.addEventListener(`change`,()=>{a.checked&&n(t.base)});let s=`${t.where===`remote`?`Remote`:`Local`} ${r.name}`,c=t.commits===void 0?``:t.commits===0?` (no new changes)`:` (${Q(t.commits)} to review)`;i.append(a,Z(e,t.display),Y(e,`span`,`prb-addreview-choice-what`,` ${s}${c}`)),o.append(i)}return i.append(a,kt(e,r),Y(e,`p`,`prb-addreview-choice-text`,`Select which branch to compare against:`),o),t.detail&&i.append(Et(e,t.detail)),i}function jt(e,t){return t&&e.status===`waiting`?`Not started`:t&&e.status===`reviewing`?`Started`:yt[e.status]}function Mt(e,t){let n=e.filter(e=>e.status===`ready`||e.status===`already-reviewed`).length,r=[`reviewing`,`waiting`,`failed`].map(n=>[jt({status:n},t).toLowerCase(),e.filter(e=>e.status===n).length]).filter(([,e])=>e>0);return[`${n} of ${e.length} ${e.length===1?`review`:`reviews`} ready`,...r.map(([e,t])=>`${t} ${e}`)].join(` · `)}function Nt(e,t,n,r,i){let a=Y(e,`div`,`prb-addreview-progress`);a.setAttribute(`data-addreview-progress`,``);let o=Y(e,`p`,`prb-addreview-summary`);o.setAttribute(`aria-live`,`polite`);let s=Y(e,`ul`,`prb-addreview-rows`);s.setAttribute(`aria-label`,`Started reviews`);let c=Y(e,`p`,`prb-palette-summary`),l=Dt(e),u=Y(e,`div`,`prb-addreview-footer`),d=Y(e,`button`,`prb-addreview-start`,`Close`);d.type=`button`,d.setAttribute(`data-addreview-close`,``),d.addEventListener(`click`,i),u.append(d),a.append(o,s,c,l.element,u);let f=r,p=null,m=!1,h=!1,g=new Map,_=(t,n)=>{let r=n.contains(e.activeElement),i=n.querySelector(`.prb-addreview-technical`)?.open??!1;n.replaceChildren(),n.dataset.status=h&&t.status===`waiting`?`not-started`:t.status,n.dataset.state=t.status===`failed`?`problem`:`ok`;let a=Y(e,`div`,`prb-addreview-row-head`),o=Y(e,`span`,`prb-addreview-mark`,bt[t.status]);if(o.setAttribute(`aria-hidden`,`true`),a.append(o,t.reviewId?X(e,t.reviewId,t.label):Y(e,`span`,`prb-addreview-row-label`,t.label)),a.append(Y(e,`span`,`prb-addreview-badge`,jt(t,h))),n.append(a),t.reason&&n.append(Y(e,`span`,`prb-addreview-status prb-addreview-${t.status===`failed`?`problem`:`muted`}`,t.reason)),t.kept&&n.append(Y(e,`span`,`prb-addreview-status prb-addreview-muted`,vt(t.kept))),t.detail){let r=Et(e,t.detail);r.open=i,n.append(r)}if(t.status===`failed`&&!h){let r=t.stale===!0,i=Y(e,`button`,`prb-addreview-retry`,r?`Start fresh review`:`Retry`);i.type=`button`,i.setAttribute(r?`data-addreview-fresh`:`data-addreview-retry`,``),i.setAttribute(`aria-label`,`${r?`Start a fresh review of`:`Retry`} ${t.label}`),i.addEventListener(`click`,()=>void b(t.key,i,r)),n.append(i)}r&&n.focus()},v=()=>{let t=f.map(t=>{let n=JSON.stringify([t,h]),r=g.get(t.key);if(!r){let n=Y(e,`li`,`prb-addreview-row`);n.dataset.rowKey=t.key,n.tabIndex=-1,r={item:n,json:``},g.set(t.key,r)}return r.json!==n&&(_(t,r.item),r.json=n),r.item});(t.some((e,t)=>s.children[t]!==e)||s.children.length!==t.length)&&s.replaceChildren(...t),o.textContent=Mt(f,h),c.textContent=!h&&f.some(e=>e.status===`waiting`)?`Queued reviews start as running ones finish. Reviews carry on in the background, so you can close this; they appear in your reviews list.`:`Reviews carry on in the background, so you can close this; they appear in your reviews list.`},y=()=>{p?.(),p=wt(t,n,{rows:e=>{f=e,v()},lost:e=>{l.show({error:e}),h=!0,v()}})},b=async(e,r,i)=>{r.disabled=!0;let a=await J(t,`/add-review/batches/${n}/retry`,{key:e,...i?{fresh:!0}:{}});if(!m){if(!a.ok){r.disabled=!1,l.show(a),a.status===404&&(h=!0,p?.(),v());return}l.hide(),f=a.value.rows,v(),y()}};return v(),y(),{element:a,focus:()=>d.focus(),stop:()=>{m=!0,p?.()}}}function Pt(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);let l=Y(e,`div`,`prb-addreview-modelhelp`),u=Y(e,`button`,`prb-addreview-helplink`,`How do I find model names?`);u.type=`button`,u.setAttribute(`aria-expanded`,`false`),u.setAttribute(`data-addreview-model-help`,``);let d=Y(e,`p`,`prb-addreview-help`);d.id=`prb-addreview-model-help`,d.hidden=!0,u.setAttribute(`aria-controls`,d.id),l.append(u,d),i.append(l),n&&a(`Base`,c);let f=Dt(e);r.append(f.element);let p=[],m=()=>{let t=p.find(e=>e.id===o.value);if(!t){d.replaceChildren(`Choose an agent to see how to find its model names.`);return}let n=t.displayName,r=t.modelHelp;d.replaceChildren(...r?.command?[`To see the models ${n} offers, run `,Z(e,r.command),` in a terminal.`]:r?.note?[`To see the models ${n} offers, ${r.note}.`]:[`${n} does not say how to list its models. Use a name from its own documentation.`],` Leave Model empty to use ${n}'s default.`)};u.addEventListener(`click`,()=>{d.hidden=!d.hidden,u.setAttribute(`aria-expanded`,String(!d.hidden)),d.hidden?s.removeAttribute(`aria-describedby`):s.setAttribute(`aria-describedby`,d.id),m()}),o.addEventListener(`change`,m);let h=null,g=!1;return{element:r,base:c,loaded:J(t,`/add-review/options`).then(t=>{if(g=!0,!t.ok)return f.show(t),r.open=!0,null;p=t.value.agents;let{agent:n}=t.value,i=p.filter(e=>e.installed);n.kind!==`resolved`&&o.append(Tt(e,`Choose an agent`,``));for(let t of i)o.append(Tt(e,t.displayName,t.id));return n.kind===`resolved`?(h=n.id,i.some(e=>e.id===n.id)||o.append(Tt(e,n.displayName,n.id)),o.value=n.id):(o.value=``,r.open=!0,n.kind===`refused`&&f.show({error:n.error})),m(),t.value}),complete:()=>g&&o.value!==``,values:()=>({...o.value&&o.value!==h?{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`},showProblem:e=>{r.open=!0,f.show(e),(e.field===`model`?s:o).focus()},hideProblem:()=>f.hide()}}function Ft(e){let t=Y(e,`button`,`prb-addreview-start`);return t.type=`button`,t.setAttribute(`data-addreview-start`,``),t}function It(e){return{title:`Add review`,escape:`close`,mount(t,n){let r=e.defaultView,i=Y(e,`div`,`prb-addreview`);i.setAttribute(`data-addreview`,`pull-requests`);let a=Y(e,`div`,`prb-addreview-config`),o=Y(e,`label`,`prb-addreview-label`,`Paste PR links`),s=Y(e,`textarea`,`prb-palette-input prb-addreview-paste`);s.id=`prb-addreview-paste`,o.htmlFor=s.id,s.rows=3,s.spellcheck=!1,s.autocomplete=`off`,s.placeholder=`https://github.com/owner/repo/pull/123`;let c=Y(e,`p`,`prb-palette-summary`);c.setAttribute(`aria-live`,`polite`);let l=Y(e,`ul`,`prb-addreview-rows`),u=Pt(e,r,!1),d=Dt(e),f=Y(e,`p`,`prb-addreview-error`);f.setAttribute(`data-addreview-limit`,``),f.hidden=!0;let p=Y(e,`div`,`prb-addreview-footer`),m=Ft(e);p.append(m),a.append(o,s,c,f,l,u.element,d.element,p),i.append(Y(e,`p`,`prb-addreview-mode`,`Pull request`),a),t.append(i);let h=[],g=new Map,_=!1,v=0,y=null,b=null,x=!1,S=!1,C=()=>h.filter(e=>(e.ok||e.needsFolder)&&!!g.get(e.key)),w=0,T=()=>{let e=C().length;m.textContent=e>1?`Review ${e} PRs`:`Review PR`,m.disabled=b!==null||x||_||w>0||e===0||!u.complete()},E=()=>{f.hidden=w===0,f.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=()=>{l.replaceChildren(...h.map(t=>{let n=Y(e,`li`,`prb-addreview-row`);n.dataset.rowKey=t.key;let r=t.ok||!!g.get(t.key);n.dataset.state=r?`ok`:`problem`;let i=Y(e,`div`,`prb-addreview-row-head`),a=Y(e,`span`,`prb-addreview-mark`,r?`✓`:`!`);if(a.setAttribute(`aria-hidden`,`true`),i.append(a,Y(e,`span`,`prb-addreview-row-label`,t.label)),n.append(i),t.reviewed?.kept){let r=D(``,`muted`);r.append(X(e,t.reviewed.reviewId,`Resumes where it stopped`)),n.append(r,D(vt(t.reviewed.kept),`muted`))}else if(t.reviewed){let r=D(``,`muted`);r.append(X(e,t.reviewed.reviewId,`Already reviewed`)),n.append(r)}else t.ok?n.append(D(`Ready to start`,`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(Tt(e,n.branch?`${n.display} (${n.branch})`:n.display,n.path));r.value=g.get(t.key)??t.folder??``,r.addEventListener(`change`,()=>g.set(t.key,r.value)),n.append(r)}else if(t.folders.length===1)n.append(Ot(e,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=g.get(t.key)??``,r.addEventListener(`input`,()=>{r.value.trim()?g.set(t.key,r.value.trim()):g.delete(t.key),n.dataset.state=r.value.trim()?`ok`:`problem`,T()}),n.append(r)}return n}))},k=()=>{let e=gt(s.value),t=e.filter(e=>e.kind===`github`).length;c.textContent=e.length===0?s.value.trim()?`No pull request links found.`:``:t===1?`1 pull request recognised`:`${t} pull requests recognised`,h=e.map(e=>e.kind===`github`?h.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:_t(e.provider),folders:[]}),_=e.some(e=>e.kind===`github`),w=Math.max(0,t-20);let n=++v;O(),E(),T(),y!==null&&r.clearTimeout(y),_&&(y=r.setTimeout(async()=>{y=null;let e=await J(r,`/add-review/pull-requests/preview`,{text:s.value});if(!(S||n!==v)){if(_=!1,!e.ok)d.show(e);else{d.hide(),h=e.value.rows;for(let e of h)e.folder&&!g.has(e.key)&&g.set(e.key,e.folder)}O(),T()}},xt))},A=async()=>{if(T(),m.disabled)return;x=!0,T();let t=C().map(e=>({url:e.url,folder:g.get(e.key)})),i=await J(r,`/add-review/pull-requests`,{items:t,...u.values()});if(x=!1,!S){if(!i.ok){i.field?(d.hide(),u.showProblem(i)):(u.hideProblem(),d.show(i)),T();return}b=Nt(e,r,i.value.batchId,i.value.rows,n),a.replaceWith(b.element),b.focus()}};return s.addEventListener(`input`,k),m.addEventListener(`click`,()=>void A()),i.addEventListener(`change`,()=>T()),i.addEventListener(`keydown`,e=>{if(b||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(),A())}),u.loaded.then(()=>T()),T(),s.focus(),()=>{S=!0,y!==null&&r.clearTimeout(y),b?.stop()}}}}function Lt(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,`div`,`prb-addreview-config`),o=Y(e,`label`,`prb-addreview-label`,`Working folder`),s=Y(e,`div`,`prb-addreview-pathrow`),c=Y(e,`input`,`prb-palette-input`);c.id=`prb-addreview-folder`,o.htmlFor=c.id,c.type=`text`,c.spellcheck=!1,c.autocomplete=`off`,c.placeholder=`~/code/project`;let l=Y(e,`button`,`prb-addreview-browse`,`Browse…`);l.type=`button`,l.hidden=!0,s.append(c,l);let u=Y(e,`div`,`prb-addreview-detected`);u.setAttribute(`aria-live`,`polite`);let d=Y(e,`p`,`prb-palette-group`,`Recent`),f=Y(e,`div`,`prb-palette-results prb-addreview-recent`);f.setAttribute(`role`,`group`),f.setAttribute(`aria-label`,`Recent folders`),d.hidden=!0;let p=Pt(e,r,!0),m=Dt(e),h=Y(e,`div`,`prb-addreview-footer`),g=Ft(e);g.textContent=`Review branch`,h.append(g),a.append(o,s,u,d,f,p.element,m.element,h),i.append(Y(e,`p`,`prb-addreview-mode`,`Branch`),a),t.append(i);let _=null,v=null,y=!1,b=null,x=!1,S=null,C=(e,t)=>`${e}\n${t.trim()}`,w=()=>C(c.value,p.base.value),T=()=>{g.disabled=y||b!==null||!_?.result.ok||_.key!==w()||!p.complete()},E=e=>{S={base:e,path:c.value},p.base.value=e,v!==null&&r.clearTimeout(v),T(),O().then(e=>{!x&&e.ok&&g.focus()})},D=t=>{if(u.replaceChildren(),!t)return;if(!t.ok){if(t.baseChoice){u.append(At(e,{error:t.error??``,...t.detail?{detail:t.detail}:{},baseChoice:t.baseChoice},E));return}u.append(Y(e,`p`,`prb-addreview-error`,t.error??`This folder cannot be reviewed.`)),t.detail&&u.append(Et(e,t.detail));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=X(e,t.reviewed.reviewId,`Resumes where it stopped`),i=Y(e,`span`,`prb-addreview-kept`,vt(t.reviewed.kept)),a=Y(e,`span`);a.append(n,Y(e,`br`),i),r(`Review`,a)}else t.reviewed&&r(`Review`,X(e,t.reviewed.reviewId,t.reviewed.inProgress?`Being reviewed now`:`Already reviewed`));u.append(n),p.setBasePlaceholder(t.base??null)},O=()=>{let e=c.value,t=p.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,...e.detail?{detail:e.detail}:{}};return!x&&w()===n&&(_={key:n,result:t},D(t),T()),t}):(_=null,D(null),T(),Promise.resolve({ok:!1}))},k=e=>{c.value=e,A(),v!==null&&r.clearTimeout(v),T(),O(),c.focus()},A=()=>{!S||S.path===c.value||(p.base.value===S.base&&(p.base.value=``),S=null)},j=async()=>{if(y||b)return;y=!0;let t=w(),i=c.value,o=p.values();T(),v!==null&&(r.clearTimeout(v),v=null);let s=await O();if(x)return;if(!s.ok||!p.complete()||w()!==t)return y=!1,T();let l=await J(r,`/add-review/branch`,{path:i,...o});if(y=!1,!x){if(!l.ok){l.baseChoice?(_={key:t,result:{...l,ok:!1}},D(_.result),m.hide()):l.field?p.showProblem(l):m.show(l),T();return}b=Nt(e,r,l.value.batchId,l.value.rows,n),a.replaceWith(b.element),b.focus()}},M=()=>{T(),v!==null&&r.clearTimeout(v),v=r.setTimeout(()=>{v=null,O()},xt)};return c.addEventListener(`input`,()=>{A(),M()}),p.base.addEventListener(`input`,M),l.addEventListener(`click`,async()=>{let e=await J(r,`/add-review/folder/choose`,{});if(!x){if(!e.ok){m.show(e);return}e.value.path?k(e.value.path):c.focus()}}),f.addEventListener(`click`,e=>{let t=e.target.closest(`[data-folder-path]`);t?.dataset.folderPath&&k(t.dataset.folderDisplay??t.dataset.folderPath)}),g.addEventListener(`click`,()=>void j()),i.addEventListener(`keydown`,e=>{if(b||e.isComposing)return;let t=[...f.querySelectorAll(`[data-folder-path]`)],n=t.indexOf(e.target);if(e.key===`ArrowDown`||e.key===`ArrowUp`){let r=e.key===`ArrowDown`?e.target===c?t[0]:n>=0?t[n+1]:null:n===0?c: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(),j())}),i.addEventListener(`change`,()=>T()),p.loaded.then(e=>{x||(l.hidden=!e?.canChooseFolder,T())}),J(r,`/add-review/folders`).then(t=>{x||!t.ok||(f.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),Ot(e,t.display,`prb-palette-result-where`)),n})),d.hidden=t.value.folders.length===0)}),T(),c.focus(),()=>{x=!0,b?.stop(),v!==null&&r.clearTimeout(v)}}}}function Rt(e){return e.querySelector(`dialog[open], [data-menu-panel]:not([hidden])`)!==null}function zt(e){for(let t of e.children)return t.kind===`leaf`?t.command.group:zt(t);return`global`}function Bt(e,t,r={}){let i=r.win??window,a=r.doc??document,o=r.isMac??y(i.navigator),s=tt(Ke(e)),c=null,l=e=>{let t=a.querySelector(`a[href="${e}"]:not([target])`);t?t.click():i.location.assign(e)},u=ut(a,at(o),`${W(o)} opens the command palette and ${W(o,`p`)} adds a review, from anywhere in the workspace. Single keys never act while you are typing.`,()=>r.onSettle?.()),d={"palette.open":{run:()=>w()},"add.open":{run:()=>w([`p`])},"add.pullRequest":{panel:It(a)},"add.branch":{panel:Lt(a)},"navigate.reviews":{run:()=>l(`/`)},"navigate.notifications":{run:()=>l(`/notifications`)},"help.shortcuts":{run:()=>u.open()}},f=e=>d[e.id]??t[e.id],p=(e,t)=>{let n=f(e);return!!n&&(n.available?.(t)??!0)},m=null,h=`back`,g=[],_=()=>{m?.(),m=null},v=(e=`dismissed`)=>{_(),s.reset(),b.close();let t=c;c=null,t?.isConnected&&t.focus(),e===`dismissed`&&r.onSettle?.()},b=st(a,e=>T(e),v),x=qe(e).map(e=>({keys:K(e.binding,o),label:e.label})),S=Object.fromEntries(Ve.map(e=>[e.id,e.label])),C=()=>{let e=s.at;if(!e)return;let t=e.children.map(e=>e.kind===`leaf`?{key:e.key,keyLabel:e.key.toUpperCase(),label:f(e.command)?.label?.()??e.command.label,namespace:!1,available:p(e.command),group:e.command.group,state:f(e.command)?.state?.()??null}:{key:e.key,keyLabel:e.key.toUpperCase(),label:e.label,namespace:!0,available:!0,group:zt(e)}),n=s.path.length===0?Ve.flatMap(e=>t.filter(t=>t.group===e.id)):t;b.show({trail:G(s.path,o),title:e.label,rows:n,groupLabels:s.path.length===0?S:null,footer:x})};function w(e=[]){if(b.isOpen())return v();r.onOpen?.();let t=a.activeElement;c=t instanceof HTMLElement&&t!==a.body?t:null,s.start(e),C()}function T(e){let t=s.press(e);if(t.kind===`descend`)return C();let n=t.kind===`run`&&p(t.command)?f(t.command):null;if(n?.panel&&t.kind===`run`)return E(t.command,n.panel);v(n?`running`:`dismissed`),n?.run?.()}function E(e,t){g=e.binding.kind===`chord`?e.binding.keys.slice(0,-1):[],h=t.escape??`back`;let n=e.binding.kind===`chord`?G(e.binding.keys,o):[W(o)];m=b.showPanel(n,t,()=>v(`running`))}function D(){_(),s.start();for(let e of g)s.press(e);C()}let O=qe(e);return i.addEventListener(`keydown`,e=>{if(b.isOpen()){if(Ye(e))return;let t=()=>{e.preventDefault(),e.stopPropagation()};if(m)return e.key===`Escape`&&!e.isComposing?(t(),h===`close`?v():D()):Qe(e,o)?(t(),v()):void 0;if(e.key===`Escape`||Qe(e,o))return t(),v();if([`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){t(),ct(b.dialog,e.key,a.activeElement);return}if(e.target?.closest?.(`[data-palette-key]`)&&(e.key===`Enter`||e.key===` `)||e.key===`Tab`||e.metaKey||e.ctrlKey||e.altKey)return;t(),T(Xe(e)??``);return}if(e.defaultPrevented||e.isComposing)return;let t=Qe(e,o),r=t?$e(t):void 0;if(r){if(a.querySelector(`dialog[open]`))return;e.preventDefault(),e.stopPropagation(),f(r)?.run?.(e);return}for(let t of O){if(!et(t.binding,e,o))continue;let r=t.within;if(r){if(!a.querySelector(r)?.matches(`[open]`))continue}else if(t.binding.kind===`key`&&t.binding.key!==`Escape`&&(n(e.target)||Rt(a)))continue;if(p(t,e)){e.preventDefault(),f(t).run?.(e);return}}},!0),i.addEventListener(`pagehide`,()=>{b.isOpen()&&v(`unloading`)}),Vt(a,e,o),{isOpen:()=>b.isOpen()||u.isOpen(),close:()=>v()}}function Vt(e,t,n){for(let r of Ge(t)){let t=r.hint;if(t)for(let i of e.querySelectorAll(t))if(r.binding.kind===`chord`)i.dataset.shortcutHint=K(r.binding,n);else{let e=it(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=K(r.binding,n),i.append(e)}}}}function Ht(e){return`${e} more`}function Ut(e){return e===0?`Nothing unread`:`${e} unread`}function Wt(e){return e===`moved-again`?`replaced by a later move`:`replaced when the review caught up`}function Gt(e){return e===`restarting`?`Workspace server restarting`:e===`unreachable`?`Workspace server not running`:`Workspace server running`}function $(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=Gt(t))}function Kt(e,t){let n=e.querySelector(`[data-server-status]`);!n||n.dataset.serverStatus===`restarting`||$(e,t?`running`:`unreachable`)}function qt(e,t){if(typeof t==`number`)for(let n of e.querySelectorAll(`[data-unread-count]`))n.dataset.unreadStyle===`rail`&&(n.textContent=t===0?``:Ut(t)),n.hidden=t===0}var Jt=6e3,Yt=5e3;function Xt(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 Zt(e,t,n=window){return Qt(e,{kind:t.kind,text:t.text},n)}function Qt(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 $t(e,t,n=window){return Qt(e,{kind:t.tone,text:t.headline,href:`/notifications/open?id=${encodeURIComponent(t.id)}`,link:`Open`},n)}function en(e,t,n=window){return Qt(e,{kind:`more`,text:Ht(t),href:`/notifications`,link:`View all`},n)}function tn(e=document,t=window,n={}){let r=Number(e.body.dataset.notificationsSince);if(!Number.isFinite(r)||r<=0)return;let i=Xt(e),a=async()=>{try{let a=await t.fetch(`/notifications/recent?after=${r}`);if(Kt(e,!0),a.status===403)return;if(a.ok){let o=await a.json();n.paintUnread&&qt(e,o.unread),typeof o.now==`number`&&(r=o.now);for(let e of[...o.notifications??[]].reverse())$t(i,e,t);typeof o.more==`number`&&o.more>0&&en(i,o.more,t)}}catch{Kt(e,!1)}t.setTimeout(()=>void a(),Yt)};t.setTimeout(()=>void a(),Yt)}function nn(e,t){qt(e,t.unread),typeof t.driving==`boolean`&&rn(e,t.driving)}function rn(e,t){let n=e.querySelector(`[data-restart]`),r=e.querySelector(`[data-restart-note]`);n&&(n.disabled=t),r&&(r.hidden=!t)}var an=`prb-server-restarted`;function on(e=document,t=window){let n=null;try{n=t.sessionStorage.getItem(an),t.sessionStorage.removeItem(an)}catch{}n!==null&&Zt(Xt(e),{kind:`ready`,text:`Server restarted. Workspace is back online.`},t)}var sn=2e4,cn=300;function ln(e){on();let t=document.querySelector(`[data-restart]`),n=document.querySelector(`[data-restart-note]`);t&&t.addEventListener(`click`,()=>{t.disabled=!0,un(e,t,n)})}async function un(e,t,n){let r,i=null;try{let a=await fetch(e,{method:`POST`});if(a.status===409){rn(document,!0);return}if(!a.ok)return void yn(t,n,await vn(a));let o=await a.json();r=typeof o.startedAt==`number`?o.startedAt:null,i=gn(window.location.href,o.port)}catch{yn(t,n,`The workspace server could not be reached.`);return}if(document.body.dataset.restarting=`true`,$(document,`restarting`),i!==null){if(await mn(Number(new URL(i).port)))return void window.location.assign(i)}else if(await dn(r)){try{window.sessionStorage.setItem(an,`1`)}catch{}window.location.reload();return}if(delete document.body.dataset.restarting,await _n()){$(document,`running`),yn(t,n,`The server did not restart, and is still the one that was running.`);return}$(document,`unreachable`),yn(t,n,`Server restart failed. Run prreviewbuddy open to start the workspace again.`)}async function dn(e){let t=Date.now()+sn;for(;Date.now()<t;){await new Promise(e=>setTimeout(e,cn));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 fn=4,pn={now:()=>Date.now(),sleep:e=>new Promise(t=>setTimeout(t,e))};async function mn(e,t=()=>hn(e),n=pn){let r=n.now()+sn,i=0;for(;n.now()<r;){await n.sleep(cn);let e=await t();if(e===`moved`||(i=e===`gone`?i+1:0,i>=fn))return!0}for(let e=0;e<fn;e+=1){let e=await t();if(e!==`gone`)return e===`moved`;await n.sleep(cn)}return!0}async function hn(e){try{let t=await fetch(`/health`,{cache:`no-store`});return t.ok&&(await t.json()).movedTo===e?`moved`:`here`}catch{return`gone`}}function gn(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 _n(){try{return(await fetch(`/health`,{cache:`no-store`})).ok}catch{return!1}}async function vn(e){try{return(await e.json()).error??`The server could not be restarted.`}catch{return`The server could not be restarted.`}}function yn(e,t,n){e.disabled=!1,t&&(t.textContent=n,t.hidden=!1)}export{e as $,je as A,ce as B,pe as C,ke as D,fe as E,Ie as F,C as G,ne as H,Fe as I,k as J,y as K,ie as L,Be as M,Se as N,we as O,Le as P,n as Q,le as R,me as S,be as T,ee as U,ae as V,te as W,p as X,O as Y,A as Z,xe as _,Xt as a,Me as b,$ as c,Bt as d,lt as f,ge as g,R as h,tn as i,Pe as j,Ae as k,Wt as l,z as m,nn as n,qt as o,at as p,v as q,Zt as r,Kt as s,ln as t,Ut as u,Re as v,Ce as w,Te as x,ze as y,I as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Q as e}from"./chunk-BMAMO0Tf.js";async function t(e,t){try{await navigator.clipboard.writeText(t);let n=e.textContent;e.textContent=`Copied`,window.setTimeout(()=>{e.textContent=n},1200)}catch{let n=document.createElement(`input`);n.type=`text`,n.readOnly=!0,n.value=t,n.className=`prb-menu-id`,n.setAttribute(`data-id-field`,``),e.after(n),n.select()}}var n=`button:not([disabled])`;function r(e){return e.querySelector(`[data-menu-panel]`)}function i(e){return e.querySelector(`[data-menu-trigger]`)}function a(e){let t=r(e);return t?[...t.querySelectorAll(`input:not([disabled]), textarea:not([disabled]), button:not([disabled])`)].filter(e=>!e.closest(`[hidden]`)):[]}function o(e){let t=r(e);return t?[...t.querySelectorAll(n)].filter(e=>!e.closest(`[hidden]`)):[]}var s=`data-menu-placement`;function c(e){let t=e.ownerDocument.defaultView,n=0,r=t?.innerHeight??1/0;for(let i=e.parentElement;i&&t;i=i.parentElement){let e=t.getComputedStyle(i).overflowY;if(e===`visible`||e===``)continue;let a=i.getBoundingClientRect();n=Math.max(n,a.top),r=Math.min(r,a.bottom)}return{top:n,bottom:r}}var l=8,u=120;function d(e){let t=r(e),n=i(e);if(!t||!n)return;t.removeAttribute(s),t.style.removeProperty(`max-height`),t.style.removeProperty(`overflow-y`),t.style.removeProperty(`box-sizing`),t.scrollTop=0;let a=t.getBoundingClientRect(),o=n.getBoundingClientRect(),d=c(e),f=Math.max(0,a.top-o.bottom),p=d.bottom-o.bottom-f-l,m=o.top-d.top-f-l,h=a.height,g=h<=p?`below`:h<=m||m>p?`above`:`below`;g===`above`&&t.setAttribute(s,`above`);let _=g===`above`?m:p;h<=_||(t.style.boxSizing=`border-box`,t.style.maxHeight=`${Math.max(Math.floor(_),u)}px`,t.style.overflowY=`auto`)}function f(e){return!e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey?e.key===`j`?`ArrowDown`:e.key===`k`?`ArrowUp`:e.key:e.key}function p(t,n={}){let s=null,c=null,l=n.within?`${n.within} [data-menu]`:`[data-menu]`,u=e=>e&&(!n.within||e.closest(n.within))?e:null,p=(e,t={})=>{let a=r(e);if(!a||a.hidden)return;a.hidden=!0;let o=i(e);o?.setAttribute(`aria-expanded`,`false`);let l=s===e?c:null;s===e&&(s=null,c=null),n.onClose?.(e),t.returnFocus&&(l??(()=>o?.focus()))()},m=()=>{for(let e of t.querySelectorAll(l))p(e)},h=(e,t,a=null)=>{let l=r(e);l&&(m(),c=a,n.onOpen?.(e),l.hidden=!1,d(e),i(e)?.setAttribute(`aria-expanded`,`true`),s=e,t&&o(e)[0]?.focus())};return t.addEventListener(`click`,e=>{let t=e.target,n=u(t?.closest?.(`[data-menu]`)??null);if(!n){m();return}if(t?.closest(`[data-menu-trigger]`)){let t=e.detail===0;r(n)?.hidden?h(n,t):p(n);return}s&&s!==n&&p(s)}),t.addEventListener(`keydown`,t=>{if(s&&!s.isConnected&&(s=null),!s)return;let n=s;if(t.key===`Escape`){t.preventDefault(),p(n,{returnFocus:!0});return}if(!n.contains(t.target))return;if(t.key===`Tab`){if(n.hasAttribute(`data-menu-form`)){let e=a(n),r=e.indexOf(t.target);if(e.length>0){t.preventDefault(),e[(r+(t.shiftKey?-1:1)+e.length)%e.length].focus();return}}p(n);return}if(e(t.target))return;let r=o(n);if(r.length===0)return;let i=r.indexOf(t.target),c=f(t),l=c===`ArrowDown`?r[(i+1)%r.length]:c===`ArrowUp`?r[(i-1+r.length)%r.length]:c===`Home`?r[0]:c===`End`?r[r.length-1]:null;l&&(t.preventDefault(),l.focus(),l.scrollIntoView({block:`nearest`}))}),{open:(e,t={})=>h(e,t.focusFirst===!0,t.returnFocus??null),close:p,closeAll:m}}function m(e){return e<3e4?1e3:e<12e4?3e3:e<6e5?8e3:15e3}var h=`Fetch selected`;function g(e){return`${e} ${e===1?`repository`:`repositories`}`}function _(e){return`Fetching ${g(e)}…`}function v(e){return e.fetched===0?`Could not fetch ${g(e.repositories)}`:e.fetched===e.repositories?`Fetched ${g(e.repositories)}`:`Fetched ${e.fetched} of ${g(e.repositories)}`}function y(e,t){let n=new Set,r=new Set;for(let i of e)for(let e of i.lineage){let i=t[e];i!==void 0&&(n.add(e),r.add(i))}return{ids:[...n],repositories:r.size}}function b(e,t){return y(t,e).repositories>0}export{_ as a,t as c,v as i,b as n,m as o,y as r,p as s,h as t};
|
package/static/help.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$ as e,K as t,W as n,d as r,f as i,p as a,t as o}from"./chunk-BMAMO0Tf.js";n(),r(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(i(document,a(t(navigator)))),o(`/restart`),e(window,()=>window.location.reload());
|
package/static/notifications.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$ as e,W as t,d as n,l as r,o as i,t as a,u as o}from"./chunk-BMAMO0Tf.js";import{t as s}from"./chunk-C8kkSv38.js";var c=5e3;function l(e){let t=[],n=[],r=0;for(let i of e){let e=encodeURIComponent(i).length+1;n.length>0&&r+e>4e3&&(t.push(n),n=[],r=0),n.push(i),r+=e}return n.length>0&&t.push(n),t}var u=`Unread. `;function d(e,t){if(e.dataset.rowState===t||t===`unread`)return;e.dataset.rowState=t,e.dataset.read=`true`;let n=e.querySelector(`.prb-notification-open`),i=n?.getAttribute(`aria-label`)??``;if(i.startsWith(u)&&(i=i.slice(8)),t===`moved-again`||t===`caught-up`){let n=r(t);i=`${i}, ${n}`;let a=e.querySelector(`.prb-notification-meta`);if(a&&!a.querySelector(`[data-notification-replaced]`)){let t=e.ownerDocument.createElement(`span`);t.className=`prb-notification-replaced`,t.dataset.notificationReplaced=``,t.textContent=` · ${n}`,a.append(t)}}n?.setAttribute(`aria-label`,i)}function f(e,t){let n=e.querySelector(`[data-notifications-count]`);n&&(n.textContent=o(t));let r=e.querySelector(`[data-notifications-read-all]`);r&&(r.disabled=t===0),i(e,t)}function p(e,t){let n=Number(e.dataset.createdAt),r=Number(t.dataset.createdAt);return n>r||n===r&&(e.dataset.notificationId??``)<(t.dataset.notificationId??``)}function m(e,t){let n=[...e.querySelectorAll(`[data-notification-id]`)].find(e=>p(t,e));n?n.before(t):e.append(t)}function h(e,t){let n=new Set([...e.querySelectorAll(`[data-notification-id]`)].map(e=>e.dataset.notificationId));return Object.keys(t).filter(e=>!n.has(e))}function g(e,t,n=()=>{}){let r=Array.isArray(t.rows)?t.rows.filter(e=>typeof e==`string`):[],i=e.querySelector(`[data-notifications]`);if(r.length>0&&!i)return!1;let a=!1;if(i){for(let t of r){let n=e.createElement(`template`);n.innerHTML=t.trim();let r=n.content.firstElementChild,o=r?.dataset.notificationId;!r||!o||[...i.querySelectorAll(`[data-notification-id]`)].some(e=>e.dataset.notificationId===o)||(m(i,r),a=!0)}a&&n()}let o=t.states&&typeof t.states==`object`?t.states:{};for(let t of e.querySelectorAll(`[data-notification-id]`)){let e=o[t.dataset.notificationId??``];e&&d(t,e)}return typeof t.unread==`number`&&f(e,t.unread),!0}function _(e=document,t=window,n=e=>t.fetch(`/notifications/live${e.length>0?`?ids=${e.map(encodeURIComponent).join(`,`)}`:``}`),r=()=>{}){if(!e.querySelector(`[data-notifications], [data-notifications-empty]`))return;let i,a=!1,o=()=>e.visibilityState===`visible`,s=async e=>{let t=await n(e);return t.ok?await t.json():null},u=async()=>{if(!(a||!o())){a=!0;try{let n=await s([]);if(n){if(!g(e,{...n,rows:[]},r)){t.location.reload();return}let i=n.states?h(e,n.states):[];for(let n of l(i)){let i=null;try{i=await s(n)}catch{continue}if(i&&!g(e,i,r)){t.location.reload();return}}}}catch{}finally{a=!1}t.clearTimeout(i),i=t.setTimeout(()=>void u(),c)}};e.addEventListener(`visibilitychange`,()=>{o()&&(t.clearTimeout(i),u())}),i=t.setTimeout(()=>void u(),c)}function v(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 y(e){let t=e.querySelector(`[data-notifications-more]`),n=15;return v(e,t,n),t?.addEventListener(`click`,()=>{n+=15,v(e,t,n)}),{refresh:()=>v(e,e.querySelector(`[data-notifications-more]`),n)}}t(),a(`/restart`);var b=y(document),x=s({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`)});n(`notifications`,{"notifications.next":{run:()=>x.move(1)},"notifications.previous":{run:()=>x.move(-1)},"notifications.open":{available:()=>x.enterOpens(),run:()=>x.open()},"notifications.openInNewTab":{available:()=>x.enterOpens(),run:()=>x.openInNewTab()}});var S=document.querySelector(`[data-notifications-read-all]`);async function C(){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}}S?.addEventListener(`click`,()=>{S.disabled=!0,C().then(e=>{if(e===null){S.disabled=!1;return}document.querySelectorAll(`[data-notification-id][data-row-state="unread"]`).forEach(e=>d(e,`seen`)),f(document,e)})}),_(document,window,void 0,()=>b.refresh()),e(window,()=>window.location.reload());
|
package/static/reviews.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,E as r,F as i,H as a,I as o,K as s,M as ee,N as te,O as ne,P as re,R as ie,S as ae,T as oe,U as se,Y as ce,Z as le,_ as ue,a as de,b as fe,d as pe,g as me,h as he,i as ge,j as _e,k as ve,m as c,n as ye,q as be,r as xe,s as Se,t as Ce,v as we,w as Te,x as Ee,y as De}from"./chunk-C0lM8IBt.js";import{a as Oe,c as ke,i as Ae,n as je,o as Me,r as Ne,s as Pe,t as Fe}from"./chunk-egI_P3oB.js";import{t as Ie}from"./chunk-C8kkSv38.js";function Le(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function Re(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;ze(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return ze(e,!r);n(r)}function ze(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`★`:`☆`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function Be(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function Ve(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:se(e.activeElement,e.body)}}function He(e,t){let n=e?.limits;if(!n||typeof n!=`object`)return t;let r={...t};for(let e of c){let t=n[e];typeof t==`number`&&Number.isInteger(t)&&t>r[e]&&(r[e]=t)}return r}function Ue(e,t,n){if(!t)return;n.reveal(He(t,n.limits));let r=new Set(ce(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(e.dataset.id??``)&&Be(t,!0)}let i=s(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),be(e,t.focus)}function We(e,t){let n=Promise.resolve();for(let r of e){let e=r.dataset.section;if(!Te(e))continue;let i=r.open;r.addEventListener(`toggle`,()=>{if(r.open===i)return;i=r.open;let a=!r.open;n=n.then(()=>t(e,a)).catch(()=>{})})}}var l=a({ownsRestore:!0});Ce(`/restart`);var u=[...document.querySelectorAll(`[data-card]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),Ge=Object.fromEntries(c.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),d=document.querySelector(`.prb-index`);function Ke(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 f=document.querySelector(`[data-search]`),p=document.querySelector(`[data-status-filter]`),m=document.querySelector(`[data-author-filter]`),h=document.querySelector(`[data-pr-filter]`),qe=document.querySelector(`[data-no-matches]`),g=document.querySelector(`[data-count]`),_=n();function Je(e){return{stored:t({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:i(e.dataset)??{at:0,kind:`created`}}}function Ye(e){return e.dataset.pinned===`true`}function v(e){let{stored:t,activity:n}=Je(e);return ae(Ye(e),t,n,w.filter)}var y=document.querySelector(`[data-bulk]`),Xe=document.querySelector(`[data-bulk-count]`),Ze=document.querySelector(`[data-bulk-delete]`),Qe=document.querySelector(`[data-bulk-question]`),b=document.querySelector(`[data-bulk-confirm]`),x=document.querySelector(`[data-bulk-actions]`),S=document.querySelector(`[data-bulk-error]`),C=document.querySelector(`[data-bulk-select-all]`),w=r(window.location.hash),T=new Set,E=!1,D=document.querySelector(`[data-bulk-fetch]`),O={},k=[],A=!1;function j(){let e=w.query.trim().toLowerCase();w.author!==``&&![...m?.options??[]].some(e=>e.value===w.author)&&(w.author=``);let t=Ee(De(u.map(e=>({...Ke(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...w,query:e}).map(e=>e.card),v);k=t;let n=_e(t,v,_),r=new Set(c.flatMap(e=>n[e].shown));for(let e of u)e.hidden=!r.has(e);for(let e of c){let t=Ge[e];t&&Le(t,n[e].shown);let r=document.querySelector(`[data-load-more="${e}"]`);r&&(r.hidden=n[e].total<=n[e].shown.length);let i=document.querySelector(`[data-section="${e}"]`);i&&(i.hidden=n[e].total===0);let a=i?.querySelector(`[data-section-count]`);a&&(a.textContent=String(n[e].total))}if(f&&f.value!==w.query&&(f.value=w.query),m&&(m.value=w.author,w.author===``?delete m.dataset.active:m.dataset.active=``),h||(w.pr=`any`),h&&(h.value=w.pr,w.pr===`any`?delete h.dataset.active:h.dataset.active=``),p&&(p.value=w.filter,w.filter===`all`?delete p.dataset.active:p.dataset.active=``),g){let e=t.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);g.textContent=me(e,t.length)}qe&&(qe.hidden=t.length>0||u.length===0),it(t)}var $e=300,M=null;function N(){M!==null&&window.clearTimeout(M),M=null,l.replace(fe(w),{})}function P(e,t){if(w={...w,...e},_=n(),j(),t===`now`)return N();M!==null&&window.clearTimeout(M),M=window.setTimeout(N,$e)}window.addEventListener(`pagehide`,()=>{M!==null&&N()}),document.addEventListener(`click`,e=>{M!==null&&e.target?.closest?.(`a[href]`)&&N()},!0),f?.addEventListener(`input`,()=>P({query:f.value},`settled`)),f?.addEventListener(`keydown`,e=>{e.key===`Escape`&&f.value!==``&&(e.preventDefault(),P({query:``},`now`))}),p?.addEventListener(`change`,()=>{P({filter:p.value},`now`)}),m?.addEventListener(`change`,()=>{P({author:m.value},`now`)}),h?.addEventListener(`change`,()=>{P({pr:h.value},`now`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;!t||!c.includes(t)||(_={..._,[t]:_[t]+15},j())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{w=r(window.location.hash),_=n(),j(),tt()});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;Re(t,e=>fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,pinned:e})}).then(e=>e.ok),e=>{let n=t.closest(`[data-card]`);n&&(n.dataset.pinned=String(e),q(n),j())})});async function et(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}F(n),j()}function F(e){let t=new Map(e.map((e,t)=>[e,t]));for(let e of u){let n=t.get(e.dataset.id??``);n===void 0?delete e.dataset.queue:e.dataset.queue=String(n),n!==void 0&&e.dataset.lifecycle!==`active`&&(e.dataset.lifecycle=`active`,delete e.dataset.lifecycleAt,q(e))}for(let e of document.querySelectorAll(`[data-queue-action][data-queue-id]`)){let n=t.has(e.dataset.queueId??``);e.dataset.queueAction=n?`remove`:`add`,e.textContent=ne(n)}let n=document.querySelector(`[data-queue-option]`);n&&(n.textContent=ve(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&&Be(t,n.hidden!==!1)});var I=document.querySelector(`.prb-shell > main`);function tt(){Ue(document,l.current().ui,{cards:u,pane:I,limits:_,reveal:e=>{_=e,j()}})}l.setCapturer(()=>Ve(document,u,_,I)),j(),tt();var L=Pe(document,{onOpen:R,onClose:R});function R(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-menu]`);if(!n)return;let r=t.closest(`[data-copy-id]`);if(r?.dataset.copyId){e.preventDefault(),e.stopPropagation(),ke(r,r.dataset.copyId);return}let i=t.closest(`[data-fetch-review]`);if(i?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),L.closeAll();let t=i.closest(`[data-card]`);t&&Tt([t]);return}let a=t.closest(`[data-mark-status]`);if(a?.dataset.markId){e.preventDefault(),e.stopPropagation(),L.closeAll(),vt(a.dataset.markId,a.dataset.markStatus===`complete`);return}let o=t.closest(`[data-lifecycle-set]`);if(o?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),L.closeAll(),K([o.dataset.lifecycleId],o.dataset.lifecycleSet);return}let s=t.closest(`[data-queue-action]`);if(s?.dataset.queueId){e.preventDefault(),e.stopPropagation(),L.closeAll(),et(s.dataset.queueId,s.dataset.queueAction===`remove`?`remove`:`add`);return}if(t.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-items]`),r=n.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),r&&(r.hidden=!1),e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),R(n),e.detail===0&&n.querySelector(`[data-delete]`)?.focus();return}if(t.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),nt(n);return}e.preventDefault(),e.stopPropagation()});async function nt(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();rt(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{rt(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 rt(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 z(e){E=e,e||T.clear(),d&&(e?d.dataset.selecting=``:delete d.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`);B(),j()}function B(){b&&(b.hidden=!0),x&&(x.hidden=!1),S&&(S.hidden=!0,S.textContent=``)}function it(e){for(let e of u){let t=T.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!y||(y.hidden=!E,!E))return;let t=new Set(e.filter(at).map(e=>e.dataset.id)),n=[...T].filter(e=>!t.has(e)).length;Xe&&(Xe.textContent=te(T.size,n)),C&&(C.textContent=ee(e.length),C.disabled=e.every(e=>T.has(e.dataset.id??``))),Ze&&(Ze.textContent=ue(ht()));for(let e of y.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-delete]`))e.disabled=T.size===0;D&&(D.hidden=!je(O,Y(U())))}function at(e){return!e.hidden&&e.closest(`details`)?.open!==!1}for(let e of document.querySelectorAll(`details[data-section]`))e.addEventListener(`toggle`,()=>it(k));We(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`,()=>{z(!E)}),C?.addEventListener(`click`,()=>{for(let e of k)e.dataset.id&&T.add(e.dataset.id);B(),j()});function V(e){T.has(e)?T.delete(e):T.add(e),B(),j()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&V(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!E)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(),V(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!E||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),V(t.dataset.id))});var H=Ie({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>k.filter(at),enterAllowed:()=>!E,background:()=>I,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function ot(){return H.holdsKeys()?H.current()?.querySelector(`:scope > [data-menu]`)??null:null}var st=8;function ct(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),M!==null&&N(),l.leaving(),lt=!0,window.location.assign(t.href))}var lt=!1,ut={title:`Search reviews`,mount(e,t){let n=document.createElement(`input`);n.type=`search`,n.className=`prb-palette-input`,n.placeholder=f?.placeholder??``,n.setAttribute(`aria-label`,`Search reviews`),n.spellcheck=!1,n.value=f?.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=k.slice(0,st);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=k.length===0?`No reviews match.`:k.length>e.length?`The first ${e.length} of ${g?.textContent??k.length}`:g?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=u.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),ct(n))};n.addEventListener(`input`,()=>{f&&(f.value=n.value,f.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()}},dt={title:`Filters`,mount(e){let t=document.createElement(`p`);t.className=`prb-palette-summary`,t.setAttribute(`aria-live`,`polite`);let n=()=>{t.textContent=g?.textContent??``},r=[p,m,h].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 ft(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 pt=Object.fromEntries(c.map(e=>[`reviews.section.${e}`,ft(e)])),mt=pe(`reviews`,{...pt,"reviews.search":{available:()=>f!==null,panel:ut},"reviews.filters":{available:()=>p!==null,panel:dt},"reviews.next":{run:()=>H.move(1)},"reviews.previous":{run:()=>H.move(-1)},"reviews.open":{available:()=>H.enterOpens(),run:()=>H.open()},"reviews.openInNewTab":{available:()=>H.enterOpens(),run:()=>H.openInNewTab()},"reviews.menu":{available:()=>ot()!==null,run:()=>{let e=ot();e&&L.open(e,{focusFirst:!0,returnFocus:()=>H.refocus()})}}},{onOpen:()=>L.closeAll(),onSettle:()=>$()});function U(){return Ee(u.filter(e=>T.has(e.dataset.id??``)),v)}function ht(){return U().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function W(e){S&&(S.textContent=e,S.hidden=!1)}function G(e){for(let t of y?.querySelectorAll(`button`)??[])t.disabled=e}async function gt(e){let t=[...T];if(t.length!==0){G(!0);try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok)return G(!1),W(`That could not be saved. The workspace server refused it.`)}catch{return G(!1),W(`The workspace server did not answer. It may have stopped.`)}_t(U(),e),G(!1),z(!1)}}function _t(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=re(n));let i=t.querySelector(`[data-mark-status]`);i&&(i.dataset.markStatus=r,i.textContent=oe(r))}}async function vt(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}_t(u.filter(t=>t.dataset.id===e),t),j()}async function K(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 u)r.has(e.dataset.id??``)&&(e.dataset.lifecycle=t,t===`active`?delete e.dataset.lifecycleAt:e.dataset.lifecycleAt=String(n.at),q(e));return F(n.queue),j(),!0}function q(e){let{stored:t,activity:n}=Je(e),r=e.querySelector(`[data-lifecycle-chip]`);if(r){let i=he(Ye(e),t,n);r.textContent=i??``,r.hidden=i===void 0}for(let r of e.querySelectorAll(`[data-lifecycle-set]`)){let e=r.dataset.lifecycleSet;r.hidden=!ie(e,t,n),r.textContent=o(e,t,n)}}async function yt(e){let t=[...T];if(t.length===0)return;G(!0);let n=await K(t,e);if(G(!1),!n)return W(`That could not be saved. The workspace server refused it or did not answer.`);z(!1)}async function bt(){let e=[...T];if(e.length===0)return;G(!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 G(!1),B(),W(`Nothing was deleted. The workspace server refused it.`)}catch{return G(!1),B(),W(`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 U())r.has(e.dataset.id??``)||e.remove();u=u.filter(e=>e.isConnected),T.clear();for(let e of r)T.add(e);if(G(!1),B(),n.length===0)return z(!1);j(),W([...new Set(n.map(e=>e.error))].join(` `))}async function xt(){let e=U().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;G(!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 G(!1),B(),W(`The workspace server did not answer. It may have stopped.`)}if(!t?.queue)return G(!1),B(),W(`Nothing was added. The workspace server refused it.`);F(t.queue);let n=t.refused??[];T.clear();for(let e of n)T.add(e.id);if(G(!1),B(),n.length===0)return z(!1);j(),W([...new Set(n.map(e=>e.error))].join(` `))}y?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-bulk-queue]`))return void xt();let n=t.closest(`[data-bulk-mark]`);if(n)return void gt(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void yt(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Qe&&(Qe.textContent=we(ht())),x&&(x.hidden=!0),b&&(b.hidden=!1);return}if(t.closest(`[data-bulk-confirm-delete]`))return void bt();if(t.closest(`[data-bulk-cancel-delete]`))return B();if(t.closest(`[data-bulk-cancel]`))return z(!1)}),le(window,()=>window.location.reload());var J=`prb-fetch-summary`;function Y(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function St(e){return Ne(Y(e),O)}function Ct(){for(let e of u){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!je(O,Y([e])))}}async function wt(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;O=(await e.json()).targets??{}}catch{return}Ct(),j()}async function Tt(e,t){let n=St(e);if(A||n.repositories===0)return;A=!0;let r=[D,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=Oe(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{}A=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Fe),j();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:Ae(a)};if(a.moved>0||Z){try{window.sessionStorage.setItem(J,JSON.stringify(o))}catch{}if(!Q())return void window.location.reload();Z=!0}xe(de(),o)}try{let e=window.sessionStorage.getItem(J);if(e){window.sessionStorage.removeItem(J);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&xe(de(),{kind:t.kind,text:t.text})}}catch{}D?.addEventListener(`click`,()=>void Tt(U(),D)),wt();var Et=document.body.dataset.indexRevision??``,X=document.body.dataset.live===`true`?Date.now():0,Z=!1;function Q(){return T.size>0||document.activeElement===f||A||mt.isOpen()||lt}function $(){Z&&!Q()&&window.location.reload()}async function Dt(){try{let t=await fetch(`/revision`);if(t.ok){Se(document,!0);let n=await t.json();ye(document,n),n.live&&X===0&&(X=Date.now()),n.live||(X=0);let r=e(Et,n.revision??``,Q());if(r===`reload`)return void window.location.reload();r===`hold`&&(Z=!0)}}catch{Se(document,!1)}window.setTimeout(()=>void Dt(),Me(X===0?2**53-1:Date.now()-X))}Dt(),f?.addEventListener(`blur`,$),document.addEventListener(`click`,()=>window.setTimeout($,0)),ge();
|
|
1
|
+
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as ee,I as te,J as ne,L as re,M as ie,N as ae,O as oe,P as se,R as ce,S as le,T as ue,W as de,Y as fe,Z as pe,_ as me,a as he,b as ge,d as _e,g as ve,h as c,i as ye,j as be,m as l,n as xe,r as Se,s as Ce,t as we,v as Te,w as u,x as Ee,y as De}from"./chunk-BMAMO0Tf.js";import{a as Oe,c as ke,i as Ae,n as je,o as Me,r as Ne,s as Pe,t as Fe}from"./chunk-D8xJNBjR.js";import{t as Ie}from"./chunk-C8kkSv38.js";function Le(e,t){t.forEach((t,n)=>{e.children[n]!==t&&e.insertBefore(t,e.children[n]??null)})}async function Re(e,t,n){if(e.disabled)return;let r=e.getAttribute(`aria-pressed`)!==`true`;ze(e,r),e.disabled=!0;let i=await t(r).catch(()=>!1);if(e.disabled=!1,!i)return ze(e,!r);n(r)}function ze(e,t){e.setAttribute(`aria-pressed`,String(t)),e.innerHTML=t?`★`:`☆`,e.setAttribute(`aria-label`,`${t?`Unpin`:`Pin`} this review`)}function Be(e,t){let n=e.parentElement?.querySelector(`[data-history-list]`);n&&(n.hidden=!t,e.setAttribute(`aria-expanded`,String(t)))}function Ve(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:s(e.activeElement,e.body)}}function He(e,t){let n=e?.limits;if(!n||typeof n!=`object`)return t;let r={...t};for(let e of c){let t=n[e];typeof t==`number`&&Number.isInteger(t)&&t>r[e]&&(r[e]=t)}return r}function Ue(e,t,n){if(!t)return;n.reveal(He(t,n.limits));let r=new Set(pe(t,`expanded`));for(let e of n.cards){let t=e.querySelector(`[data-history-toggle]`);t&&r.has(e.dataset.id??``)&&Be(t,!0)}let i=ne(t,`main`);n.pane&&i!==null&&(n.pane.scrollTop=i),fe(e,t.focus)}function We(e,t){let n=Promise.resolve();for(let r of e){let e=r.dataset.section;if(!a(e))continue;let i=r.open;r.addEventListener(`toggle`,()=>{if(r.open===i)return;i=r.open;let a=!r.open;n=n.then(()=>t(e,a)).catch(()=>{})})}}var d=de({ownsRestore:!0});we(`/restart`);var f=[...document.querySelectorAll(`[data-card]`)].sort((e,t)=>Number(e.dataset.rank)-Number(t.dataset.rank)),Ge=Object.fromEntries(c.map(e=>[e,document.querySelector(`[data-cards="${e}"]`)])),p=document.querySelector(`.prb-index`);function Ke(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]`),qe=document.querySelector(`[data-no-matches]`),v=document.querySelector(`[data-count]`),y=document.querySelector(`[data-clear-filters]`),b=u();function Je(e){return{stored:ee({state:e.dataset.lifecycle,at:Number(e.dataset.lifecycleAt)}),activity:re(e.dataset)??{at:0,kind:`created`}}}function Ye(e){return e.dataset.pinned===`true`}function x(e){let{stored:t,activity:n}=Je(e);return r(Ye(e),t,n,D.filter)}var S=document.querySelector(`[data-bulk]`),Xe=document.querySelector(`[data-bulk-count]`),Ze=document.querySelector(`[data-bulk-delete]`),Qe=document.querySelector(`[data-bulk-question]`),C=document.querySelector(`[data-bulk-confirm]`),w=document.querySelector(`[data-bulk-actions]`),T=document.querySelector(`[data-bulk-error]`),E=document.querySelector(`[data-bulk-select-all]`),D=oe(window.location.hash),O=new Set,k=!1,A=document.querySelector(`[data-bulk-fetch]`),j={},M=[],N=!1;function P(){let e=D.query.trim().toLowerCase();D.author!==``&&![...g?.options??[]].some(e=>e.value===D.author)&&(D.author=``);let t=le(ge(f.map(e=>({...Ke(e),searchText:e.dataset.searchText??``,author:e.dataset.author,card:e})),{...D,query:e}).map(e=>e.card),x);M=t;let n=ae(t,x,b),r=new Set(c.flatMap(e=>n[e].shown));for(let e of f)e.hidden=!r.has(e);for(let e of c){let t=Ge[e];t&&Le(t,n[e].shown);let r=document.querySelector(`[data-load-more="${e}"]`);r&&(r.hidden=n[e].total<=n[e].shown.length);let i=document.querySelector(`[data-section="${e}"]`);i&&(i.hidden=n[e].total===0);let a=i?.querySelector(`[data-section-count]`);a&&(a.textContent=String(n[e].total))}if(m&&m.value!==D.query&&(m.value=D.query),g&&(g.value=D.author,D.author===``?delete g.dataset.active:g.dataset.active=``),_||(D.pr=`any`),_&&(_.value=D.pr,D.pr===`any`?delete _.dataset.active:_.dataset.active=``),h&&(h.value=D.filter,D.filter===`all`?delete h.dataset.active:h.dataset.active=``),y&&(y.hidden=!ue(D)),v){let e=e=>e.reduce((e,t)=>e+Number(t.dataset.reviews??1),0);v.textContent=me(e(t),t.length,ue(D)?e(f):void 0)}qe&&(qe.hidden=t.length>0||f.length===0),it(t)}var $e=300,F=null;function I(){F!==null&&window.clearTimeout(F),F=null,d.replace(Ee(D),{})}function L(e,t){if(D={...D,...e},b=u(),P(),t===`now`)return I();F!==null&&window.clearTimeout(F),F=window.setTimeout(I,$e)}window.addEventListener(`pagehide`,()=>{F!==null&&I()}),document.addEventListener(`click`,e=>{F!==null&&e.target?.closest?.(`a[href]`)&&I()},!0),m?.addEventListener(`input`,()=>L({query:m.value},`settled`)),m?.addEventListener(`keydown`,e=>{e.key===`Escape`&&m.value!==``&&(e.preventDefault(),L({query:``},`now`))}),h?.addEventListener(`change`,()=>{L({filter:h.value},`now`)}),g?.addEventListener(`change`,()=>{L({author:g.value},`now`)}),_?.addEventListener(`change`,()=>{L({pr:_.value},`now`)}),y?.addEventListener(`click`,()=>{L({query:l.query,filter:l.filter,author:l.author,pr:l.pr},`now`),m?.focus()});for(let e of document.querySelectorAll(`.prb-index-status`))e.addEventListener(`click`,t=>{let n=e.querySelector(`select`);if(!(!n||t.target instanceof Node&&n.contains(t.target))){t.preventDefault(),n.focus();try{n.showPicker()}catch{}}});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-load-more]`)?.dataset.loadMore;!t||!c.includes(t)||(b={...b,[t]:b[t]+15},P())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{D=oe(window.location.hash),b=u(),P(),tt()});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;Re(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),Y(n),P())})});async function et(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}R(n),P()}function R(e){let n=new Map(e.map((e,t)=>[e,t]));for(let e of f){let t=n.get(e.dataset.id??``);t===void 0?delete e.dataset.queue:e.dataset.queue=String(t),t!==void 0&&e.dataset.lifecycle!==`active`&&(e.dataset.lifecycle=`active`,delete e.dataset.lifecycleAt,Y(e))}for(let e of document.querySelectorAll(`[data-queue-action][data-queue-id]`)){let r=n.has(e.dataset.queueId??``);e.dataset.queueAction=r?`remove`:`add`,e.textContent=t(r)}let r=document.querySelector(`[data-queue-option]`);r&&(r.textContent=be(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&&Be(t,n.hidden!==!1)});var z=document.querySelector(`.prb-shell > main`);function tt(){Ue(document,d.current().ui,{cards:f,pane:z,limits:b,reveal:e=>{b=e,P()}})}d.setCapturer(()=>Ve(document,f,b,z)),P(),tt();var B=Pe(document,{onOpen:V,onClose:V});function V(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-menu]`);if(!n)return;let r=t.closest(`[data-copy-id]`);if(r?.dataset.copyId){e.preventDefault(),e.stopPropagation(),ke(r,r.dataset.copyId);return}let i=t.closest(`[data-fetch-review]`);if(i?.dataset.fetchReview){e.preventDefault(),e.stopPropagation(),B.closeAll();let t=i.closest(`[data-card]`);t&&Et([t]);return}let a=t.closest(`[data-mark-status]`);if(a?.dataset.markId){e.preventDefault(),e.stopPropagation(),B.closeAll(),vt(a.dataset.markId,a.dataset.markStatus===`complete`);return}let o=t.closest(`[data-lifecycle-set]`);if(o?.dataset.lifecycleId){e.preventDefault(),e.stopPropagation(),B.closeAll(),yt([o.dataset.lifecycleId],o.dataset.lifecycleSet);return}let s=t.closest(`[data-queue-action]`);if(s?.dataset.queueId){e.preventDefault(),e.stopPropagation(),B.closeAll(),et(s.dataset.queueId,s.dataset.queueAction===`remove`?`remove`:`add`);return}if(t.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=n.querySelector(`[data-menu-items]`),r=n.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),r&&(r.hidden=!1),e.detail===0&&n.querySelector(`[data-cancel-delete]`)?.focus();return}if(t.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),V(n),e.detail===0&&n.querySelector(`[data-delete]`)?.focus();return}if(t.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),nt(n);return}e.preventDefault(),e.stopPropagation()});async function nt(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();rt(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{rt(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 rt(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 H(e){k=e,e||O.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`);U(),P()}function U(){C&&(C.hidden=!0),w&&(w.hidden=!1),T&&(T.hidden=!0,T.textContent=``)}function it(e){for(let e of f){let t=O.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!S||(S.hidden=!k,!k))return;let t=new Set(e.filter(at).map(e=>e.dataset.id)),n=[...O].filter(e=>!t.has(e)).length;Xe&&(Xe.textContent=o(O.size,n)),E&&(E.textContent=se(e.length),E.disabled=e.every(e=>O.has(e.dataset.id??``))),Ze&&(Ze.textContent=Te(ht()));for(let e of S.querySelectorAll(`[data-bulk-mark], [data-bulk-lifecycle], [data-bulk-queue], [data-bulk-delete]`))e.disabled=O.size===0;A&&(A.hidden=!je(j,Z(K())))}function at(e){return!e.hidden&&e.closest(`details`)?.open!==!1}for(let e of document.querySelectorAll(`details[data-section]`))e.addEventListener(`toggle`,()=>it(M));We(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`,()=>{H(!k)}),E?.addEventListener(`click`,()=>{for(let e of M)e.dataset.id&&O.add(e.dataset.id);U(),P()});function W(e){O.has(e)?O.delete(e):O.add(e),U(),P()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&W(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!k)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(),W(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!k||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),W(t.dataset.id))});var G=Ie({doc:document,item:`[data-card]`,link:`.prb-card-link`,walk:()=>M.filter(at),enterAllowed:()=>!k,background:()=>z,leadIn:e=>[...e.closest(`[data-cards]`)?.querySelectorAll(`[data-card]:not([hidden])`)??[]][0]===e?e.closest(`details[data-section]`)?.querySelector(`summary`)??null:null});function ot(){return G.holdsKeys()?G.current()?.querySelector(`:scope > [data-menu]`)??null:null}var st=8;function ct(e){let t=e.querySelector(`.prb-card-link`);t&&(t.focus({preventScroll:!0}),document.activeElement!==t&&document.activeElement?.blur(),F!==null&&I(),d.leaving(),lt=!0,window.location.assign(t.href))}var lt=!1,ut={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=M.slice(0,st);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=M.length===0?`No reviews match.`:M.length>e.length?`The first ${e.length} of ${v?.textContent??M.length}`:v?.textContent??``},o=()=>[...i.querySelectorAll(`.prb-palette-result`)],s=e=>{let n=f.find(t=>t.dataset.id===e?.dataset.resultId);n&&(t(),ct(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()}},dt={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 ft(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 pt=Object.fromEntries(c.map(e=>[`reviews.section.${e}`,ft(e)])),mt=_e(`reviews`,{...pt,"reviews.search":{available:()=>m!==null,panel:ut},"reviews.filters":{available:()=>h!==null,panel:dt},"reviews.next":{run:()=>G.move(1)},"reviews.previous":{run:()=>G.move(-1)},"reviews.open":{available:()=>G.enterOpens(),run:()=>G.open()},"reviews.openInNewTab":{available:()=>G.enterOpens(),run:()=>G.openInNewTab()},"reviews.menu":{available:()=>ot()!==null,run:()=>{let e=ot();e&&B.open(e,{focusFirst:!0,returnFocus:()=>G.refocus()})}}},{onOpen:()=>B.closeAll(),onSettle:()=>kt()});function K(){return le(f.filter(e=>O.has(e.dataset.id??``)),x)}function ht(){return K().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function q(e){T&&(T.textContent=e,T.hidden=!1)}function J(e){for(let t of S?.querySelectorAll(`button`)??[])t.disabled=e}async function gt(e){let t=[...O];if(t.length!==0){J(!0);try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok)return J(!1),q(`That could not be saved. The workspace server refused it.`)}catch{return J(!1),q(`The workspace server did not answer. It may have stopped.`)}_t(K(),e),J(!1),H(!1)}}function _t(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 a=t.querySelector(`[data-mark-status]`);a&&(a.dataset.markStatus=r,a.textContent=i(r))}}async function vt(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}_t(f.filter(t=>t.dataset.id===e),t),P()}async function yt(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),Y(e));return R(n.queue),P(),!0}function Y(e){let{stored:t,activity:r}=Je(e),i=e.querySelector(`[data-lifecycle-chip]`);if(i){let n=ve(Ye(e),t,r);i.textContent=n??``,i.hidden=n===void 0}for(let i of e.querySelectorAll(`[data-lifecycle-set]`)){let e=i.dataset.lifecycleSet;i.hidden=!n(e,t,r),i.textContent=ce(e,t,r)}}async function bt(e){let t=[...O];if(t.length===0)return;J(!0);let n=await yt(t,e);if(J(!1),!n)return q(`That could not be saved. The workspace server refused it or did not answer.`);H(!1)}async function xt(){let e=[...O];if(e.length===0)return;J(!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 J(!1),U(),q(`Nothing was deleted. The workspace server refused it.`)}catch{return J(!1),U(),q(`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 K())r.has(e.dataset.id??``)||e.remove();f=f.filter(e=>e.isConnected),O.clear();for(let e of r)O.add(e);if(J(!1),U(),n.length===0)return H(!1);P(),q([...new Set(n.map(e=>e.error))].join(` `))}async function St(){let e=K().map(e=>e.dataset.id??``).filter(Boolean);if(e.length===0)return;J(!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 J(!1),U(),q(`The workspace server did not answer. It may have stopped.`)}if(!t?.queue)return J(!1),U(),q(`Nothing was added. The workspace server refused it.`);R(t.queue);let n=t.refused??[];O.clear();for(let e of n)O.add(e.id);if(J(!1),U(),n.length===0)return H(!1);P(),q([...new Set(n.map(e=>e.error))].join(` `))}S?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-bulk-queue]`))return void St();let n=t.closest(`[data-bulk-mark]`);if(n)return void gt(n.dataset.bulkMark===`complete`);let r=t.closest(`[data-bulk-lifecycle]`);if(r)return void bt(r.dataset.bulkLifecycle);if(t.closest(`[data-bulk-delete]`)){Qe&&(Qe.textContent=De(ht())),w&&(w.hidden=!0),C&&(C.hidden=!1);return}if(t.closest(`[data-bulk-confirm-delete]`))return void xt();if(t.closest(`[data-bulk-cancel-delete]`))return U();if(t.closest(`[data-bulk-cancel]`))return H(!1)}),e(window,()=>window.location.reload());var X=`prb-fetch-summary`;function Z(e){return e.map(e=>({lineage:(e.dataset.lineage??e.dataset.id??``).split(` `).filter(Boolean)}))}function Ct(e){return Ne(Z(e),j)}function wt(){for(let e of f){let t=e.querySelector(`[data-fetch-review]`);t&&(t.hidden=!je(j,Z([e])))}}async function Tt(){try{let e=await fetch(`/fetch-updates`);if(!e.ok)return;j=(await e.json()).targets??{}}catch{return}wt(),P()}async function Et(e,t){let n=Ct(e);if(N||n.repositories===0)return;N=!0;let r=[A,...document.querySelectorAll(`[data-fetch-review]`)];for(let e of r)e&&(e.disabled=!0);t&&(t.textContent=Oe(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{}N=!1;for(let e of r)e&&(e.disabled=!1);t&&(t.textContent=Fe),P();let a=i??{repositories:n.repositories,fetched:0,failed:[],moved:0},o={kind:a.fetched<a.repositories?`failed`:`ready`,text:Ae(a)};if(a.moved>0||$){try{window.sessionStorage.setItem(X,JSON.stringify(o))}catch{}if(!Ot())return void window.location.reload();$=!0}Se(he(),o)}try{let e=window.sessionStorage.getItem(X);if(e){window.sessionStorage.removeItem(X);let t=JSON.parse(e);typeof t.kind==`string`&&typeof t.text==`string`&&Se(he(),{kind:t.kind,text:t.text})}}catch{}A?.addEventListener(`click`,()=>void Et(K(),A)),Tt();var Dt=document.body.dataset.indexRevision??``,Q=document.body.dataset.live===`true`?Date.now():0,$=!1;function Ot(){return O.size>0||document.activeElement===m||N||mt.isOpen()||lt}function kt(){$&&!Ot()&&window.location.reload()}async function At(){try{let e=await fetch(`/revision`);if(e.ok){Ce(document,!0);let t=await e.json();xe(document,t),t.live&&Q===0&&(Q=Date.now()),t.live||(Q=0);let n=ie(Dt,t.revision??``,Ot());if(n===`reload`)return void window.location.reload();n===`hold`&&($=!0)}}catch{Ce(document,!1)}window.setTimeout(()=>void At(),Me(Q===0?2**53-1:Date.now()-Q))}At(),m?.addEventListener(`blur`,kt),document.addEventListener(`click`,()=>window.setTimeout(kt,0)),ye();
|
package/static/settings.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$ as e,W as t,c as n,d as r,i,t as a}from"./chunk-BMAMO0Tf.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`,n(document,`unreachable`);let t=document.createElement(`div`);t.className=`prb-stopped-notice`,t.setAttribute(`role`,`status`);let r=document.body.dataset.wayBack;t.textContent=r?`Workspace server stopped. This page is no longer being served. Run ${r} 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`),t(),r(`global`,{}),a(`/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()),i(document,window,{paintUnread:!0}),e(window,()=>window.location.reload());
|
package/static/shell.css
CHANGED
|
@@ -649,8 +649,8 @@ body[data-restarting] .prb-body { opacity: 0.55; pointer-events: none; }
|
|
|
649
649
|
leaves is not the same thing either -- the title eats the left side, the rail shifts the column
|
|
650
650
|
right, and the group lands short of the list by half the rail.
|
|
651
651
|
So the title is given the rail's own width and the group the column's, from the same two numbers
|
|
652
|
-
the layout below already uses. The search
|
|
653
|
-
|
|
652
|
+
the layout below already uses. The search spans the column, so its edges are the cards' edges
|
|
653
|
+
at every width wide enough to have a rail. */
|
|
654
654
|
/* Scoped with :has() and not by a body class: all three workspace pages share `prb-index-body`,
|
|
655
655
|
and only this bar holds the list's controls. */
|
|
656
656
|
.prb-context:has(.prb-index-controls) { padding-left: 0; padding-right: 0; column-gap: 0; }
|
|
@@ -661,9 +661,11 @@ body[data-restarting] .prb-body { opacity: 0.55; pointer-events: none; }
|
|
|
661
661
|
max-width: 960px;
|
|
662
662
|
margin: 0 auto;
|
|
663
663
|
padding: 0 24px;
|
|
664
|
-
justify-content: flex-end;
|
|
665
664
|
}
|
|
666
|
-
|
|
665
|
+
/* Two rows: the search on its own, the filters below it. Search is how a reviewer finds a review and
|
|
666
|
+
the filters refine what it found, so the search takes the column's whole width rather than
|
|
667
|
+
competing with three dropdowns for it, and the filters sit together under its left edge. */
|
|
668
|
+
.prb-context .prb-index-search { flex: 1 1 100%; padding: 6px 10px; font-size: var(--t-meta); }
|
|
667
669
|
.prb-context-controls {
|
|
668
670
|
display: flex;
|
|
669
671
|
align-items: center;
|
|
@@ -3191,12 +3193,36 @@ a.prb-guide-pick { text-decoration: none; }
|
|
|
3191
3193
|
font: inherit;
|
|
3192
3194
|
cursor: pointer;
|
|
3193
3195
|
}
|
|
3196
|
+
/* A select is as wide as its longest option. Review state and PR have a handful of short, fixed
|
|
3197
|
+
ones, so that width is already predictable; Author's are "Name · @login" for whoever opened a
|
|
3198
|
+
pull request, and one long name made the box wide enough to crowd the row. So Author's width is
|
|
3199
|
+
set, and a long name that is selected is cut short. */
|
|
3200
|
+
.prb-index-status select[data-author-filter] { width: 11em; text-overflow: ellipsis; }
|
|
3194
3201
|
.prb-index-status select:focus-visible { outline: none; }
|
|
3195
3202
|
.prb-index-status:has(select[data-active]) { border-color: var(--brand); background-color: var(--brand); color: var(--on-brand-quiet); }
|
|
3196
3203
|
.prb-index-status select[data-active] { color: var(--on-brand); }
|
|
3197
3204
|
/* The GitHub mark on Author and PR. currentColor, so it is muted beside "Author:" at rest and goes
|
|
3198
3205
|
light with it once the filter fills. */
|
|
3199
3206
|
.prb-index-forge-mark { flex: none; margin-right: 6px; }
|
|
3207
|
+
/* Clear filters: a quiet text action at the end of the filter row, not a fourth box beside three
|
|
3208
|
+
that are. No taller than the filters, so the row does not move when it appears or goes. */
|
|
3209
|
+
.prb-index-clear {
|
|
3210
|
+
display: inline-flex;
|
|
3211
|
+
align-items: center;
|
|
3212
|
+
gap: 5px;
|
|
3213
|
+
padding: 6px 8px;
|
|
3214
|
+
border: 0;
|
|
3215
|
+
border-radius: 6px;
|
|
3216
|
+
background: transparent;
|
|
3217
|
+
color: var(--text-muted);
|
|
3218
|
+
font: inherit;
|
|
3219
|
+
font-size: var(--t-meta);
|
|
3220
|
+
cursor: pointer;
|
|
3221
|
+
}
|
|
3222
|
+
.prb-index-clear:hover { background: var(--surface-2); color: var(--text-primary); }
|
|
3223
|
+
.prb-index-clear:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -2px; }
|
|
3224
|
+
/* `display` above beats the `hidden` attribute. */
|
|
3225
|
+
.prb-index-clear[hidden] { display: none; }
|
|
3200
3226
|
|
|
3201
3227
|
.prb-cards {
|
|
3202
3228
|
display: flex;
|
|
@@ -5226,10 +5252,11 @@ span.prb-arch-location:hover { text-decoration: none; }
|
|
|
5226
5252
|
* and it serves the light theme unchanged because the light `--text-muted` is within a hair of it.
|
|
5227
5253
|
* Change either and check the other. Same for the filled state below, which is `--on-brand`.
|
|
5228
5254
|
*
|
|
5229
|
-
*
|
|
5230
|
-
* control
|
|
5255
|
+
* Every select in the workspace is listed here rather than each carrying its own copy: it is one
|
|
5256
|
+
* control in several sizes, and a caret that differed between them would be a bug nobody could name. */
|
|
5231
5257
|
.prb-index-status select,
|
|
5232
|
-
.prb-settings-field select
|
|
5258
|
+
.prb-settings-field select,
|
|
5259
|
+
select.prb-addreview-control {
|
|
5233
5260
|
appearance: none;
|
|
5234
5261
|
-webkit-appearance: none;
|
|
5235
5262
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
|
|
@@ -5242,6 +5269,48 @@ span.prb-arch-location:hover { text-decoration: none; }
|
|
|
5242
5269
|
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");
|
|
5243
5270
|
}
|
|
5244
5271
|
|
|
5272
|
+
/* The filters' open menus, drawn as the workspace's own menus where the browser lets a page style
|
|
5273
|
+
a select's picker (Chrome 135 and later), and left to the operating system everywhere else. Still
|
|
5274
|
+
a native select either way, so the keyboard, the screen reader and the code reading its value are
|
|
5275
|
+
the browser's, not ours. The panel and its rows match the card menu's (.prb-menu-panel). */
|
|
5276
|
+
@supports (appearance: base-select) {
|
|
5277
|
+
.prb-index-status select,
|
|
5278
|
+
.prb-index-status select::picker(select) { appearance: base-select; }
|
|
5279
|
+
/* The caret above already draws the chevron. */
|
|
5280
|
+
.prb-index-status select::picker-icon { display: none; }
|
|
5281
|
+
/* Hung from the whole box, label and all, and at least as wide as it: the select is only the
|
|
5282
|
+
part after "Author:", so anchored to it the menu started part-way along the control. */
|
|
5283
|
+
.prb-index-status { anchor-name: --prb-filter; anchor-scope: --prb-filter; }
|
|
5284
|
+
.prb-index-status select::picker(select) {
|
|
5285
|
+
position-anchor: --prb-filter;
|
|
5286
|
+
position-area: bottom span-right;
|
|
5287
|
+
min-width: anchor-size(width);
|
|
5288
|
+
margin-top: 6px;
|
|
5289
|
+
padding: 5px;
|
|
5290
|
+
border: 1px solid var(--border);
|
|
5291
|
+
border-radius: 9px;
|
|
5292
|
+
background: var(--surface-raised);
|
|
5293
|
+
box-shadow: 0 10px 28px var(--shadow-float);
|
|
5294
|
+
}
|
|
5295
|
+
.prb-index-status option {
|
|
5296
|
+
gap: 8px;
|
|
5297
|
+
padding: 7px 9px;
|
|
5298
|
+
border-radius: 6px;
|
|
5299
|
+
color: var(--text-secondary);
|
|
5300
|
+
font-size: var(--t-meta);
|
|
5301
|
+
cursor: pointer;
|
|
5302
|
+
}
|
|
5303
|
+
.prb-index-status option:hover,
|
|
5304
|
+
.prb-index-status option:focus-visible { outline: none; background: var(--surface-2); color: var(--text-primary); }
|
|
5305
|
+
.prb-index-status option:checked { background: var(--brand-muted); color: var(--brand-ink); }
|
|
5306
|
+
.prb-index-status option::checkmark { color: var(--brand-ink); }
|
|
5307
|
+
/* Author's chosen name, cut short inside its fixed width. A base-select draws the value in a box
|
|
5308
|
+
of its own that wraps rather than truncates, so the page supplies that box (reviews_page.ts)
|
|
5309
|
+
and the ellipsis goes on it. */
|
|
5310
|
+
.prb-index-status select > button { all: unset; display: block; min-width: 0; width: 100%; }
|
|
5311
|
+
.prb-index-status selectedcontent { display: block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
5312
|
+
}
|
|
5313
|
+
|
|
5245
5314
|
/* Outlined rather than filled: it is the destructive one, and a solid red block in a page of
|
|
5246
5315
|
settings would pull the eye to the only thing here nobody came to do. */
|
|
5247
5316
|
.prb-settings-danger {
|
|
@@ -6026,7 +6095,9 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
|
|
|
6026
6095
|
.prb-addreview-paste { resize: vertical; min-height: 5.5em; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace; font-size: var(--t-meta); }
|
|
6027
6096
|
.prb-addreview-rows { display: flex; flex-direction: column; gap: 6px; max-height: 32vh; margin: 0; padding: 0; overflow: auto; list-style: none; }
|
|
6028
6097
|
.prb-addreview-rows:empty { display: none; }
|
|
6029
|
-
|
|
6098
|
+
/* A border as well as the fill: in dark the fill is the dialog's own colour (--surface and
|
|
6099
|
+
--surface-raised are one value there), so without it a row has no edge. */
|
|
6100
|
+
.prb-addreview-row { display: flex; flex-direction: column; gap: 3px; padding: 6px 8px; border: 1px solid var(--border); border-radius: 6px; background: var(--surface); }
|
|
6030
6101
|
.prb-addreview-row-head { display: flex; align-items: baseline; gap: 8px; font-size: var(--t-meta); font-weight: 600; }
|
|
6031
6102
|
.prb-addreview-mark { flex: none; width: 1em; text-align: center; color: var(--success); }
|
|
6032
6103
|
.prb-addreview-row[data-state='problem'] .prb-addreview-mark { color: var(--danger); }
|
|
@@ -6047,6 +6118,11 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
|
|
|
6047
6118
|
font-size: var(--t-meta);
|
|
6048
6119
|
}
|
|
6049
6120
|
.prb-addreview-control:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -1px; }
|
|
6121
|
+
/* Room for the shared caret (see "The caret on a menu"), as the other selects leave it. */
|
|
6122
|
+
select.prb-addreview-control { padding-right: 32px; }
|
|
6123
|
+
/* Agent, Model and Base are short values, so their controls are sized as Settings sizes its fields
|
|
6124
|
+
rather than stretched across the dialog; the help under Model keeps the full width. */
|
|
6125
|
+
.prb-addreview-grid > .prb-addreview-control { justify-self: start; width: 100%; max-width: 320px; box-sizing: border-box; }
|
|
6050
6126
|
.prb-addreview-options summary { cursor: pointer; color: var(--text-secondary); font-size: var(--t-micro); font-weight: 600; }
|
|
6051
6127
|
.prb-addreview-grid { display: grid; grid-template-columns: max-content 1fr; align-items: center; gap: 6px 12px; margin: 8px 0 0; }
|
|
6052
6128
|
.prb-addreview-key { color: var(--text-muted); font-size: var(--t-micro); }
|
|
@@ -6075,6 +6151,67 @@ body .prb-body[data-focus]:not([data-focus='buddy']) .prb-ask-tab { top: 64px; }
|
|
|
6075
6151
|
.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); }
|
|
6076
6152
|
.prb-addreview-error { margin: 0 2px; color: var(--danger-ink); font-size: var(--t-micro); }
|
|
6077
6153
|
.prb-addreview-recent { max-height: 30vh; }
|
|
6154
|
+
.prb-addreview-config,
|
|
6155
|
+
.prb-addreview-progress { display: flex; flex-direction: column; gap: 8px; }
|
|
6156
|
+
.prb-addreview-problemblock { display: flex; flex-direction: column; gap: 4px; }
|
|
6157
|
+
.prb-addreview-problemblock:not(:has(> :not([hidden]))) { display: none; }
|
|
6158
|
+
/* The whole text of a failure, kept for diagnosing it and folded away from reading it. */
|
|
6159
|
+
.prb-addreview-technical { margin: 0 2px; font-size: var(--t-micro); }
|
|
6160
|
+
.prb-addreview-row .prb-addreview-technical { margin-left: calc(1em + 8px); }
|
|
6161
|
+
.prb-addreview-technical summary { cursor: pointer; color: var(--text-muted); }
|
|
6162
|
+
.prb-addreview-technical pre {
|
|
6163
|
+
max-height: 14em;
|
|
6164
|
+
margin: 4px 0 0;
|
|
6165
|
+
padding: 6px 8px;
|
|
6166
|
+
overflow: auto;
|
|
6167
|
+
border: 1px solid var(--border);
|
|
6168
|
+
border-radius: 6px;
|
|
6169
|
+
background: var(--surface-raised);
|
|
6170
|
+
color: var(--text-secondary);
|
|
6171
|
+
font-size: var(--t-micro);
|
|
6172
|
+
white-space: pre-wrap;
|
|
6173
|
+
overflow-wrap: anywhere;
|
|
6174
|
+
}
|
|
6175
|
+
/* A path as where it is, muted, and its own name, which is what tells two worktrees apart. */
|
|
6176
|
+
.prb-addreview-path { overflow-wrap: anywhere; }
|
|
6177
|
+
.prb-addreview-path-name,
|
|
6178
|
+
.prb-palette-result-where .prb-addreview-path-name { color: var(--text-secondary); }
|
|
6179
|
+
/* Choose a base branch: the ambiguous-base question, asked beside the folder it is about. */
|
|
6180
|
+
.prb-addreview-choice { display: flex; flex-direction: column; gap: 6px; padding: 8px 10px; border-radius: 6px; background: var(--warning-wash); }
|
|
6181
|
+
.prb-addreview-choice-title { margin: 0; font-size: var(--t-meta); font-weight: 600; }
|
|
6182
|
+
.prb-addreview-choice-text { margin: 0; color: var(--text-secondary); font-size: var(--t-micro); }
|
|
6183
|
+
.prb-addreview-choice-options { display: flex; flex-direction: column; gap: 4px; }
|
|
6184
|
+
.prb-addreview-choice-option { display: flex; align-items: baseline; gap: 6px; font-size: var(--t-meta); cursor: pointer; }
|
|
6185
|
+
.prb-addreview-choice-what { color: var(--text-muted); font-size: var(--t-micro); }
|
|
6186
|
+
.prb-addreview-choice .prb-addreview-technical { margin: 0; }
|
|
6187
|
+
/* Progress: one row per started review, scrolling inside the palette for a long batch. */
|
|
6188
|
+
.prb-addreview-summary { margin: 0 2px; font-size: var(--t-meta); font-weight: 600; }
|
|
6189
|
+
.prb-addreview-progress .prb-addreview-rows { max-height: 46vh; }
|
|
6190
|
+
.prb-addreview-row:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -2px; }
|
|
6191
|
+
.prb-addreview-badge { margin-left: auto; flex: none; color: var(--text-muted); font-size: var(--t-micro); font-weight: 400; }
|
|
6192
|
+
.prb-addreview-row[data-status='reviewing'] .prb-addreview-mark,
|
|
6193
|
+
.prb-addreview-row[data-status='waiting'] .prb-addreview-mark { color: var(--text-muted); }
|
|
6194
|
+
.prb-addreview-row[data-status='failed'] .prb-addreview-badge { color: var(--danger-ink); }
|
|
6195
|
+
.prb-addreview-retry,
|
|
6196
|
+
.prb-addreview-helplink {
|
|
6197
|
+
align-self: flex-start;
|
|
6198
|
+
padding: 0;
|
|
6199
|
+
border: 0;
|
|
6200
|
+
background: none;
|
|
6201
|
+
color: var(--link);
|
|
6202
|
+
font: inherit;
|
|
6203
|
+
font-size: var(--t-micro);
|
|
6204
|
+
text-decoration: underline;
|
|
6205
|
+
cursor: pointer;
|
|
6206
|
+
}
|
|
6207
|
+
.prb-addreview-retry { margin-left: calc(1em + 8px); }
|
|
6208
|
+
.prb-addreview-retry:disabled { opacity: 0.5; cursor: default; }
|
|
6209
|
+
.prb-addreview-retry:focus-visible,
|
|
6210
|
+
.prb-addreview-helplink:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
|
|
6211
|
+
.prb-addreview-modelhelp { grid-column: 2; display: flex; flex-direction: column; gap: 4px; }
|
|
6212
|
+
.prb-addreview-help { margin: 0; color: var(--text-secondary); font-size: var(--t-micro); }
|
|
6213
|
+
.prb-addreview code,
|
|
6214
|
+
.prb-addreview pre { font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace; }
|
|
6078
6215
|
|
|
6079
6216
|
/* ── Feedback selection ──
|
|
6080
6217
|
Choosing the Issues and Questions to raise with the author. The checkboxes ship on every card
|