pierre-review 0.1.11 → 0.1.13
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/dist/api/routes/auth.js +19 -18
- package/package.json +1 -1
- package/public/assets/{index-CmBy7cnw.js → index-C3UqK6P1.js} +1 -1
- package/public/assets/index-xfGfsqU7.css +10 -0
- package/public/index.html +2 -2
- package/public-landing/assets/{index-C9adkFFb.js → index-C0SBF1kW.js} +9 -9
- package/public-landing/assets/{index-BtpOo-9R.css → index-a50qd0Kt.css} +1 -1
- package/public-landing/index.html +2 -2
- package/public-landing/shots/claude-review.png +0 -0
- package/public-landing/shots/pr-detail.png +0 -0
- package/public-landing/shots/timeline.png +0 -0
- package/public/assets/index-Clz3ZP40.css +0 -10
package/dist/api/routes/auth.js
CHANGED
|
@@ -26,6 +26,14 @@ export async function authRoutes(app) {
|
|
|
26
26
|
// Verify state → exchange code for a token → fetch the user → upsert account →
|
|
27
27
|
// set session → 302 to the app.
|
|
28
28
|
app.get('/api/auth/callback', async (req, reply) => {
|
|
29
|
+
// Already signed in? The callback URL carries a one-time ?code= that GitHub
|
|
30
|
+
// expires in ~10 min and invalidates on first use. A back-button, a restored
|
|
31
|
+
// tab, or a Chrome profile switch can re-request this exact URL; re-running the
|
|
32
|
+
// exchange would then fail on the already-consumed code ("code incorrect or
|
|
33
|
+
// expired"). Short-circuit a valid session straight to the app instead.
|
|
34
|
+
if (req.session.get('accountId') != null) {
|
|
35
|
+
return reply.redirect('/app');
|
|
36
|
+
}
|
|
29
37
|
const { code, state } = req.query;
|
|
30
38
|
const rawCookie = req.cookies.pierre_oauth_state;
|
|
31
39
|
const unsigned = rawCookie
|
|
@@ -33,9 +41,9 @@ export async function authRoutes(app) {
|
|
|
33
41
|
: { valid: false, value: null };
|
|
34
42
|
reply.clearCookie('pierre_oauth_state', { path: '/' });
|
|
35
43
|
if (!code || !state || !unsigned.valid || unsigned.value !== state) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
// Stale/replayed callback (state cookie expired or CSRF mismatch). Bounce
|
|
45
|
+
// back so the user starts a fresh sign-in — never render raw JSON to a human.
|
|
46
|
+
return reply.redirect('/app?auth=expired');
|
|
39
47
|
}
|
|
40
48
|
// Exchange the code for a user access token.
|
|
41
49
|
let token;
|
|
@@ -52,18 +60,14 @@ export async function authRoutes(app) {
|
|
|
52
60
|
});
|
|
53
61
|
const json = (await res.json());
|
|
54
62
|
if (!json.access_token) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
message: `OAuth token exchange failed: ${json.error_description ?? json.error ?? 'no token'}`,
|
|
58
|
-
});
|
|
63
|
+
req.log.warn({ err: json.error_description ?? json.error }, 'oauth token exchange returned no token');
|
|
64
|
+
return reply.redirect('/app?auth=failed');
|
|
59
65
|
}
|
|
60
66
|
token = json.access_token;
|
|
61
67
|
}
|
|
62
68
|
catch (err) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
message: `OAuth exchange request failed: ${err instanceof Error ? err.message : err}`,
|
|
66
|
-
});
|
|
69
|
+
req.log.error({ err }, 'oauth token exchange request failed');
|
|
70
|
+
return reply.redirect('/app?auth=error');
|
|
67
71
|
}
|
|
68
72
|
// Identify the user.
|
|
69
73
|
let user;
|
|
@@ -76,17 +80,14 @@ export async function authRoutes(app) {
|
|
|
76
80
|
},
|
|
77
81
|
});
|
|
78
82
|
if (!res.ok) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.send({ error: 'Unauthorized', message: 'Failed to fetch GitHub user.' });
|
|
83
|
+
req.log.warn({ status: res.status }, 'failed to fetch github user');
|
|
84
|
+
return reply.redirect('/app?auth=failed');
|
|
82
85
|
}
|
|
83
86
|
user = (await res.json());
|
|
84
87
|
}
|
|
85
88
|
catch (err) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
message: `Fetching GitHub user failed: ${err instanceof Error ? err.message : err}`,
|
|
89
|
-
});
|
|
89
|
+
req.log.error({ err }, 'fetching github user failed');
|
|
90
|
+
return reply.redirect('/app?auth=error');
|
|
90
91
|
}
|
|
91
92
|
const account = await upsertCloudAccount({
|
|
92
93
|
githubUserId: user.node_id,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pierre-review",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "Dashboard for tracking your team's GitHub PR activity across repos — local (SQLite + gh) or self-hosted multi-tenant cloud (Postgres + GitHub App).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Alex Wakeman",
|
|
@@ -1368,4 +1368,4 @@ ${e.suggestion}
|
|
|
1368
1368
|
`).map((be,ke)=>x.jsx("div",{className:tTe(be),children:be===""?" ":be},ke))}),x.jsx("div",{className:"mt-1",children:x.jsx(Xl,{children:e.body})}),e.suggestion!=null&&e.suggestion!==""&&x.jsx("pre",{className:"mt-1 overflow-x-auto rounded bg-gray-100 px-2 py-1.5 font-mono text-xs dark:bg-gray-800",children:x.jsx("code",{children:e.suggestion})}),k&&!p&&x.jsxs("div",{className:"mt-1.5 rounded border border-blue-200 bg-blue-50/50 px-2 py-1 dark:border-blue-900/50 dark:bg-blue-900/10",children:[x.jsx("div",{className:"text-[10px] uppercase tracking-wide text-blue-500",children:"Your reword (posts instead of Claude's)"}),x.jsx(Xl,{children:e.editedBody})]}),t&&(p?x.jsxs("div",{className:"mt-2 space-y-1",children:[x.jsx("textarea",{value:y,onChange:be=>_(be.target.value),rows:4,placeholder:"Reword this finding in your own words (markdown). This is what gets posted as the inline comment.",className:"w-full rounded border border-gray-300 bg-white px-2 py-1.5 font-mono text-xs dark:border-gray-700 dark:bg-gray-900"}),x.jsxs("div",{className:"flex flex-wrap gap-2",children:[x.jsx("button",{type:"button",onClick:H,className:"rounded border border-blue-400 px-2 py-0.5 text-xs text-blue-600 hover:bg-blue-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-900/30",children:"Save reword"}),x.jsx("button",{type:"button",onClick:()=>{v(!1),_(e.editedBody??"")},className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",children:"Cancel"}),k&&x.jsx("button",{type:"button",onClick:V,className:"rounded border border-gray-300 px-2 py-0.5 text-xs text-gray-500 hover:border-gray-400 dark:border-gray-700",children:"Clear reword"})]})]}):x.jsx("button",{type:"button",onClick:()=>{_(e.editedBody??""),v(!0)},className:"mt-1.5 text-xs text-blue-600 hover:underline dark:text-blue-400",children:k?"Edit reword":"Reword in my words"}))]}),x.jsxs("div",{className:"flex shrink-0 flex-col items-end gap-1",children:[x.jsx("button",{type:"button",onClick:K,className:"rounded border border-gray-300 px-1.5 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",children:c?"Copied":"Copy"}),x.jsxs("label",{className:"flex items-center gap-1 text-xs text-gray-500",title:"Include this finding as an inline comment in the full review",children:[x.jsx("input",{type:"checkbox",checked:e.included,disabled:!t||!e.anchored,onChange:be=>s(be.target.checked)}),"include"]})]})]}),(B||P||a!=null)&&x.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2 border-t border-gray-100 pt-2 dark:border-gray-800",children:[B&&x.jsx("button",{type:"button",onClick:ae,disabled:ue,title:"Post just this finding as a single inline comment on the PR (no review submitted)",className:"whitespace-nowrap rounded border border-blue-400 px-2 py-0.5 text-xs text-blue-600 hover:bg-blue-50 disabled:opacity-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-900/30",children:ue?"Posting…":P?"Post again as comment":"Post as comment"}),B&&x.jsx("span",{className:"text-[11px] text-gray-400",children:I?"posts your reworded text":"posts Claude's text"}),P&&(Q!=null?x.jsx("a",{href:Q,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-green-700 hover:underline dark:text-green-400",children:"view comment ↗"}):x.jsx("span",{className:"text-xs text-green-700 dark:text-green-400",children:"posted ✓"})),a!=null&&x.jsx("span",{className:"ml-auto text-xs text-red-500",children:a})]})]})}function rTe({review:e,editable:t,prUrl:n,postingFindingId:r,postErrorFindingId:a,postErrorMessage:s,onToggleFinding:o,onRewordFinding:l,onPostFinding:c}){const d=[...e.findings].sort((h,p)=>s2[h.severity]-s2[p.severity]);return x.jsxs("div",{className:"space-y-2 px-4 py-3",children:[x.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:["Claude's review",e.verdict!=null&&x.jsx(Xwe,{verdict:e.verdict}),e.scope!=null&&x.jsx("span",{className:"rounded bg-gray-500/10 px-1.5 py-0.5 text-xs text-gray-500",children:e.scope})]}),x.jsx("div",{className:"text-xs text-gray-500",children:Jwe(e)}),e.summary!=null&&e.summary!==""&&x.jsx("div",{className:"text-sm",children:x.jsx(Xl,{children:e.summary})}),d.length>0?x.jsx("ul",{className:"space-y-2",children:d.map(h=>x.jsx(nTe,{finding:h,editable:t,prUrl:n,posting:r===h.id,postError:a===h.id?s:null,onToggle:p=>o(h.id,p),onReword:p=>l(h.id,p),onPostComment:()=>c(h.id)},h.id))}):x.jsx("div",{className:"text-xs text-gray-400",children:"No line-level findings."})]})}function o2({prId:e,hasUserKey:t,prominent:n}){var h;const r=Vwe(e),[a,s]=U.useState(""),[o,l]=U.useState(n),c=p=>{r.mutate(p,{onSuccess:()=>s("")})},d=x.jsxs("div",{className:"space-y-1.5",children:[x.jsx("div",{className:"text-sm font-semibold",children:"Anthropic API key (optional)"}),x.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:"Paste a key to use your own Anthropic billing for reviews. Stored locally only — never sent to any server but Anthropic."}),t&&x.jsx("div",{className:"text-xs text-green-700 dark:text-green-400",children:"✓ Using your stored Anthropic key"}),x.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[x.jsx("input",{type:"password",value:a,onChange:p=>s(p.target.value),placeholder:t?"Replace stored key…":"sk-ant-…",autoComplete:"off",spellCheck:!1,className:"min-w-0 flex-1 rounded border border-gray-300 bg-white px-2 py-1 font-mono text-sm dark:border-gray-700 dark:bg-gray-900"}),x.jsx("button",{type:"button",onClick:()=>c(a),disabled:r.isPending||a.trim()==="",className:"rounded border border-blue-400 px-2 py-1 text-sm text-blue-600 hover:bg-blue-50 disabled:opacity-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-900/30",children:r.isPending?"Saving…":"Save"}),t&&x.jsx("button",{type:"button",onClick:()=>c(""),disabled:r.isPending,className:"rounded border border-gray-300 px-2 py-1 text-sm text-gray-500 hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:"Clear"})]}),r.isError&&x.jsx("div",{className:"text-xs text-red-500",children:((h=r.error)==null?void 0:h.message)??"Failed to save the key."})]});return n?x.jsx("div",{className:"mt-3 rounded border border-gray-200 bg-gray-50 px-3 py-2 dark:border-gray-700 dark:bg-gray-800/50",children:d}):x.jsx("div",{className:"px-4 py-2",children:o?x.jsxs("div",{className:"rounded border border-gray-200 bg-gray-50 px-3 py-2 dark:border-gray-700 dark:bg-gray-800/50",children:[x.jsxs("div",{className:"mb-1 flex items-center justify-between",children:[x.jsx("span",{className:"text-xs uppercase tracking-wide text-gray-400",children:"Manage API key"}),x.jsx("button",{type:"button",onClick:()=>l(!1),className:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-200",children:"Hide"})]}),d]}):x.jsxs("button",{type:"button",onClick:()=>l(!0),className:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-200",children:["Manage API key",t&&x.jsx("span",{className:"ml-1 text-green-700 dark:text-green-400",children:"✓ stored key in use"})]})})}function iTe({pr:e,usersById:t}){var Te,Oe,et,gt,ut,Vt,Et;const n=Dr(),{data:r,isLoading:a}=$we(e.id),s=(r==null?void 0:r.review)??null,[o,l]=U.useState((s==null?void 0:s.model)??"claude-sonnet-4-6"),[c,d]=U.useState(!1),[h,p]=U.useState(""),[v,y]=U.useState("COMMENT"),[_,k]=U.useState(null),[S,I]=U.useState(null),[O,R]=U.useState(null),[D,$]=U.useState(!1),P=Hwe(e.id),Q=zwe(e.id),B=Ywe(e.id),K=Wwe(e.id),H=Kwe(e.id),V=jwe(e.id),X=V.isPending?((Te=V.variables)==null?void 0:Te.findingId)??null:null,ce=V.isError?((Oe=V.variables)==null?void 0:Oe.findingId)??null:null,ae=V.isError?((et=V.error)==null?void 0:et.message)??"Failed to post comment":null,ue=U.useRef(null);U.useEffect(()=>{if(s==null){ue.current=null;return}ue.current!==s.id&&(ue.current=s.id,p(s.userBody??""),y(s.userVerdict??"COMMENT"),k(s.id),l(s.model),I(null),R(null),$(!1))},[s]);const be=(s==null?void 0:s.status)==="running"||(s==null?void 0:s.status)==="queued",{data:ke}=Uwe(e.id,be),J=U.useRef(!1);U.useEffect(()=>{if(!be){J.current=!1;return}const Ze=ke==null?void 0:ke.status;(Ze==="succeeded"||Ze==="failed"||Ze==="cancelled"||Ze==="idle")&&!J.current&&(J.current=!0,n.invalidateQueries({queryKey:["claude-review",e.id]}))},[be,ke==null?void 0:ke.status,n,e.id]);const ye=_==null||_===(s==null?void 0:s.id),{data:F}=Bwe(ye?null:_);if(a)return x.jsx("div",{className:"px-4 py-3 text-sm text-gray-400",children:"Loading…"});if((r==null?void 0:r.enabled)===!1)return x.jsx("div",{className:"px-4 py-3",children:x.jsxs("div",{className:"rounded border border-gray-200 bg-gray-50 px-3 py-2 text-sm text-gray-600 dark:border-gray-700 dark:bg-gray-800/50 dark:text-gray-300",children:["Claude Review is disabled. Set"," ",x.jsx("code",{className:"font-mono text-xs",children:"ENABLE_CLAUDE_REVIEW=true"})," to turn it on."]})});const j=(s==null?void 0:s.status)==="succeeded"&&s.headSha===e.headSha,le=()=>{d(!1),I(null),R(null),P.mutate(o)},Y=()=>{j?d(!0):le()},Ae=ye?s:F??null,xe=ye&&s!=null,Qe=((gt=ke==null?void 0:ke.progress)==null?void 0:gt.phase)??null,Nt=Qe!=null?eTe[Qe]??Qe:"Starting…",bt=()=>{s!=null&&(R(null),H.mutate({reviewId:s.id,userVerdict:v,dryRun:!0},{onSuccess:Ze=>I(Ze)}))},Ce=()=>{s!=null&&($(!1),H.mutate({reviewId:s.id,userVerdict:v},{onSuccess:Ze=>R(Ze)}))};return x.jsxs("div",{className:"divide-y divide-gray-100 py-1 dark:divide-gray-800",children:[(r==null?void 0:r.auth)==="none"?x.jsxs("div",{className:"px-4 py-3",children:[x.jsxs("div",{className:"rounded border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-300",children:[x.jsx("div",{className:"font-semibold",children:"Claude authentication needed"}),x.jsx("div",{className:"mt-1",children:r.authMessage??"Claude is not authenticated. Set up Claude credentials to run a review."})]}),x.jsx(o2,{prId:e.id,hasUserKey:r.hasUserKey,prominent:!0})]}):x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"px-4 py-3",children:[x.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[x.jsx("label",{className:"text-xs uppercase tracking-wide text-gray-400",children:"Model"}),x.jsx("select",{value:o,onChange:Ze=>l(Ze.target.value),disabled:be||P.isPending,className:"rounded border border-gray-300 bg-white px-2 py-1 text-sm dark:border-gray-700 dark:bg-gray-900",children:r5.map(Ze=>x.jsx("option",{value:Ze,children:Ze},Ze))}),x.jsx("button",{type:"button",onClick:Y,disabled:be||P.isPending,className:"rounded border border-gray-300 px-2 py-1 text-sm hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:s==null?"Run review":"Re-review"}),x.jsx("span",{className:"font-mono text-xs text-gray-400",title:e.headSha??void 0,children:n1(e.headSha)})]}),c&&x.jsxs("div",{className:"mt-2 rounded border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-300",children:[x.jsxs("div",{children:["You already reviewed this exact commit (",x.jsx("span",{className:"font-mono",children:n1(e.headSha)}),"). Re-running will incur additional cost."]}),x.jsxs("div",{className:"mt-1.5 flex gap-2",children:[x.jsx("button",{type:"button",onClick:le,className:"rounded border border-amber-400 px-2 py-0.5 text-xs hover:bg-amber-100 dark:border-amber-600 dark:hover:bg-amber-900/40",children:"Run anyway"}),x.jsx("button",{type:"button",onClick:()=>d(!1),className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",children:"Cancel"})]})]}),P.isError&&x.jsx("div",{className:"mt-2 text-xs text-red-500",children:((ut=P.error)==null?void 0:ut.message)??"Failed to start review."})]}),r!=null&&x.jsx(o2,{prId:e.id,hasUserKey:r.hasUserKey,prominent:!1})]}),be&&x.jsx("div",{className:"px-4 py-3",children:x.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[x.jsx("span",{className:"inline-block h-3 w-3 animate-spin rounded-full border-2 border-gray-300 border-t-blue-500"}),x.jsxs("span",{children:[Nt,"…"]}),((Vt=ke==null?void 0:ke.progress)==null?void 0:Vt.message)!=null&&x.jsx("span",{className:"text-xs text-gray-400",children:ke.progress.message}),x.jsx("button",{type:"button",onClick:()=>Q.mutate(),disabled:Q.isPending,className:"ml-auto rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:"Cancel"})]})}),!be&&(s==null?void 0:s.status)==="failed"&&x.jsx("div",{className:"px-4 py-3",children:x.jsx("div",{className:"rounded border border-red-300 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-700/60 dark:bg-red-900/20 dark:text-red-400",children:s.error??"The review failed."})}),!be&&(s==null?void 0:s.status)==="cancelled"&&x.jsx("div",{className:"px-4 py-3 text-sm text-gray-400",children:"Review cancelled."}),r!=null&&r.history.length>1&&x.jsx(qwe,{label:"History",children:x.jsx("select",{value:_??(s==null?void 0:s.id)??"",onChange:Ze=>{k(Number(Ze.target.value)),I(null),R(null)},className:"rounded border border-gray-300 bg-white px-2 py-1 text-sm dark:border-gray-700 dark:bg-gray-900",children:r.history.map(Ze=>x.jsxs("option",{value:Ze.id,children:[n1(Ze.headSha)," · ",Ze.model," · ",Ze.status," ·"," ",Qx(Ze.createdAt),Ze.id===(s==null?void 0:s.id)?" (latest)":""]},Ze.id))})}),Ae!=null&&Ae.status==="succeeded"&&x.jsx(rTe,{review:Ae,editable:xe,prUrl:e.githubUrl,postingFindingId:X,postErrorFindingId:ce,postErrorMessage:ae,onToggleFinding:(Ze,sn)=>K.mutate({findingId:Ze,included:sn}),onRewordFinding:(Ze,sn)=>K.mutateAsync({findingId:Ze,editedBody:sn}),onPostFinding:Ze=>V.mutateAsync({findingId:Ze})}),xe&&s!=null&&s.status==="succeeded"&&x.jsxs("div",{className:"space-y-2 px-4 py-3",children:[x.jsx("div",{className:"text-sm font-semibold",children:"Overall review · the PR-level summary comment"}),x.jsxs("p",{className:"text-xs text-gray-400",children:["This is the single ",x.jsx("strong",{children:"top-level review comment"})," posted on the PR (GitHub's review summary), together with your verdict below. It is ",x.jsx("strong",{children:"not"})," a line comment — the inline comments come from the findings you tick ",x.jsx("em",{children:"include"})," above. Leave it short or empty if the inline comments say it all."]}),x.jsx("textarea",{value:h,onChange:Ze=>p(Ze.target.value),onBlur:()=>B.mutate({reviewId:s.id,userBody:h}),rows:6,placeholder:"Overall summary for the PR (markdown). Posted as the review's top-level comment…",className:"w-full rounded border border-gray-300 bg-white px-2 py-1.5 font-mono text-sm dark:border-gray-700 dark:bg-gray-900"}),x.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[x.jsx("button",{type:"button",onClick:()=>B.mutate({reviewId:s.id,userBody:h}),disabled:B.isPending,className:"rounded border border-gray-300 px-2 py-0.5 text-sm hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:"Save"}),x.jsx("label",{className:"text-xs uppercase tracking-wide text-gray-400",children:"Verdict"}),x.jsxs("select",{value:v,onChange:Ze=>{const sn=Ze.target.value;y(sn),B.mutate({reviewId:s.id,userVerdict:sn})},className:"rounded border border-gray-300 bg-white px-2 py-1 text-sm dark:border-gray-700 dark:bg-gray-900",children:[x.jsx("option",{value:"COMMENT",children:"Comment"}),x.jsx("option",{value:"REQUEST_CHANGES",children:"Request changes"}),x.jsx("option",{value:"APPROVE",children:"Approve"})]})]}),x.jsx("p",{className:"text-xs text-gray-400",children:"Claude's text above is reference only — use a finding's Reword box to post your own wording inline, or Copy to pull lines in here."})]}),xe&&s!=null&&s.status==="succeeded"&&x.jsxs("div",{className:"space-y-2 px-4 py-3",children:[x.jsx("div",{className:"text-sm font-semibold",children:"Post to GitHub"}),s.postedAt!=null&&x.jsx("div",{className:"text-xs text-gray-400",children:"Already posted — re-posting is still allowed."}),x.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[x.jsx("button",{type:"button",onClick:bt,disabled:H.isPending,className:"rounded border border-gray-300 px-2 py-0.5 text-sm hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:"Preview payload"}),D?x.jsxs("span",{className:"inline-flex items-center gap-2",children:[x.jsxs("span",{className:"text-xs text-gray-500",children:["Post as ",x.jsx("strong",{children:Px[v]}),"?"]}),x.jsx("button",{type:"button",onClick:Ce,disabled:H.isPending,className:"rounded border border-blue-400 px-2 py-0.5 text-xs text-blue-600 hover:bg-blue-50 disabled:opacity-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-900/30",children:"Confirm post"}),x.jsx("button",{type:"button",onClick:()=>$(!1),className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",children:"Cancel"})]}):x.jsx("button",{type:"button",onClick:()=>$(!0),disabled:H.isPending,className:"rounded border border-blue-400 px-2 py-0.5 text-sm text-blue-600 hover:bg-blue-50 disabled:opacity-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-900/30",children:"Post to GitHub"}),H.isPending&&x.jsx("span",{className:"text-xs text-gray-400",children:"working…"})]}),S!=null&&x.jsxs("div",{className:"rounded border border-gray-200 bg-gray-50 px-3 py-2 text-sm dark:border-gray-700 dark:bg-gray-800/50",children:[x.jsxs("div",{children:["Will post ",x.jsx("strong",{children:S.comments.length})," inline comment",S.comments.length===1?"":"s"," as"," ",x.jsx("strong",{children:Px[S.event]}),"."]}),S.skippedUnanchored.length>0&&x.jsxs("div",{className:"mt-1 text-xs text-gray-500",children:["Skipped (unanchored):"," ",S.skippedUnanchored.map(Ze=>Ze.title).join(", ")]})]}),O!=null&&x.jsxs("div",{className:"rounded border border-green-300 bg-green-50 px-3 py-2 text-sm text-green-700 dark:border-green-700/60 dark:bg-green-900/20 dark:text-green-400",children:[x.jsxs("div",{children:["Posted review #",O.postedReviewId??"?"," ·"," ",O.postedCommentCount," inline comment",O.postedCommentCount===1?"":"s"]}),O.skippedUnanchored.length>0&&x.jsxs("div",{className:"mt-1 text-xs text-green-700/80 dark:text-green-400/80",children:["Skipped (unanchored):"," ",O.skippedUnanchored.map(Ze=>Ze.title).join(", ")]})]}),H.isError&&x.jsx("div",{className:"text-xs text-red-500",children:((Et=H.error)==null?void 0:Et.message)??"Failed to post review to GitHub."})]})]})}function l2(e){if(!e)return null;const t=[];return e.comments>0&&t.push(`${e.comments} new comment${e.comments===1?"":"s"}`),e.reviews>0&&t.push(`${e.reviews} new review${e.reviews===1?"":"s"}`),e.commits>0&&t.push(`${e.commits} new commit${e.commits===1?"":"s"}`),t.length?t.join(" · "):null}const aTe={overview:"Overview",threads:"Threads",activity:"Activity",claude_review:"Claude Review"};function sTe(e){var n;const t=[];t.push({key:"opened",time:e.openedAt,label:"opened this PR",actorId:e.authorId,href:e.githubUrl,event:{type:"pr_opened",refId:null}});for(const r of e.commits)t.push({key:`commit:${r.id}`,time:r.committedAt,label:"pushed a commit",actorId:r.authorId??r.committerId,detail:(n=r.message)==null?void 0:n.split(`
|
|
1369
1369
|
`)[0],href:`${e.githubUrl}/commits/${r.sha}`,event:{type:"commit_pushed",refId:r.id}});for(const r of e.reviews)t.push({key:`review:${r.id}`,time:r.submittedAt,label:`reviewed (${r.state.replace("_"," ")})`,actorId:r.authorId,detail:r.body??void 0,href:r.url??e.githubUrl,event:{type:"review_submitted",refId:r.id}});for(const r of e.comments)t.push({key:`comment:${r.id}`,time:r.createdAt,label:"commented",actorId:r.authorId,detail:r.body,href:r.url??e.githubUrl,event:{type:"pr_comment",refId:r.id}});return e.mergedAt?t.push({key:"merged",time:e.mergedAt,label:"merged this PR",actorId:e.authorId,href:e.githubUrl,event:{type:"pr_merged",refId:null}}):e.closedAt&&t.push({key:"closed",time:e.closedAt,label:"closed this PR",actorId:e.authorId,href:e.githubUrl,event:{type:"pr_closed",refId:null}}),t.sort((r,a)=>a.time.localeCompare(r.time))}function oTe({pr:e,usersById:t,since:n,onClearSince:r,focusEvent:a,onConsumed:s}){const o=U.useMemo(()=>sTe(e),[e]),l=n?o.filter(v=>v.time>n):o,c=qe(v=>v.showEventOnTimeline),d=U.useRef(new Map),[h,p]=U.useState(null);return U.useEffect(()=>{var y;if(!a)return;const v=o.find(_=>_.event.type===a.type&&_.event.refId===a.refId);s(),v&&((y=d.current.get(v.key))==null||y.scrollIntoView({behavior:"smooth",block:"center"}),p(v.key))},[a,o,s]),U.useEffect(()=>{if(h==null)return;const v=setTimeout(()=>p(null),1800);return()=>clearTimeout(v)},[h]),x.jsxs("ul",{className:"divide-y divide-gray-100 dark:divide-gray-800",children:[n&&x.jsxs("li",{className:"flex items-center gap-2 bg-sky-500/5 px-3 py-1.5 text-xs text-sky-600 dark:text-sky-400",children:[x.jsxs("span",{children:["Showing ",l.length," since you last looked"]}),x.jsx("button",{type:"button",onClick:r,className:"ml-auto text-gray-400 hover:text-gray-600",children:"show all"})]}),l.map(v=>{const y=v.actorId!=null?t.get(v.actorId):void 0;return x.jsxs("li",{ref:_=>{_?d.current.set(v.key,_):d.current.delete(v.key)},className:`flex items-start gap-2 px-3 py-2 text-sm ${v.key===h?"activity-flash":""}`,children:[x.jsx(jo,{user:y,size:20}),x.jsxs("div",{className:"min-w-0 flex-1",children:[x.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5",children:[x.jsx(rc,{user:y,fallbackId:v.actorId,repoId:e.repoId,className:"font-medium"}),x.jsx("span",{className:"text-gray-500",children:v.label}),x.jsxs("span",{className:"text-xs text-gray-400",title:Wv(v.time),children:["· ",Wv(v.time)]})]}),v.detail&&x.jsx("div",{className:"mt-0.5 truncate text-xs text-gray-500",title:v.detail,children:v.detail.split(`
|
|
1370
1370
|
`)[0]}),x.jsxs("div",{className:"mt-1 flex items-center gap-3 text-xs",children:[x.jsx("button",{type:"button",onClick:()=>c(e.id,v.time,v.event),className:"text-blue-500 hover:underline",title:"Show this event on the timeline",children:"Show"}),v.href&&x.jsx("a",{href:v.href,target:"_blank",rel:"noreferrer noopener",className:"text-gray-400 hover:text-blue-500",children:"Open on GitHub ↗"})]})]})]},v.key)})]})}function lTe({pr:e,usersById:t,viewedSince:n,focusCommentId:r,onFocusConsumed:a}){const s=U.useRef(new Map),[o,l]=U.useState(null);if(U.useEffect(()=>{if(r==null)return;a();const d=s.current.get(r);d&&(d.scrollIntoView({behavior:"smooth",block:"center"}),l(r))},[r,a]),U.useEffect(()=>{if(o==null)return;const d=setTimeout(()=>l(null),1800);return()=>clearTimeout(d)},[o]),e.comments.length===0)return x.jsx("div",{className:"px-3 py-6 text-center text-sm text-gray-500",children:"No PR comments on this PR."});const c=[...e.comments].sort((d,h)=>h.createdAt.localeCompare(d.createdAt));return x.jsx("div",{className:"space-y-2 px-3 pb-3",children:c.map(d=>{const h=d.authorId!=null?t.get(d.authorId):void 0,p=m6(d.createdAt,n);return x.jsxs("div",{ref:v=>{v?s.current.set(d.id,v):s.current.delete(d.id)},className:`rounded-md border border-gray-200 px-2.5 py-2 dark:border-gray-800 ${p?"comment-new":""} ${d.id===o?"activity-flash":""}`,children:[x.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[x.jsx(Dx,{prId:e.id,at:d.createdAt,event:{type:"pr_comment",refId:d.id},title:"Show this comment on the timeline"}),x.jsx("span",{className:"text-gray-300 dark:text-gray-600",children:"·"}),x.jsx(jo,{user:h,size:18}),x.jsx(rc,{user:h,fallbackId:d.authorId,repoId:e.repoId,className:"font-semibold"}),x.jsx("span",{className:"text-gray-400",title:Wv(d.createdAt),children:As(d.createdAt)}),p&&x.jsx(p6,{})]}),x.jsx("div",{className:"mt-1 text-sm",children:x.jsx(Xl,{children:d.body})}),d.url&&x.jsx("div",{className:"mt-2 pl-2 text-[11px]",children:x.jsx("a",{href:d.url,target:"_blank",rel:"noreferrer noopener",className:"text-blue-500 hover:underline",children:"↗ View comment on GitHub"})})]},d.id)})})}function uTe({prId:e,selectedThreadId:t}){var H;const{data:n,isLoading:r,error:a}=d6(e),s=((H=Vp().data)==null?void 0:H.claudeReviewEnabled)??!1,[o,l]=U.useState("overview"),[c,d]=U.useState(null),h=Dr(),p=qe(V=>V.openPrFocused),v=qe(V=>V.focusPrOnTimeline),y=qe(V=>V.activityFocus),_=qe(V=>V.consumeActivityFocus),k=U.useMemo(()=>y&&n&&y.prId===n.id?{type:y.type,refId:y.refId}:null,[y,n]),S=qe(V=>V.commentFocus),I=qe(V=>V.consumeCommentFocus),O=qe(V=>V.claudeTabFocus),R=qe(V=>V.consumeClaudeTabFocus),D=S&&n&&S.prId===n.id?S.commentId:null;U.useEffect(()=>{t!=null&&l("threads")},[t]),U.useEffect(()=>{k&&(l("activity"),d(null))},[k]),U.useEffect(()=>{s&&O&&n&&O.prId===n.id&&(l("claude_review"),R())},[O,n,s,R]),U.useEffect(()=>{D!=null&&l("overview")},[D]);const $=ga({mutationFn:V=>ln.markPrViewed(V),onSuccess:()=>{h.invalidateQueries({queryKey:["open-prs"]}),h.invalidateQueries({queryKey:["timeline"]}),h.invalidateQueries({queryKey:["my-turn"]}),h.invalidateQueries({queryKey:["me"]})}}),P=U.useRef(null);U.useEffect(()=>{n&&P.current!==n.id&&(P.current=n.id,$.mutate(n.id))},[n,$]);const Q=U.useMemo(()=>Kp(n==null?void 0:n.users),[n]);if(r)return x.jsx("div",{className:"p-4 text-sm text-gray-500",children:"Loading PR…"});if(a||!n)return x.jsx("div",{className:"p-4 text-sm text-red-500",children:a?String(a):"PR not found"});const B=f5[n.state],K=n.authorId!=null?Q.get(n.authorId):void 0;return x.jsxs("div",{className:"flex h-full flex-col",children:[x.jsxs("div",{className:"border-b border-gray-200 px-4 py-2 pr-28 dark:border-gray-800",children:[x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx("span",{className:"rounded px-1.5 py-0.5 text-xs font-semibold text-white",style:{backgroundColor:B.color},children:n.isDraft?"Draft":B.label}),x.jsxs("a",{href:n.githubUrl,target:"_blank",rel:"noreferrer noopener",className:"truncate text-sm font-semibold hover:underline",title:n.title,children:[x.jsxs("span",{className:"text-gray-400",children:["#",n.number]})," ",n.title]}),n.isStalled&&x.jsx("span",{className:"rounded bg-red-500/15 px-1.5 py-0.5 text-xs font-medium text-red-500",title:"Open, no recent commits, and has open threads",children:"Stalled"}),(()=>{const V=l2(n.newSinceLastViewed);return V?x.jsxs("button",{type:"button",onClick:()=>{l("activity"),d(n.lastViewedAt)},className:"ml-auto shrink-0 rounded bg-sky-500/15 px-1.5 py-0.5 text-xs font-medium text-sky-500 hover:bg-sky-500/25",title:"Filter activity to what's new since you last looked",children:["👁 ",V]}):null})(),x.jsx("a",{href:n.githubUrl,target:"_blank",rel:"noreferrer noopener",className:`${l2(n.newSinceLastViewed)?"":"ml-auto"} shrink-0 text-xs text-blue-500 hover:underline`,children:"open on GitHub ↗"})]}),x.jsxs("div",{className:"mt-1 flex items-center gap-2 text-xs text-gray-500",children:[x.jsx("button",{type:"button",onClick:()=>p(n.id),className:"shrink-0 font-medium text-blue-500 hover:underline",title:"Centre and highlight this PR on the timeline",children:"Show"}),x.jsx("button",{type:"button",onClick:()=>v(n.id),className:"shrink-0 font-medium text-blue-500 hover:underline",title:"Isolate this PR and its contributors on the timeline (✕ on the Focus mode badge / Esc to leave)",children:"Focus"}),x.jsx("span",{className:"text-gray-300 dark:text-gray-600",children:"·"}),x.jsx(jo,{user:K,size:16}),x.jsx(rc,{user:K,fallbackId:n.authorId,repoId:n.repoId}),x.jsx("span",{children:"·"}),x.jsx("span",{children:n.repoFullName}),x.jsx("span",{children:"·"}),x.jsxs("span",{children:["opened ",As(n.openedAt)]})]})]}),x.jsx("div",{className:"flex gap-1 border-b border-gray-200 px-3 dark:border-gray-800",children:(s?["overview","threads","activity","claude_review"]:["overview","threads","activity"]).map(V=>{const X=n.checkRuns.filter(ce=>ce.state==="failure"||ce.state==="error").length;return x.jsxs("button",{type:"button",onClick:()=>l(V),className:`-mb-px border-b-2 px-3 py-1.5 text-xs ${o===V?"border-blue-500 text-blue-500":"border-transparent text-gray-500 hover:text-gray-700"}`,children:[aTe[V],V==="overview"&&X>0&&x.jsx("span",{className:"ml-1 text-red-500",title:`${X} failing`,children:"●"}),V==="threads"&&n.threads.length>0&&x.jsx("span",{className:"ml-1 opacity-60",title:`${n.threads.length} threads`,children:n.threads.length})]},V)})}),x.jsx("div",{className:"min-h-0 flex-1 overflow-auto",children:o==="overview"?x.jsxs("div",{children:[x.jsx(Fwe,{pr:n,usersById:Q}),x.jsxs("div",{className:"border-t border-gray-200 dark:border-gray-800",children:[x.jsxs("div",{className:"px-4 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400",children:["PR comments",n.comments.length>0&&x.jsxs("span",{className:"ml-1 font-normal opacity-70",children:["· ",n.comments.length]})]}),x.jsx(lTe,{pr:n,usersById:Q,viewedSince:n.lastViewedAt,focusCommentId:D,onFocusConsumed:I})]})]}):o==="threads"?x.jsx(Mwe,{threads:n.threads,usersById:Q,prUrl:n.githubUrl,repoId:n.repoId,selectedThreadId:t,viewedSince:n.lastViewedAt}):o==="activity"?x.jsx(oTe,{pr:n,usersById:Q,since:c,onClearSince:()=>d(null),focusEvent:k,onConsumed:_}):x.jsx(iTe,{pr:n,usersById:Q})})]})}function cTe(){const{data:e}=Wx(),{data:t}=yf(),n=U.useMemo(()=>{if(!e)return[];const r=new Map,a=s=>{var o;return((o=t==null?void 0:t.find(l=>l.id===s))==null?void 0:o.fullName)??`repo ${s}`};for(const s of e.prs){const o=r.get(s.repoId)??{repoId:s.repoId,name:a(s.repoId),openPrs:0,stalled:0,untouched:0,replied:0};s.state==="open"&&(o.openPrs+=1),s.isStalled&&(o.stalled+=1),o.untouched+=s.threadCounts.untouched,o.replied+=s.threadCounts.replied_unresolved,r.set(s.repoId,o)}return[...r.values()].sort((s,o)=>s.name.localeCompare(o.name))},[e,t]);return n.length===0?x.jsx("div",{className:"flex h-full items-center justify-center text-sm text-gray-500",children:"Select a PR or event on the timeline."}):x.jsxs("div",{className:"p-4",children:[x.jsx("h2",{className:"mb-2 text-xs font-semibold uppercase tracking-wide text-gray-400",children:"In this window"}),x.jsxs("table",{className:"w-full text-sm",children:[x.jsx("thead",{children:x.jsxs("tr",{className:"text-left text-xs text-gray-400",children:[x.jsx("th",{className:"py-1 pr-4 font-medium",children:"Repo"}),x.jsx("th",{className:"py-1 pr-4 text-right font-medium",children:"Open PRs"}),x.jsx("th",{className:"py-1 pr-4 text-right font-medium",children:"Stalled"}),x.jsx("th",{className:"py-1 pr-4 text-right font-medium",children:"Untouched"}),x.jsx("th",{className:"py-1 pr-4 text-right font-medium",children:"Replied"})]})}),x.jsx("tbody",{children:n.map(r=>x.jsxs("tr",{className:"border-t border-gray-100 dark:border-gray-800",children:[x.jsx("td",{className:"py-1.5 pr-4 font-medium",children:r.name}),x.jsx("td",{className:"py-1.5 pr-4 text-right tabular-nums",children:r.openPrs}),x.jsx("td",{className:`py-1.5 pr-4 text-right tabular-nums ${r.stalled>0?"font-semibold text-red-500":""}`,children:r.stalled}),x.jsx("td",{className:`py-1.5 pr-4 text-right tabular-nums ${r.untouched>0?"font-semibold text-red-400":""}`,children:r.untouched}),x.jsx("td",{className:`py-1.5 pr-4 text-right tabular-nums ${r.replied>0?"text-amber-500":""}`,children:r.replied})]},r.repoId))})]})]})}function dTe({items:e}){const t=qe(a=>a.openPrFocused),n=Dr(),r=ga({mutationFn:a=>ln.dismissMyTurn("review_request",a),onSuccess:()=>{n.invalidateQueries({queryKey:["my-turn"]}),n.invalidateQueries({queryKey:["me"]})}});return e.length===0?null:x.jsxs("section",{children:[x.jsxs("h3",{className:"mb-1 flex items-center gap-1.5 text-xs font-semibold",children:[x.jsx("span",{className:"text-blue-500",children:"●"}),"Awaiting your review",x.jsxs("span",{className:"text-gray-400",children:["(",e.length,")"]})]}),x.jsx("ul",{className:"space-y-0.5",children:e.map(a=>x.jsxs("li",{className:"group flex items-stretch",children:[x.jsxs("button",{type:"button",onClick:()=>t(a.prId),className:"flex min-w-0 flex-1 items-baseline gap-2 rounded px-2 py-1 text-left text-sm hover:bg-gray-100 dark:hover:bg-gray-800",children:[x.jsxs("span",{className:"shrink-0 text-xs text-gray-400",children:[a.repoFullName," #",a.number]}),x.jsx("span",{className:"min-w-0 flex-1 truncate",title:a.title,children:a.title}),a.alsoRequested>0&&x.jsxs("span",{className:"shrink-0 text-[11px] text-gray-400",children:["+",a.alsoRequested," other",a.alsoRequested===1?"":"s"]}),x.jsx("span",{className:"shrink-0 text-[11px] text-gray-400",children:As(a.openedAt)})]}),x.jsx("button",{type:"button",onClick:()=>r.mutate(a.prId),disabled:r.isPending,className:"shrink-0 rounded px-1.5 text-[11px] text-gray-300 opacity-0 hover:text-gray-600 group-hover:opacity-100 dark:text-gray-600 dark:hover:text-gray-300",title:"Dismiss — reappears if the PR is updated",children:"✓ done"})]},a.prId))})]})}function fTe({items:e}){const t=qe(a=>a.openPrFocused),n=Dr(),r=ga({mutationFn:a=>ln.dismissPr(a),onSuccess:()=>{n.invalidateQueries({queryKey:["my-turn"]}),n.invalidateQueries({queryKey:["me"]}),n.invalidateQueries({queryKey:["open-prs"]}),n.invalidateQueries({queryKey:["timeline"]})}});return e.length===0?null:x.jsxs("section",{children:[x.jsxs("h3",{className:"mb-1 flex items-center gap-1.5 text-xs font-semibold",children:[x.jsx("span",{className:"text-green-500",children:"●"}),"Your PRs with new activity",x.jsxs("span",{className:"text-gray-400",children:["(",e.length,")"]})]}),x.jsx("ul",{className:"space-y-0.5",children:e.map(a=>x.jsxs("li",{className:"group flex items-stretch",children:[x.jsxs("button",{type:"button",onClick:()=>t(a.prId),className:"min-w-0 flex-1 rounded px-2 py-1 text-left hover:bg-gray-100 dark:hover:bg-gray-800",children:[x.jsxs("div",{className:"flex items-baseline gap-2 text-sm",children:[x.jsxs("span",{className:"shrink-0 text-xs text-gray-400",children:[a.repoFullName," #",a.number]}),x.jsx("span",{className:"min-w-0 flex-1 truncate",title:a.title,children:a.title})]}),x.jsx("div",{className:"pl-1 text-[11px] font-medium text-sky-500",children:a.summary})]}),x.jsx("button",{type:"button",onClick:()=>r.mutate(a.prId),disabled:r.isPending,className:"shrink-0 self-start rounded px-1.5 py-1 text-[11px] text-gray-300 opacity-0 hover:text-gray-600 group-hover:opacity-100 dark:text-gray-600 dark:hover:text-gray-300",title:"Mark seen — clears the new-activity badge",children:"✓ seen"})]},a.prId))})]})}function hTe({items:e}){const t=qe(a=>a.openPrFocused),n=Dr(),r=ga({mutationFn:a=>ln.dismissMyTurn("thread",a),onSuccess:()=>{n.invalidateQueries({queryKey:["my-turn"]}),n.invalidateQueries({queryKey:["me"]})}});return e.length===0?null:x.jsxs("section",{children:[x.jsxs("h3",{className:"mb-1 flex items-center gap-1.5 text-xs font-semibold",children:[x.jsx("span",{className:"text-amber-500",children:"●"}),"Threads awaiting your response",x.jsxs("span",{className:"text-gray-400",children:["(",e.length,")"]})]}),x.jsx("ul",{className:"space-y-0.5",children:e.map(a=>{const s=a.path.split("/").at(-1);return x.jsxs("li",{className:"group flex items-stretch",children:[x.jsxs("button",{type:"button",onClick:()=>t(a.prId,a.threadId),className:"min-w-0 flex-1 rounded px-2 py-1 text-left hover:bg-gray-100 dark:hover:bg-gray-800",children:[x.jsxs("div",{className:"flex items-baseline gap-2 text-sm",children:[x.jsxs("span",{className:"shrink-0 text-xs text-gray-400",children:[a.repoFullName," #",a.prNumber]}),x.jsxs("code",{className:"min-w-0 flex-1 truncate font-mono text-xs",title:a.path,children:[s,a.line!=null?`:${a.line}`:""]}),x.jsx("span",{className:"shrink-0 text-[11px] text-gray-400",children:As(a.lastReplyAt)})]}),x.jsxs("div",{className:"truncate pl-1 text-[11px] italic text-gray-500",title:a.lastReplyExcerpt,children:["“",a.lastReplyExcerpt,"”"]})]}),x.jsx("button",{type:"button",onClick:()=>r.mutate(a.threadId),disabled:r.isPending,className:"shrink-0 self-start rounded px-1.5 py-1 text-[11px] text-gray-300 opacity-0 hover:text-gray-600 group-hover:opacity-100 dark:text-gray-600 dark:hover:text-gray-300",title:"Dismiss — reappears on a newer reply",children:"✓ done"})]},a.threadId)})})]})}function pTe(){const{data:e,isLoading:t}=d5(),{data:n}=Vp(),r=U.useMemo(()=>Kp(e==null?void 0:e.users),[e]);return t&&!e?x.jsx("div",{className:"p-4 text-sm text-gray-500",children:"Loading…"}):!e||e.awaitingReview.length===0&&e.yourPrs.length===0&&e.threadsAwaiting.length===0?x.jsxs("div",{className:"flex h-full flex-col",children:[x.jsx("div",{className:"px-4 pt-3 text-sm text-gray-500",children:n!=null&&n.user?`Nothing needs you right now, ${n.user.login}. 🎉`:"Sign in with the gh CLI to see your triage queue."}),x.jsx("div",{className:"min-h-0 flex-1 overflow-auto",children:x.jsx(cTe,{})})]}):x.jsxs("div",{className:"h-full overflow-auto p-4",children:[x.jsx("h2",{className:"mb-3 text-xs font-semibold uppercase tracking-wide text-gray-400",children:"My turn"}),x.jsxs("div",{className:"space-y-4",children:[x.jsx(dTe,{items:e.awaitingReview,usersById:r}),x.jsx(fTe,{items:e.yourPrs,usersById:r}),x.jsx(hTe,{items:e.threadsAwaiting,usersById:r})]})]})}function mTe(){const{data:e}=Vp(),t=qe(a=>a.clearSelection),n=qe(a=>a.selectedPrId);if(!(e!=null&&e.user))return null;const r=e.counts;return x.jsxs("button",{type:"button",onClick:()=>{n!=null&&t()},title:"My turn: awaiting your review · your PRs with activity · threads awaiting your response",className:"flex items-center gap-1 rounded-full border border-gray-300 px-2 py-0.5 text-xs tabular-nums hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",children:[x.jsx("span",{className:"text-blue-500",children:r.awaitingReview}),x.jsx("span",{className:"text-gray-400",children:"·"}),x.jsx("span",{className:"text-green-500",children:r.yourPrsActivity}),x.jsx("span",{className:"text-gray-400",children:"·"}),x.jsx("span",{className:"text-amber-500",children:r.threadsAwaiting})]})}function gTe(){const e=qe(r=>r.selectedPrId),t=qe(r=>r.selectedThreadId),n=qe(r=>r.clearSelection);return x.jsxs("div",{className:"relative h-full",children:[x.jsxs("div",{className:"absolute right-2 top-1.5 z-10 flex items-center gap-2",children:[x.jsx(mTe,{}),e!=null&&x.jsx("button",{type:"button",onClick:n,className:"rounded px-2 py-0.5 text-xs text-gray-400 hover:text-gray-600",title:"Clear selection (Esc)",children:"✕"})]}),e==null?x.jsx(pTe,{}):x.jsx(uTe,{prId:e,selectedThreadId:t},e)]})}const vTe={cloning:"Cloning",fetching_diff:"Fetching diff",deciding:"Deciding scope",reviewing:"Reviewing",persisting:"Saving findings"};function yTe(){var I;const e=((I=Vp().data)==null?void 0:I.claudeReviewEnabled)??!1,t=qe(O=>O.claudeReviewKickoff),n=qe(O=>O.openClaudeReview),[r,a]=U.useState(!1);U.useEffect(()=>{t>0&&a(!0)},[t]);const{data:s,dataUpdatedAt:o}=Gwe(e&&r);U.useEffect(()=>{r&&((s==null?void 0:s.reviews.length)??0)===0&&a(!1)},[o]);const[l,c]=U.useState({}),[d,h]=U.useState({}),p=((s==null?void 0:s.reviews)??[]).map(O=>`${O.reviewId}:${O.phase??""}`).join(",");U.useEffect(()=>{const O=(s==null?void 0:s.reviews)??[];c(R=>{const D={...R},$=new Set(O.map(P=>P.reviewId));for(const P of O)D[P.reviewId]={reviewId:P.reviewId,prId:P.prId,repoFullName:P.repoFullName,prNumber:P.prNumber,prTitle:P.prTitle,phase:P.phase,done:!1};for(const P of Object.values(D))!$.has(P.reviewId)&&!P.done&&(D[P.reviewId]={...P,done:!0});return D})},[p]);const v=Object.values(l).filter(O=>!d[O.reviewId]);if(!e||v.length===0)return null;const y=v.filter(O=>!O.done),_=y.length===0,k=()=>{h(O=>{const R={...O};for(const D of v)R[D.reviewId]=!0;return R})},S=O=>h(R=>({...R,[O]:!0}));return x.jsx("div",{className:"pointer-events-none fixed bottom-4 right-4 z-50 flex w-80 max-w-[calc(100vw-2rem)] flex-col gap-2",children:x.jsxs("div",{className:"pointer-events-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-900",children:[x.jsxs("div",{className:"flex items-center justify-between border-b border-gray-100 px-3 py-1.5 dark:border-gray-800",children:[x.jsxs("span",{className:"text-xs font-semibold",children:["Claude reviews",y.length>0&&x.jsxs("span",{className:"ml-1 font-normal text-gray-400",children:["· ",y.length," running"]})]}),_&&x.jsx("button",{type:"button",onClick:k,className:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-200",children:"Dismiss all"})]}),x.jsx("ul",{className:"max-h-64 divide-y divide-gray-100 overflow-auto dark:divide-gray-800",children:v.map(O=>x.jsxs("li",{className:"px-3 py-2 text-xs",children:[x.jsxs("button",{type:"button",onClick:()=>n(O.prId),className:"block w-full text-left",title:"Open this review",children:[x.jsxs("div",{className:"flex items-center gap-1.5",children:[O.done?x.jsx("span",{className:"inline-block h-2 w-2 shrink-0 rounded-full bg-green-500"}):x.jsx("span",{className:"inline-block h-2.5 w-2.5 shrink-0 animate-spin rounded-full border-2 border-gray-300 border-t-blue-500"}),x.jsxs("span",{className:"truncate font-medium text-blue-600 hover:underline dark:text-blue-400",children:[O.repoFullName," #",O.prNumber]})]}),x.jsx("div",{className:"mt-0.5 truncate text-gray-500",children:O.prTitle}),x.jsx("div",{className:"mt-0.5 text-gray-400",children:O.done?"Ready — click to view":`${O.phase!=null?vTe[O.phase]??O.phase:"Starting"}…`})]}),O.done&&x.jsx("div",{className:"mt-1 text-right",children:x.jsx("button",{type:"button",onClick:()=>S(O.reviewId),className:"text-[11px] text-gray-400 hover:text-gray-600 dark:hover:text-gray-200",children:"dismiss"})})]},O.reviewId))})]})})}function bTe({repos:e,statuses:t,cancelling:n,onCancel:r}){const a=c=>t==null?void 0:t.find(d=>d.repoId===c),s=c=>{if(t===void 0)return!0;const d=a(c);return d===void 0||d.status==="running"},o=e.filter(c=>!s(c.id)).length,l=e.length>0&&o===e.length;return x.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",role:"presentation",children:x.jsxs("div",{className:"w-[28rem] max-w-[90vw] rounded-lg border border-gray-200 bg-white p-4 shadow-xl dark:border-gray-700 dark:bg-gray-900",role:"dialog","aria-modal":"true","aria-label":"Sync progress",children:[x.jsx("div",{className:"mb-3 flex items-center justify-between",children:x.jsx("h2",{className:"text-sm font-semibold",children:n?"Cancelling…":e.length===0?"Starting sync…":l?"Sync complete":`Syncing ${e.length} repo${e.length===1?"":"s"}`})}),x.jsx("ul",{className:"space-y-3",children:e.map(c=>{var _,k;const d=a(c.id),h=s(c.id),p=(d==null?void 0:d.status)==="error",v=((_=d==null?void 0:d.progress)==null?void 0:_.prsProcessed)??0,y=h?Math.round((((k=d==null?void 0:d.progress)==null?void 0:k.percent)??0)*100):100;return x.jsxs("li",{children:[x.jsxs("div",{className:"mb-1 flex items-baseline justify-between gap-2 text-xs",children:[x.jsx("span",{className:"truncate font-medium",title:c.fullName,children:c.fullName}),x.jsx("span",{className:"shrink-0 text-gray-500",children:p?x.jsx("span",{className:"text-red-500",children:"error"}):h?`${y}%${v>0?` · ${v} PRs`:""}`:x.jsxs("span",{className:"text-green-600 dark:text-green-400",children:["✓ done",v>0?` · ${v} PRs`:""]})})]}),x.jsx("div",{className:"h-2 w-full overflow-hidden rounded bg-gray-200 dark:bg-gray-800",children:x.jsx("div",{className:`h-2 rounded transition-all duration-500 ${p?"bg-red-500":h?"bg-blue-500":"bg-green-500"}`,style:{width:`${p?100:y}%`}})})]},c.id)})}),x.jsxs("div",{className:"mt-4 flex items-center justify-between gap-3 text-xs text-gray-500",children:[x.jsxs("span",{children:[o," of ",e.length," repo",e.length===1?"":"s"," complete"]}),x.jsx("button",{type:"button",onClick:r,disabled:n,title:"Stop the sync and remove any repos still loading for the first time",className:"rounded border border-red-300 px-3 py-1 text-red-600 hover:border-red-400 hover:bg-red-50 disabled:opacity-50 dark:border-red-900 dark:text-red-400 dark:hover:bg-red-950",children:n?"Cancelling…":"Cancel"})]})]})})}function _Te(e){let t=null;for(const n of e){const r=n.lastIncrementalSyncAt??n.lastFullSyncAt;r&&(!t||r>t)&&(t=r)}return t}const u2=5,c2=e=>e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});function ETe(e){const t=new Date,n=new Date(t);return n.setSeconds(0,0),n.setMinutes(Math.floor(t.getMinutes()/e)*e+e),n}function xTe(e){const t=ETe(u2),n=Math.max(1,Math.round((t.getTime()-Date.now())/6e4)),r=e?[`Last synced ${c2(new Date(e))}`]:[];return r.push(`Syncs automatically every ${u2} minutes`),r.push(`Next sync ~${c2(t)} (in ${n} min)`),r.join(`
|
|
1371
|
-
`)}function wTe(){const e=Dr(),[t,n]=U.useState(!1),[r,a]=U.useState(!1),[s,o]=U.useState(!1),[l,c]=U.useState(!1),[d,h]=U.useState(null),{data:p}=ri({queryKey:["repos"],queryFn:ln.listRepos,refetchInterval:t?3e3:3e4}),v=(p??[]).map(J=>J.id).join(","),{data:y}=ri({queryKey:["sync-status",v],enabled:t&&!!p&&p.length>0,queryFn:()=>Promise.all((p??[]).map(J=>ln.syncStatus(J.id))),refetchInterval:1500}),_=d==null?p??[]:(p??[]).filter(J=>J.id===d),k=new Set(_.map(J=>J.id)),S=y==null?void 0:y.filter(J=>k.has(J.repoId)),I=(S??[]).filter(J=>J.status==="running"),O=I.length,R=O>0&&I.every(J=>{var ye;return((ye=J.progress)==null?void 0:ye.foregroundComplete)===!0}),D=_Te(p??[]),$=U.useRef(D),P=U.useRef(!1),Q=U.useRef(null),B=()=>{Q.current!=null&&(clearTimeout(Q.current),Q.current=null)},K=()=>{o(!1),P.current=!1,B()};U.useEffect(()=>B,[]);const H=()=>{e.invalidateQueries({queryKey:["timeline"]}),e.invalidateQueries({queryKey:["open-prs"]}),e.invalidateQueries({queryKey:["users"]}),e.invalidateQueries({queryKey:["mergers"]}),e.invalidateQueries({queryKey:["my-turn"]}),e.invalidateQueries({queryKey:["me"]})};U.useEffect(()=>{$.current!==D&&($.current=D,H())},[D]),U.useEffect(()=>{!t||!R||P.current||(P.current=!0,a(!1),H())},[t,R]),U.useEffect(()=>{O>0&&o(!0)},[O]),U.useEffect(()=>{t&&s&&y&&O===0&&(n(!1),o(!1),H(),B(),Q.current=setTimeout(()=>{a(!1),Q.current=null},1e3))},[t,s,y,O]);const V=qe(J=>J.syncModalSignal),X=qe(J=>J.syncModalRepoId),ce=U.useRef(V);if(U.useEffect(()=>{V!==ce.current&&(ce.current=V,h(X),a(!0),n(!0),K(),e.invalidateQueries({queryKey:["repos"]}),e.invalidateQueries({queryKey:["sync-status"]}))},[V,e]),!p||p.length===0)return null;const ae=p.find(J=>J.lastSyncStatus==="error"),ue=async(J=!1)=>{n(!0),a(!0),h(null),K(),await Promise.allSettled(p.map(ye=>ln.syncRepo(ye.id,J))),e.invalidateQueries({queryKey:["repos"]}),e.invalidateQueries({queryKey:["sync-status"]})},be=async()=>{c(!0),B();const J=(S??[]).filter(F=>F.status==="running").map(F=>F.repoId),ye=J.length?J:_.map(F=>F.id);await Promise.allSettled(ye.map(F=>ln.cancelSync(F))),n(!1),o(!1),c(!1),a(!1),e.invalidateQueries({queryKey:["repos"]}),H()},ke=R?"loading older history…":O>0?`syncing ${O} repo${O===1?"":"s"}…`:"syncing…";return x.jsxs(x.Fragment,{children:[r&&x.jsx(bTe,{repos:_,statuses:S,cancelling:l,onCancel:()=>void be()}),x.jsxs("div",{className:"flex items-center gap-2 text-xs text-gray-500",children:[ae?x.jsxs("span",{className:"text-red-500",title:ae.lastSyncError??"",children:["sync error: ",ae.fullName]}):x.jsx("span",{className:"cursor-help",title:xTe(D),children:t?ke:D?`synced ${As(D)}`:"not synced yet"}),x.jsx("button",{type:"button",onClick:()=>void ue(!1),disabled:t,className:"rounded border border-gray-300 px-2 py-0.5 hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:"Sync now"}),x.jsx("button",{type:"button",onClick:()=>{window.confirm("Deep re-sync re-fetches the full backfill window for every repo. Slower, but catches CI/thread changes the incremental sync can lag. Continue?")&&ue(!0)},disabled:t,className:"rounded px-1.5 py-0.5 text-gray-400 hover:text-gray-600 disabled:opacity-50",title:"Force a full backfill for all repos",children:"deep"})]})]})}function TTe(){const e=qe(D=>D.searchQuery),t=qe(D=>D.setSearchQuery),n=qe(D=>D.openPrFocused),{data:r}=Gx(),{data:a}=Vx(),{data:s}=yf(),{data:o}=R0(),[l,c]=U.useState(!1),[d,h]=U.useState(-1),p=U.useRef(null),v=U.useMemo(()=>{const D=new Map;for(const $ of s??[])D.set($.id,$.fullName);return D},[s]),y=U.useMemo(()=>Kp(o),[o]),_=U.useMemo(()=>{const D=new Map;for(const $ of(r==null?void 0:r.prs)??[])D.set($.id,$);for(const $ of(a==null?void 0:a.prs)??[])D.has($.id)||D.set($.id,$);return[...D.values()]},[r,a]),k=U.useMemo(()=>{const D=e.trim().toLowerCase();return D?_.filter($=>$.title.toLowerCase().includes(D)).slice(0,30):[]},[_,e]),S=l&&e.trim().length>0,I=d>=0&&d<k.length?k[d].id:null;qp(p,()=>c(!1),S),U.useEffect(()=>{var D,$;I!=null&&(($=(D=p.current)==null?void 0:D.querySelector(`#pr-result-${I}`))==null||$.scrollIntoView({block:"nearest"}))},[I]);const O=D=>{D&&(n(D.id),c(!1))},R=D=>{if(D.key==="Escape"){c(!1),D.target.blur();return}!S||k.length===0||(D.key==="ArrowDown"?(D.preventDefault(),h($=>($+1)%k.length)):D.key==="ArrowUp"?(D.preventDefault(),h($=>$<=0?k.length-1:$-1)):D.key==="Enter"&&(D.preventDefault(),O(k[d>=0?d:0])))};return x.jsxs("div",{ref:p,className:"relative",children:[x.jsx("input",{type:"search",value:e,placeholder:"Search PR titles…",onChange:D=>{t(D.target.value),h(-1),c(!0)},onFocus:()=>c(!0),onKeyDown:R,role:"combobox","aria-expanded":S,"aria-controls":"pr-search-results","aria-autocomplete":"list","aria-activedescendant":I!=null?`pr-result-${I}`:void 0,"aria-label":"Search PR titles",className:"w-56 rounded border border-gray-300 bg-transparent px-2 py-0.5 text-xs focus:border-blue-500 focus:outline-none dark:border-gray-700"}),S&&x.jsx("div",{id:"pr-search-results",role:"listbox","aria-label":"PR search results",className:"absolute right-0 top-full z-[60] mt-1 max-h-80 w-80 overflow-y-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-900",children:k.length===0?x.jsx("div",{className:"px-3 py-2 text-xs text-gray-500",children:"No matching PRs."}):k.map((D,$)=>{const P=D.authorId!=null?y.get(D.authorId):void 0;return x.jsxs("button",{id:`pr-result-${D.id}`,type:"button",role:"option","aria-selected":$===d,onMouseEnter:()=>h($),onClick:()=>O(D),className:`flex w-full flex-col gap-0.5 px-3 py-1.5 text-left ${$===d?"bg-gray-100 dark:bg-gray-800":""} hover:bg-gray-100 dark:hover:bg-gray-800`,children:[x.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-gray-400",children:[x.jsx(jo,{user:P,size:12}),x.jsx("span",{className:"truncate",title:Is(P,D.authorId),children:Is(P,D.authorId)}),x.jsx("span",{"aria-hidden":!0,children:"·"}),x.jsxs("span",{className:"shrink-0",children:[v.get(D.repoId)??`repo ${D.repoId}`," · #",D.number]})]}),x.jsx("span",{className:"truncate text-xs",title:D.title,children:D.title})]},D.id)})})]})}function STe({onClose:e}){return U.useEffect(()=>{const t=n=>{n.key==="Escape"&&(n.stopImmediatePropagation(),e())};return window.addEventListener("keydown",t,!0),()=>window.removeEventListener("keydown",t,!0)},[e]),x.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",onClick:e,role:"presentation",children:x.jsxs("div",{className:"flex max-h-[80vh] w-[34rem] max-w-[92vw] flex-col rounded-lg border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900",onClick:t=>t.stopPropagation(),role:"dialog","aria-modal":"true","aria-label":"Pierre help",children:[x.jsxs("div",{className:"flex items-center justify-between border-b border-gray-200 px-4 py-2 dark:border-gray-800",children:[x.jsx("h2",{className:"brand-title",children:"Pierre"}),x.jsx("button",{type:"button",onClick:e,className:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-200","aria-label":"Close (Esc)",title:"Close (Esc)",children:"✕"})]}),x.jsxs("div",{className:"min-h-0 flex-1 space-y-4 overflow-auto px-4 py-3 text-sm leading-relaxed text-gray-600 dark:text-gray-300",children:[x.jsx("p",{className:"text-gray-500 dark:text-gray-400",children:"A local dashboard for your team’s GitHub pull-request activity across repos, drawn as an interactive timeline. Everything runs on your machine."}),x.jsxs(ju,{title:"Track repositories",children:["Add repos in the filter bar’s ",x.jsx("em",{children:"add repo"})," box as ",x.jsx(kTe,{children:"owner/name"}),". Pierre syncs their PR activity every few minutes into a local file — nothing leaves your machine."]}),x.jsxs(ju,{title:"Read the timeline",children:["Rows are grouped ",x.jsx("strong",{children:"repo → contributor"}),". Each PR is a bar; the markers beneath it are events — commits, comments, reviews. Scroll to pan, hold the zoom key while scrolling to zoom. Click a marker for its details, or a PR bar to select it."]}),x.jsxs(ju,{title:"Focus mode",children:["To isolate one PR and just its contributors: double-click its bar, click"," ",x.jsx("strong",{children:"Focus"})," in the detail pane, or click a cross-person marker. Leave focus with the ",x.jsx("strong",{children:"✕"})," on the header"," ",x.jsx("strong",{children:"Focus mode"})," badge, ",x.jsx(Qh,{children:"Esc"}),", or the browser"," ",x.jsx("strong",{children:"Back"})," button."]}),x.jsxs(ju,{title:"Detail pane",children:["Selecting a PR opens the bottom pane with ",x.jsx("strong",{children:"Overview"})," (checks, summary, comments), ",x.jsx("strong",{children:"Threads"}),", and ",x.jsx("strong",{children:"Activity"}),". The ",x.jsx("em",{children:"Show"})," links jump back to that moment on the timeline; drag the divider to resize the pane."]}),x.jsxs(ju,{title:"Filter",children:["Narrow by date range, members (auto-scoped to who’s active in view), event categories, and thread states. ",x.jsx("em",{children:"Exclude bots"})," hides renovate / dependabot / CI noise."]}),x.jsxs(ju,{title:"Open-PRs strip",children:["The collapsible strip up top lists currently-open PRs — toggle between"," ",x.jsx("strong",{children:"all"}),", ",x.jsx("strong",{children:"my turn"}),", and"," ",x.jsx("strong",{children:"needs attention"}),"."]}),x.jsxs(ju,{title:"Keyboard",children:[x.jsx(Qh,{children:"/"})," focus the filter · ",x.jsx(Qh,{children:"j"}),"/",x.jsx(Qh,{children:"k"})," cycle PRs ·"," ",x.jsx(Qh,{children:"Esc"})," exit focus, else clear the selection."]})]})]})})}function ju({title:e,children:t}){return x.jsxs("section",{children:[x.jsx("h3",{className:"mb-1 font-semibold text-gray-800 dark:text-gray-100",children:e}),x.jsx("p",{children:t})]})}function kTe({children:e}){return x.jsx("code",{className:"rounded bg-gray-100 px-1 font-mono text-[12px] text-gray-700 dark:bg-gray-800 dark:text-gray-300",children:e})}function Qh({children:e}){return x.jsx("kbd",{className:"rounded border border-gray-300 bg-gray-100 px-1 text-[11px] font-medium text-gray-600 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300",children:e})}function CTe(){return x.jsx("div",{className:"flex h-full min-h-screen w-full items-center justify-center bg-gray-950 px-4 text-gray-100",children:x.jsxs("div",{className:"flex w-full max-w-sm flex-col items-center rounded-2xl border border-gray-800 bg-gray-900/40 px-8 py-10 text-center shadow-xl",children:[x.jsx("span",{className:"brand-title text-4xl",title:"Pierre — a play on “PR”",children:"Pierre"}),x.jsx("p",{className:"mt-4 text-sm text-gray-400",children:"Sign in to view your team’s GitHub activity — pull requests, reviews, and what needs your attention."}),x.jsxs("a",{href:"/api/auth/login",className:"mt-7 inline-flex w-full items-center justify-center gap-2 rounded-lg bg-blue-600 px-4 py-2.5 text-sm font-semibold text-white transition-colors hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-sky-400 focus:ring-offset-2 focus:ring-offset-gray-950",children:[x.jsx("svg",{viewBox:"0 0 16 16",width:"18",height:"18",fill:"currentColor","aria-hidden":"true",children:x.jsx("path",{fillRule:"evenodd",d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8Z"})}),"Sign in with GitHub"]}),x.jsx("p",{className:"mt-5 text-xs leading-relaxed text-gray-500",children:"Read-only access. Add any public repo instantly; private repos only when you install Pierre on them. Revoke anytime from GitHub settings."})]})})}const NTe=["7d","14d","30d","90d","custom"];function d2(e,t){if(e.length!==t.length)return!1;const n=new Set(e);return t.every(r=>n.has(r))}function f2(e){if(!e)return null;const t=e.split(",").map(n=>Number.parseInt(n,10)).filter(Number.isFinite);return t.length?t:null}function ITe(){const e=new URLSearchParams(window.location.search),t={},n=e.get("preset");n&&NTe.includes(n)&&(t.preset=n),t.repoIds=f2(e.get("repos")),t.userIds=f2(e.get("users")),e.get("bots")!==null&&(t.excludeBots=e.get("bots")!=="0");const r=e.get("stale");r==="0"?t.excludeStale=!1:r==="1"&&(t.excludeStale=!0),t.customFrom=e.get("from"),t.customTo=e.get("to");const a=e.get("cats");if(a){const h=new Set(Tp);t.categories=a.split(",").filter(p=>h.has(p))}const s=e.get("status");if(s!==null){const h=new Set(zx);t.prStatuses=s.split(",").filter(p=>h.has(p))}const o=e.get("states");if(o){const h=new Set(H2);t.derivedStates=o.split(",").filter(p=>h.has(p))}const l=e.get("pr");l&&(t.selectedPrId=Number.parseInt(l,10));const c=e.get("thread");c&&(t.selectedThreadId=Number.parseInt(c,10));const d=e.get("strip");return(d==="my_turn"||d==="needs_attention"||d==="all")&&(t.stripFilter=d),e.get("open")==="1"&&(t.stripCollapsed=!1),t}function ATe(e){var a,s;const t=new URLSearchParams;e.preset!=="14d"&&t.set("preset",e.preset),(a=e.repoIds)!=null&&a.length&&t.set("repos",e.repoIds.join(",")),(s=e.userIds)!=null&&s.length&&t.set("users",e.userIds.join(",")),e.excludeBots||t.set("bots","0"),e.excludeStale||t.set("stale","0"),e.preset==="custom"&&e.customFrom&&t.set("from",e.customFrom),e.preset==="custom"&&e.customTo&&t.set("to",e.customTo),d2(e.categories,rp)||t.set("cats",e.categories.join(",")),d2(e.prStatuses,z2)||t.set("status",e.prStatuses.join(",")),e.derivedStates.length&&t.set("states",e.derivedStates.join(",")),e.selectedPrId&&t.set("pr",String(e.selectedPrId)),e.selectedThreadId&&t.set("thread",String(e.selectedThreadId)),e.stripFilter!=="all"&&t.set("strip",e.stripFilter),e.stripCollapsed||t.set("open","1");const n=t.toString(),r=`${window.location.pathname}${n?`?${n}`:""}`;r!==window.location.pathname+window.location.search&&window.history.replaceState(null,"",r)}function OTe(){const e=U.useRef(!1);U.useEffect(()=>(e.current||(qe.getState().hydrate(ITe()),e.current=!0),qe.subscribe(n=>ATe(n))),[])}function h2(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||e.isContentEditable}function RTe(){const{data:e}=Wx();U.useEffect(()=>{const t=n=>{var c;const{selectedPrId:r,selectPr:a,clearSelection:s,focusActive:o,exitFocus:l}=qe.getState();if(n.key==="Escape"){h2(n.target)?n.target.blur():o?l():s();return}if(!h2(n.target)){if(n.key==="/"){n.preventDefault(),(c=document.getElementById("add-repo-input"))==null||c.focus();return}if(n.key==="j"||n.key==="k"){const d=[...(e==null?void 0:e.prs)??[]].sort((y,_)=>_.openedAt.localeCompare(y.openedAt));if(d.length===0)return;const h=d.findIndex(y=>y.id===r);let p;h===-1?p=0:p=n.key==="j"?h+1:h-1,p=Math.max(0,Math.min(d.length-1,p));const v=d[p];v&&a(v.id)}}};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e])}function DTe(){const e=Dr();U.useEffect(()=>{let t=null;const n=()=>{const s=new Map,o=(l,c)=>{const d=s.get(l);(!d||c>d)&&s.set(l,c)};for(const[,l]of e.getQueriesData({queryKey:["timeline"]}))for(const c of(l==null?void 0:l.prs)??[])o(c.id,c.updatedAt);for(const[,l]of e.getQueriesData({queryKey:["open-prs"]}))for(const c of(l==null?void 0:l.prs)??[])o(c.id,c.updatedAt);for(const[l,c]of s){const d=e.getQueryData(["pr",l]);if(!d||d.updatedAt>=c)continue;const h=e.getQueryState(["pr",l]);if(!(h&&h.fetchStatus!=="idle")){e.invalidateQueries({queryKey:["pr",l]});for(const p of d.threads??[])e.invalidateQueries({queryKey:["thread",p.id]})}}},r=()=>{t||(t=setTimeout(()=>{t=null,n()},300))};r();const a=e.getQueryCache().subscribe(s=>{const o=s.query.queryKey[0];(o==="timeline"||o==="open-prs")&&r()});return()=>{t&&clearTimeout(t),a()}},[e])}function PTe(){const[e,t]=U.useState(()=>(localStorage.getItem("theme")??"dark")!=="light");return U.useEffect(()=>{document.documentElement.classList.toggle("dark",e),localStorage.setItem("theme",e?"dark":"light")},[e]),[e,()=>t(n=>!n)]}function MTe(){var k;const e=Vp();OTe(),RTe(),DTe();const[t,n]=PTe(),[r,a]=U.useState(!1),s=((k=e.data)==null?void 0:k.deploymentMode)==="cloud",o=()=>{ln.logout().finally(()=>window.location.assign("/"))},l=qe(S=>S.focusActive),[c,d]=f6("pierre:detailPaneHeight",384),h=U.useRef(null),p=U.useRef(null),v=S=>{var I;p.current={startY:S.clientY,startH:((I=h.current)==null?void 0:I.offsetHeight)??c},S.currentTarget.setPointerCapture(S.pointerId)},y=S=>{const I=p.current;if(!I||!h.current)return;const O=window.innerHeight*.7,R=Math.min(Math.max(I.startH+(I.startY-S.clientY),160),O);h.current.style.height=`${R}px`,window.dispatchEvent(new Event("resize"))},_=S=>{!p.current||!h.current||(p.current=null,S.currentTarget.releasePointerCapture(S.pointerId),d(h.current.offsetHeight))};return e.error instanceof wp&&e.error.status===401?x.jsx(CTe,{}):e.isLoading&&!e.data?x.jsx("div",{className:"flex h-full min-h-screen items-center justify-center bg-gray-950",children:x.jsx("span",{className:"brand-title text-4xl text-gray-100",children:"Pierre"})}):x.jsxs("div",{className:"flex h-full flex-col",children:[x.jsxs("header",{className:"flex items-center gap-3 border-b border-gray-200 px-4 py-2 dark:border-gray-800",children:[x.jsx("h1",{className:"brand-title",title:"Pierre — a play on “PR”",children:"Pierre"}),x.jsxs("div",{className:"ml-auto flex items-center gap-3",children:[x.jsx(TTe,{}),x.jsx(wTe,{}),x.jsx("button",{type:"button",onClick:()=>a(!0),className:"rounded border border-gray-300 px-2 py-0.5 text-xs font-semibold hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",title:"Help — what is Pierre and how to use it","aria-label":"Help",children:"?"}),x.jsx("button",{type:"button",onClick:n,className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",title:"Toggle dark mode",children:t?"☀":"☾"}),s&&x.jsx("button",{type:"button",onClick:o,className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",title:"Sign out","aria-label":"Sign out",children:x.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[x.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),x.jsx("polyline",{points:"16 17 21 12 16 7"}),x.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]})})]})]}),r&&x.jsx(STe,{onClose:()=>a(!1)}),x.jsx(oG,{}),x.jsx(fG,{}),x.jsxs("main",{className:`flex min-h-0 flex-1 flex-col${l?" focus-frame":""}`,children:[x.jsx("section",{className:"min-h-0 flex-1 overflow-hidden",children:x.jsx(_we,{})}),x.jsx("div",{role:"separator","aria-orientation":"horizontal","aria-label":"Resize detail pane",onPointerDown:v,onPointerMove:y,onPointerUp:_,title:"Drag to resize",className:"h-1 shrink-0 cursor-row-resize bg-gray-200 transition-colors hover:bg-blue-400 dark:bg-gray-800 dark:hover:bg-blue-500"}),x.jsx("section",{ref:h,style:{height:c},className:"shrink-0 overflow-auto",children:x.jsx(gTe,{})})]}),x.jsx(yTe,{})]})}function Mx(){}function LTe(e,{interval:t=1e3,onError:n=Mx}={}){if(typeof e!="function")throw new Error("argument is not function.");let r=0,a=null,s=!1,o=!1;return async(...l)=>{if(a=l,!o){for(o=!0;s;)await new Promise(c=>Mo.setTimeout(c,t));for(;Date.now()<r;)await new Promise(c=>Mo.setTimeout(c,r-Date.now()));o=!1,s=!0;try{await e(...a)}catch(c){try{n(c)}catch{}}r=Date.now()+t,s=!1}}}var FTe=({storage:e,key:t="REACT_QUERY_OFFLINE_CACHE",throttleTime:n=1e3,serialize:r=JSON.stringify,deserialize:a=JSON.parse,retry:s})=>{if(e){const o=async l=>{try{const c=await r(l);await e.setItem(t,c);return}catch(c){return c}};return{persistClient:LTe(async l=>{let c=l,d=await o(c),h=0;for(;d&&c;)h++,c=await(s==null?void 0:s({persistedClient:c,error:d,errorCount:h})),c&&(d=await o(c))},{interval:n}),restoreClient:async()=>{const l=await e.getItem(t);if(l)return await a(l)},removeClient:()=>e.removeItem(t)}}return{persistClient:Mx,restoreClient:()=>Promise.resolve(void 0),removeClient:Mx}};function wy(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}function $Te(e,t){let n;const r=()=>{if(n)return n;const a=indexedDB.open(e);return a.onupgradeneeded=()=>a.result.createObjectStore(t),n=wy(a),n.then(s=>{s.onclose=()=>n=void 0},()=>{}),n};return(a,s)=>r().then(o=>s(o.transaction(t,a).objectStore(t)))}let r1;function AT(){return r1||(r1=$Te("keyval-store","keyval")),r1}function BTe(e,t=AT()){return t("readonly",n=>wy(n.get(e)))}function UTe(e,t,n=AT()){return n("readwrite",r=>(r.put(t,e),wy(r.transaction)))}function HTe(e,t=AT()){return t("readwrite",n=>(n.delete(e),wy(n.transaction)))}const jTe=FTe({storage:{getItem:e=>BTe(e).then(t=>t??null),setItem:(e,t)=>UTe(e,t),removeItem:e=>HTe(e)},key:"pierre-query-cache",throttleTime:1e3}),zTe=new $F({defaultOptions:{queries:{staleTime:3e4,refetchOnWindowFocus:!1,retry:1}}});var Nv,S2;(S2=(Nv=navigator.storage)==null?void 0:Nv.persist)==null||S2.call(Nv);const g6=document.getElementById("root");if(!g6)throw new Error("#root not found");const YTe=1e3*60*60*24*7;iF.createRoot(g6).render(x.jsx(U.StrictMode,{children:x.jsx(t5,{client:zTe,persistOptions:{persister:jTe,maxAge:YTe,buster:"pierre-detail-v1",dehydrateOptions:{shouldDehydrateQuery:e=>{const t=e.queryKey[0];return(t==="pr"||t==="thread")&&e.state.status==="success"}}},children:x.jsx(MTe,{})})}));
|
|
1371
|
+
`)}function wTe(){const e=Dr(),[t,n]=U.useState(!1),[r,a]=U.useState(!1),[s,o]=U.useState(!1),[l,c]=U.useState(!1),[d,h]=U.useState(null),{data:p}=ri({queryKey:["repos"],queryFn:ln.listRepos,refetchInterval:t?3e3:3e4}),v=(p??[]).map(J=>J.id).join(","),{data:y}=ri({queryKey:["sync-status",v],enabled:t&&!!p&&p.length>0,queryFn:()=>Promise.all((p??[]).map(J=>ln.syncStatus(J.id))),refetchInterval:1500}),_=d==null?p??[]:(p??[]).filter(J=>J.id===d),k=new Set(_.map(J=>J.id)),S=y==null?void 0:y.filter(J=>k.has(J.repoId)),I=(S??[]).filter(J=>J.status==="running"),O=I.length,R=O>0&&I.every(J=>{var ye;return((ye=J.progress)==null?void 0:ye.foregroundComplete)===!0}),D=_Te(p??[]),$=U.useRef(D),P=U.useRef(!1),Q=U.useRef(null),B=()=>{Q.current!=null&&(clearTimeout(Q.current),Q.current=null)},K=()=>{o(!1),P.current=!1,B()};U.useEffect(()=>B,[]);const H=()=>{e.invalidateQueries({queryKey:["timeline"]}),e.invalidateQueries({queryKey:["open-prs"]}),e.invalidateQueries({queryKey:["users"]}),e.invalidateQueries({queryKey:["mergers"]}),e.invalidateQueries({queryKey:["my-turn"]}),e.invalidateQueries({queryKey:["me"]})};U.useEffect(()=>{$.current!==D&&($.current=D,H())},[D]),U.useEffect(()=>{!t||!R||P.current||(P.current=!0,a(!1),H())},[t,R]),U.useEffect(()=>{O>0&&o(!0)},[O]),U.useEffect(()=>{t&&s&&y&&O===0&&(n(!1),o(!1),H(),B(),Q.current=setTimeout(()=>{a(!1),Q.current=null},1e3))},[t,s,y,O]);const V=qe(J=>J.syncModalSignal),X=qe(J=>J.syncModalRepoId),ce=U.useRef(V);if(U.useEffect(()=>{V!==ce.current&&(ce.current=V,h(X),a(!0),n(!0),K(),e.invalidateQueries({queryKey:["repos"]}),e.invalidateQueries({queryKey:["sync-status"]}))},[V,e]),!p||p.length===0)return null;const ae=p.find(J=>J.lastSyncStatus==="error"),ue=async(J=!1)=>{n(!0),a(!0),h(null),K(),await Promise.allSettled(p.map(ye=>ln.syncRepo(ye.id,J))),e.invalidateQueries({queryKey:["repos"]}),e.invalidateQueries({queryKey:["sync-status"]})},be=async()=>{c(!0),B();const J=(S??[]).filter(F=>F.status==="running").map(F=>F.repoId),ye=J.length?J:_.map(F=>F.id);await Promise.allSettled(ye.map(F=>ln.cancelSync(F))),n(!1),o(!1),c(!1),a(!1),e.invalidateQueries({queryKey:["repos"]}),H()},ke=R?"loading older history…":O>0?`syncing ${O} repo${O===1?"":"s"}…`:"syncing…";return x.jsxs(x.Fragment,{children:[r&&x.jsx(bTe,{repos:_,statuses:S,cancelling:l,onCancel:()=>void be()}),x.jsxs("div",{className:"flex items-center gap-2 text-xs text-gray-500",children:[ae?x.jsxs("span",{className:"text-red-500",title:ae.lastSyncError??"",children:["sync error: ",ae.fullName]}):x.jsx("span",{className:"cursor-help",title:xTe(D),children:t?ke:D?`synced ${As(D)}`:"not synced yet"}),x.jsx("button",{type:"button",onClick:()=>void ue(!1),disabled:t,className:"rounded border border-gray-300 px-2 py-0.5 hover:border-gray-400 disabled:opacity-50 dark:border-gray-700 dark:hover:border-gray-500",children:"Sync now"}),x.jsx("button",{type:"button",onClick:()=>{window.confirm("Deep re-sync re-fetches the full backfill window for every repo. Slower, but catches CI/thread changes the incremental sync can lag. Continue?")&&ue(!0)},disabled:t,className:"rounded px-1.5 py-0.5 text-gray-400 hover:text-gray-600 disabled:opacity-50",title:"Force a full backfill for all repos",children:"deep"})]})]})}function TTe(){const e=qe(D=>D.searchQuery),t=qe(D=>D.setSearchQuery),n=qe(D=>D.openPrFocused),{data:r}=Gx(),{data:a}=Vx(),{data:s}=yf(),{data:o}=R0(),[l,c]=U.useState(!1),[d,h]=U.useState(-1),p=U.useRef(null),v=U.useMemo(()=>{const D=new Map;for(const $ of s??[])D.set($.id,$.fullName);return D},[s]),y=U.useMemo(()=>Kp(o),[o]),_=U.useMemo(()=>{const D=new Map;for(const $ of(r==null?void 0:r.prs)??[])D.set($.id,$);for(const $ of(a==null?void 0:a.prs)??[])D.has($.id)||D.set($.id,$);return[...D.values()]},[r,a]),k=U.useMemo(()=>{const D=e.trim().toLowerCase();return D?_.filter($=>$.title.toLowerCase().includes(D)).slice(0,30):[]},[_,e]),S=l&&e.trim().length>0,I=d>=0&&d<k.length?k[d].id:null;qp(p,()=>c(!1),S),U.useEffect(()=>{var D,$;I!=null&&(($=(D=p.current)==null?void 0:D.querySelector(`#pr-result-${I}`))==null||$.scrollIntoView({block:"nearest"}))},[I]);const O=D=>{D&&(n(D.id),c(!1))},R=D=>{if(D.key==="Escape"){c(!1),D.target.blur();return}!S||k.length===0||(D.key==="ArrowDown"?(D.preventDefault(),h($=>($+1)%k.length)):D.key==="ArrowUp"?(D.preventDefault(),h($=>$<=0?k.length-1:$-1)):D.key==="Enter"&&(D.preventDefault(),O(k[d>=0?d:0])))};return x.jsxs("div",{ref:p,className:"relative",children:[x.jsx("input",{type:"search",value:e,placeholder:"Search PR titles…",onChange:D=>{t(D.target.value),h(-1),c(!0)},onFocus:()=>c(!0),onKeyDown:R,role:"combobox","aria-expanded":S,"aria-controls":"pr-search-results","aria-autocomplete":"list","aria-activedescendant":I!=null?`pr-result-${I}`:void 0,"aria-label":"Search PR titles",className:"w-56 rounded border border-gray-300 bg-transparent px-2 py-0.5 text-xs focus:border-blue-500 focus:outline-none dark:border-gray-700"}),S&&x.jsx("div",{id:"pr-search-results",role:"listbox","aria-label":"PR search results",className:"absolute right-0 top-full z-[60] mt-1 max-h-80 w-80 overflow-y-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-900",children:k.length===0?x.jsx("div",{className:"px-3 py-2 text-xs text-gray-500",children:"No matching PRs."}):k.map((D,$)=>{const P=D.authorId!=null?y.get(D.authorId):void 0;return x.jsxs("button",{id:`pr-result-${D.id}`,type:"button",role:"option","aria-selected":$===d,onMouseEnter:()=>h($),onClick:()=>O(D),className:`flex w-full flex-col gap-0.5 px-3 py-1.5 text-left ${$===d?"bg-gray-100 dark:bg-gray-800":""} hover:bg-gray-100 dark:hover:bg-gray-800`,children:[x.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-gray-400",children:[x.jsx(jo,{user:P,size:12}),x.jsx("span",{className:"truncate",title:Is(P,D.authorId),children:Is(P,D.authorId)}),x.jsx("span",{"aria-hidden":!0,children:"·"}),x.jsxs("span",{className:"shrink-0",children:[v.get(D.repoId)??`repo ${D.repoId}`," · #",D.number]})]}),x.jsx("span",{className:"truncate text-xs",title:D.title,children:D.title})]},D.id)})})]})}function STe({onClose:e}){return U.useEffect(()=>{const t=n=>{n.key==="Escape"&&(n.stopImmediatePropagation(),e())};return window.addEventListener("keydown",t,!0),()=>window.removeEventListener("keydown",t,!0)},[e]),x.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",onClick:e,role:"presentation",children:x.jsxs("div",{className:"flex max-h-[80vh] w-[34rem] max-w-[92vw] flex-col rounded-lg border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900",onClick:t=>t.stopPropagation(),role:"dialog","aria-modal":"true","aria-label":"Pierre help",children:[x.jsxs("div",{className:"flex items-center justify-between border-b border-gray-200 px-4 py-2 dark:border-gray-800",children:[x.jsx("h2",{className:"brand-title",children:"Pierre"}),x.jsx("button",{type:"button",onClick:e,className:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-200","aria-label":"Close (Esc)",title:"Close (Esc)",children:"✕"})]}),x.jsxs("div",{className:"min-h-0 flex-1 space-y-4 overflow-auto px-4 py-3 text-sm leading-relaxed text-gray-600 dark:text-gray-300",children:[x.jsx("p",{className:"text-gray-500 dark:text-gray-400",children:"A local dashboard for your team’s GitHub pull-request activity across repos, drawn as an interactive timeline. Everything runs on your machine."}),x.jsxs(ju,{title:"Track repositories",children:["Add repos in the filter bar’s ",x.jsx("em",{children:"add repo"})," box as ",x.jsx(kTe,{children:"owner/name"}),". Pierre syncs their PR activity every few minutes into a local file — nothing leaves your machine."]}),x.jsxs(ju,{title:"Read the timeline",children:["Rows are grouped ",x.jsx("strong",{children:"repo → contributor"}),". Each PR is a bar; the markers beneath it are events — commits, comments, reviews. Scroll to pan, hold the zoom key while scrolling to zoom. Click a marker for its details, or a PR bar to select it."]}),x.jsxs(ju,{title:"Focus mode",children:["To isolate one PR and just its contributors: double-click its bar, click"," ",x.jsx("strong",{children:"Focus"})," in the detail pane, or click a cross-person marker. Leave focus with the ",x.jsx("strong",{children:"✕"})," on the header"," ",x.jsx("strong",{children:"Focus mode"})," badge, ",x.jsx(Qh,{children:"Esc"}),", or the browser"," ",x.jsx("strong",{children:"Back"})," button."]}),x.jsxs(ju,{title:"Detail pane",children:["Selecting a PR opens the bottom pane with ",x.jsx("strong",{children:"Overview"})," (checks, summary, comments), ",x.jsx("strong",{children:"Threads"}),", and ",x.jsx("strong",{children:"Activity"}),". The ",x.jsx("em",{children:"Show"})," links jump back to that moment on the timeline; drag the divider to resize the pane."]}),x.jsxs(ju,{title:"Filter",children:["Narrow by date range, members (auto-scoped to who’s active in view), event categories, and thread states. ",x.jsx("em",{children:"Exclude bots"})," hides renovate / dependabot / CI noise."]}),x.jsxs(ju,{title:"Open-PRs strip",children:["The collapsible strip up top lists currently-open PRs — toggle between"," ",x.jsx("strong",{children:"all"}),", ",x.jsx("strong",{children:"my turn"}),", and"," ",x.jsx("strong",{children:"needs attention"}),"."]}),x.jsxs(ju,{title:"Keyboard",children:[x.jsx(Qh,{children:"/"})," focus the filter · ",x.jsx(Qh,{children:"j"}),"/",x.jsx(Qh,{children:"k"})," cycle PRs ·"," ",x.jsx(Qh,{children:"Esc"})," exit focus, else clear the selection."]})]})]})})}function ju({title:e,children:t}){return x.jsxs("section",{children:[x.jsx("h3",{className:"mb-1 font-semibold text-gray-800 dark:text-gray-100",children:e}),x.jsx("p",{children:t})]})}function kTe({children:e}){return x.jsx("code",{className:"rounded bg-gray-100 px-1 font-mono text-[12px] text-gray-700 dark:bg-gray-800 dark:text-gray-300",children:e})}function Qh({children:e}){return x.jsx("kbd",{className:"rounded border border-gray-300 bg-gray-100 px-1 text-[11px] font-medium text-gray-600 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300",children:e})}const CTe={expired:"Your sign-in link expired. Please sign in again.",failed:"We couldn’t complete sign-in with GitHub. Please try again.",error:"Something went wrong reaching GitHub. Please try again in a moment."};function NTe(){const[e]=U.useState(()=>{const t=new URLSearchParams(window.location.search).get("auth");return t?CTe[t]??"We couldn’t complete sign-in. Please try again.":null});return U.useEffect(()=>{if(!e)return;const t=new URL(window.location.href);t.searchParams.delete("auth"),window.history.replaceState({},"",t.pathname+t.search+t.hash)},[e]),x.jsx("div",{className:"flex h-full min-h-screen w-full items-center justify-center bg-gray-950 px-4 text-gray-100",children:x.jsxs("div",{className:"flex w-full max-w-sm flex-col items-center rounded-2xl border border-gray-800 bg-gray-900/40 px-8 py-10 text-center shadow-xl",children:[x.jsx("span",{className:"brand-title text-4xl",title:"Pierre — a play on “PR”",children:"Pierre"}),x.jsx("p",{className:"mt-4 text-sm text-gray-400",children:"Sign in to view your team’s GitHub activity — pull requests, reviews, and what needs your attention."}),e&&x.jsx("div",{role:"alert",className:"mt-6 w-full rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs text-amber-200",children:e}),x.jsxs("a",{href:"/api/auth/login",className:"mt-7 inline-flex w-full items-center justify-center gap-2 rounded-lg bg-blue-600 px-4 py-2.5 text-sm font-semibold text-white transition-colors hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-sky-400 focus:ring-offset-2 focus:ring-offset-gray-950",children:[x.jsx("svg",{viewBox:"0 0 16 16",width:"18",height:"18",fill:"currentColor","aria-hidden":"true",children:x.jsx("path",{fillRule:"evenodd",d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8Z"})}),"Sign in with GitHub"]}),x.jsx("p",{className:"mt-5 text-xs leading-relaxed text-gray-500",children:"Read-only access. Add any public repo instantly; private repos only when you install Pierre on them. Revoke anytime from GitHub settings."})]})})}const ITe=["7d","14d","30d","90d","custom"];function d2(e,t){if(e.length!==t.length)return!1;const n=new Set(e);return t.every(r=>n.has(r))}function f2(e){if(!e)return null;const t=e.split(",").map(n=>Number.parseInt(n,10)).filter(Number.isFinite);return t.length?t:null}function ATe(){const e=new URLSearchParams(window.location.search),t={},n=e.get("preset");n&&ITe.includes(n)&&(t.preset=n),t.repoIds=f2(e.get("repos")),t.userIds=f2(e.get("users")),e.get("bots")!==null&&(t.excludeBots=e.get("bots")!=="0");const r=e.get("stale");r==="0"?t.excludeStale=!1:r==="1"&&(t.excludeStale=!0),t.customFrom=e.get("from"),t.customTo=e.get("to");const a=e.get("cats");if(a){const h=new Set(Tp);t.categories=a.split(",").filter(p=>h.has(p))}const s=e.get("status");if(s!==null){const h=new Set(zx);t.prStatuses=s.split(",").filter(p=>h.has(p))}const o=e.get("states");if(o){const h=new Set(H2);t.derivedStates=o.split(",").filter(p=>h.has(p))}const l=e.get("pr");l&&(t.selectedPrId=Number.parseInt(l,10));const c=e.get("thread");c&&(t.selectedThreadId=Number.parseInt(c,10));const d=e.get("strip");return(d==="my_turn"||d==="needs_attention"||d==="all")&&(t.stripFilter=d),e.get("open")==="1"&&(t.stripCollapsed=!1),t}function OTe(e){var a,s;const t=new URLSearchParams;e.preset!=="14d"&&t.set("preset",e.preset),(a=e.repoIds)!=null&&a.length&&t.set("repos",e.repoIds.join(",")),(s=e.userIds)!=null&&s.length&&t.set("users",e.userIds.join(",")),e.excludeBots||t.set("bots","0"),e.excludeStale||t.set("stale","0"),e.preset==="custom"&&e.customFrom&&t.set("from",e.customFrom),e.preset==="custom"&&e.customTo&&t.set("to",e.customTo),d2(e.categories,rp)||t.set("cats",e.categories.join(",")),d2(e.prStatuses,z2)||t.set("status",e.prStatuses.join(",")),e.derivedStates.length&&t.set("states",e.derivedStates.join(",")),e.selectedPrId&&t.set("pr",String(e.selectedPrId)),e.selectedThreadId&&t.set("thread",String(e.selectedThreadId)),e.stripFilter!=="all"&&t.set("strip",e.stripFilter),e.stripCollapsed||t.set("open","1");const n=t.toString(),r=`${window.location.pathname}${n?`?${n}`:""}`;r!==window.location.pathname+window.location.search&&window.history.replaceState(null,"",r)}function RTe(){const e=U.useRef(!1);U.useEffect(()=>(e.current||(qe.getState().hydrate(ATe()),e.current=!0),qe.subscribe(n=>OTe(n))),[])}function h2(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||e.isContentEditable}function DTe(){const{data:e}=Wx();U.useEffect(()=>{const t=n=>{var c;const{selectedPrId:r,selectPr:a,clearSelection:s,focusActive:o,exitFocus:l}=qe.getState();if(n.key==="Escape"){h2(n.target)?n.target.blur():o?l():s();return}if(!h2(n.target)){if(n.key==="/"){n.preventDefault(),(c=document.getElementById("add-repo-input"))==null||c.focus();return}if(n.key==="j"||n.key==="k"){const d=[...(e==null?void 0:e.prs)??[]].sort((y,_)=>_.openedAt.localeCompare(y.openedAt));if(d.length===0)return;const h=d.findIndex(y=>y.id===r);let p;h===-1?p=0:p=n.key==="j"?h+1:h-1,p=Math.max(0,Math.min(d.length-1,p));const v=d[p];v&&a(v.id)}}};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e])}function PTe(){const e=Dr();U.useEffect(()=>{let t=null;const n=()=>{const s=new Map,o=(l,c)=>{const d=s.get(l);(!d||c>d)&&s.set(l,c)};for(const[,l]of e.getQueriesData({queryKey:["timeline"]}))for(const c of(l==null?void 0:l.prs)??[])o(c.id,c.updatedAt);for(const[,l]of e.getQueriesData({queryKey:["open-prs"]}))for(const c of(l==null?void 0:l.prs)??[])o(c.id,c.updatedAt);for(const[l,c]of s){const d=e.getQueryData(["pr",l]);if(!d||d.updatedAt>=c)continue;const h=e.getQueryState(["pr",l]);if(!(h&&h.fetchStatus!=="idle")){e.invalidateQueries({queryKey:["pr",l]});for(const p of d.threads??[])e.invalidateQueries({queryKey:["thread",p.id]})}}},r=()=>{t||(t=setTimeout(()=>{t=null,n()},300))};r();const a=e.getQueryCache().subscribe(s=>{const o=s.query.queryKey[0];(o==="timeline"||o==="open-prs")&&r()});return()=>{t&&clearTimeout(t),a()}},[e])}function MTe(){const[e,t]=U.useState(()=>(localStorage.getItem("theme")??"dark")!=="light");return U.useEffect(()=>{document.documentElement.classList.toggle("dark",e),localStorage.setItem("theme",e?"dark":"light")},[e]),[e,()=>t(n=>!n)]}function LTe(){var k;const e=Vp();RTe(),DTe(),PTe();const[t,n]=MTe(),[r,a]=U.useState(!1),s=((k=e.data)==null?void 0:k.deploymentMode)==="cloud",o=()=>{ln.logout().finally(()=>window.location.assign("/"))},l=qe(S=>S.focusActive),[c,d]=f6("pierre:detailPaneHeight",384),h=U.useRef(null),p=U.useRef(null),v=S=>{var I;p.current={startY:S.clientY,startH:((I=h.current)==null?void 0:I.offsetHeight)??c},S.currentTarget.setPointerCapture(S.pointerId)},y=S=>{const I=p.current;if(!I||!h.current)return;const O=window.innerHeight*.7,R=Math.min(Math.max(I.startH+(I.startY-S.clientY),160),O);h.current.style.height=`${R}px`,window.dispatchEvent(new Event("resize"))},_=S=>{!p.current||!h.current||(p.current=null,S.currentTarget.releasePointerCapture(S.pointerId),d(h.current.offsetHeight))};return e.error instanceof wp&&e.error.status===401?x.jsx(NTe,{}):e.isLoading&&!e.data?x.jsx("div",{className:"flex h-full min-h-screen items-center justify-center bg-gray-950",children:x.jsx("span",{className:"brand-title text-4xl text-gray-100",children:"Pierre"})}):x.jsxs("div",{className:"flex h-full flex-col",children:[x.jsxs("header",{className:"flex items-center gap-3 border-b border-gray-200 px-4 py-2 dark:border-gray-800",children:[x.jsx("h1",{className:"brand-title",title:"Pierre — a play on “PR”",children:"Pierre"}),x.jsxs("div",{className:"ml-auto flex items-center gap-3",children:[x.jsx(TTe,{}),x.jsx(wTe,{}),x.jsx("button",{type:"button",onClick:()=>a(!0),className:"rounded border border-gray-300 px-2 py-0.5 text-xs font-semibold hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",title:"Help — what is Pierre and how to use it","aria-label":"Help",children:"?"}),x.jsx("button",{type:"button",onClick:n,className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",title:"Toggle dark mode",children:t?"☀":"☾"}),s&&x.jsx("button",{type:"button",onClick:o,className:"rounded border border-gray-300 px-2 py-0.5 text-xs hover:border-gray-400 dark:border-gray-700 dark:hover:border-gray-500",title:"Sign out","aria-label":"Sign out",children:x.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[x.jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),x.jsx("polyline",{points:"16 17 21 12 16 7"}),x.jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]})})]})]}),r&&x.jsx(STe,{onClose:()=>a(!1)}),x.jsx(oG,{}),x.jsx(fG,{}),x.jsxs("main",{className:`flex min-h-0 flex-1 flex-col${l?" focus-frame":""}`,children:[x.jsx("section",{className:"min-h-0 flex-1 overflow-hidden",children:x.jsx(_we,{})}),x.jsx("div",{role:"separator","aria-orientation":"horizontal","aria-label":"Resize detail pane",onPointerDown:v,onPointerMove:y,onPointerUp:_,title:"Drag to resize",className:"h-1 shrink-0 cursor-row-resize bg-gray-200 transition-colors hover:bg-blue-400 dark:bg-gray-800 dark:hover:bg-blue-500"}),x.jsx("section",{ref:h,style:{height:c},className:"shrink-0 overflow-auto",children:x.jsx(gTe,{})})]}),x.jsx(yTe,{})]})}function Mx(){}function FTe(e,{interval:t=1e3,onError:n=Mx}={}){if(typeof e!="function")throw new Error("argument is not function.");let r=0,a=null,s=!1,o=!1;return async(...l)=>{if(a=l,!o){for(o=!0;s;)await new Promise(c=>Mo.setTimeout(c,t));for(;Date.now()<r;)await new Promise(c=>Mo.setTimeout(c,r-Date.now()));o=!1,s=!0;try{await e(...a)}catch(c){try{n(c)}catch{}}r=Date.now()+t,s=!1}}}var $Te=({storage:e,key:t="REACT_QUERY_OFFLINE_CACHE",throttleTime:n=1e3,serialize:r=JSON.stringify,deserialize:a=JSON.parse,retry:s})=>{if(e){const o=async l=>{try{const c=await r(l);await e.setItem(t,c);return}catch(c){return c}};return{persistClient:FTe(async l=>{let c=l,d=await o(c),h=0;for(;d&&c;)h++,c=await(s==null?void 0:s({persistedClient:c,error:d,errorCount:h})),c&&(d=await o(c))},{interval:n}),restoreClient:async()=>{const l=await e.getItem(t);if(l)return await a(l)},removeClient:()=>e.removeItem(t)}}return{persistClient:Mx,restoreClient:()=>Promise.resolve(void 0),removeClient:Mx}};function wy(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}function BTe(e,t){let n;const r=()=>{if(n)return n;const a=indexedDB.open(e);return a.onupgradeneeded=()=>a.result.createObjectStore(t),n=wy(a),n.then(s=>{s.onclose=()=>n=void 0},()=>{}),n};return(a,s)=>r().then(o=>s(o.transaction(t,a).objectStore(t)))}let r1;function AT(){return r1||(r1=BTe("keyval-store","keyval")),r1}function UTe(e,t=AT()){return t("readonly",n=>wy(n.get(e)))}function HTe(e,t,n=AT()){return n("readwrite",r=>(r.put(t,e),wy(r.transaction)))}function jTe(e,t=AT()){return t("readwrite",n=>(n.delete(e),wy(n.transaction)))}const zTe=$Te({storage:{getItem:e=>UTe(e).then(t=>t??null),setItem:(e,t)=>HTe(e,t),removeItem:e=>jTe(e)},key:"pierre-query-cache",throttleTime:1e3}),YTe=new $F({defaultOptions:{queries:{staleTime:3e4,refetchOnWindowFocus:!1,retry:1}}});var Nv,S2;(S2=(Nv=navigator.storage)==null?void 0:Nv.persist)==null||S2.call(Nv);const g6=document.getElementById("root");if(!g6)throw new Error("#root not found");const WTe=1e3*60*60*24*7;iF.createRoot(g6).render(x.jsx(U.StrictMode,{children:x.jsx(t5,{client:YTe,persistOptions:{persister:zTe,maxAge:WTe,buster:"pierre-detail-v1",dehydrateOptions:{shouldDehydrateQuery:e=>{const t=e.queryKey[0];return(t==="pr"||t==="thread")&&e.state.status==="success"}}},children:x.jsx(LTe,{})})}));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
.vis-time-axis{position:relative;overflow:hidden}.vis-time-axis.vis-foreground{top:0;left:0;width:100%}.vis-time-axis.vis-background{position:absolute;top:0;left:0;width:100%;height:100%}.vis-time-axis .vis-text{position:absolute;color:#4d4d4d;padding:3px;overflow:hidden;box-sizing:border-box;white-space:nowrap}.vis-time-axis .vis-text.vis-measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis-time-axis .vis-grid.vis-vertical{position:absolute;border-left:1px solid}.vis-time-axis .vis-grid.vis-vertical-rtl{position:absolute;border-right:1px solid}.vis-time-axis .vis-grid.vis-minor{border-color:#e5e5e5}.vis-time-axis .vis-grid.vis-major{border-color:#bfbfbf}.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis-custom-time{background-color:#6e94ff;width:2px;cursor:move;z-index:1}.vis-custom-time>.vis-custom-time-marker{background-color:inherit;color:#fff;font-size:12px;white-space:nowrap;padding:3px 5px;top:0;cursor:initial;z-index:inherit}.vis-current-time{background-color:#ff7f6e;width:2px;z-index:1;pointer-events:none}.vis-rolling-mode-btn{height:40px;width:40px;position:absolute;top:7px;right:20px;border-radius:50%;font-size:28px;cursor:pointer;opacity:.8;color:#fff;font-weight:700;text-align:center;background:#3876c2}.vis-rolling-mode-btn:before{content:"⛶"}.vis-rolling-mode-btn:hover{opacity:1}.vis-panel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right,.vis-panel.vis-top,.vis-panel.vis-bottom{border:1px #bfbfbf}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis-left.vis-panel.vis-vertical-scroll,.vis-right.vis-panel.vis-vertical-scroll{height:100%;overflow-x:hidden;overflow-y:scroll}.vis-left.vis-panel.vis-vertical-scroll{direction:rtl}.vis-left.vis-panel.vis-vertical-scroll .vis-content,.vis-right.vis-panel.vis-vertical-scroll{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll .vis-content{direction:rtl}.vis-panel.vis-center,.vis-panel.vis-top,.vis-panel.vis-bottom{border-left-style:solid;border-right-style:solid}.vis-background{overflow:hidden}.vis-panel>.vis-content{position:relative}.vis-panel .vis-shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px #000c}.vis-panel .vis-shadow.vis-top{top:-1px;left:0}.vis-panel .vis-shadow.vis-bottom{bottom:-1px;left:0}.vis-graph-group0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis-graph-group1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis-graph-group2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis-graph-group3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis-graph-group4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis-graph-group5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis-graph-group6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis-graph-group7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis-graph-group8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis-graph-group9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis-timeline .vis-fill{fill-opacity:.1;stroke:none}.vis-timeline .vis-bar{fill-opacity:.5;stroke-width:1px}.vis-timeline .vis-point{stroke-width:2px;fill-opacity:1}.vis-timeline .vis-legend-background{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis-timeline .vis-outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis-timeline .vis-icon-fill{fill-opacity:.3;stroke:none}.vis-timeline{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis-loading-screen{width:100%;height:100%;position:absolute;top:0;left:0}.vis [class*=span]{min-height:0;width:auto}.vis-item{position:absolute;color:#1a1a1a;border-color:#97b0f8;border-width:1px;background-color:#d5ddf6;display:inline-block;z-index:1}.vis-item.vis-selected{border-color:#ffc200;background-color:#fff785;z-index:2}.vis-editable.vis-selected{cursor:move}.vis-item.vis-point.vis-selected{background-color:#fff785}.vis-item.vis-box{text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-point{background:none}.vis-item.vis-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis-item.vis-range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis-item.vis-background{border:none;background-color:#d5ddf666;box-sizing:border-box;padding:0;margin:0}.vis-item .vis-item-overflow{position:relative;width:100%;height:100%;padding:0;margin:0;overflow:hidden}.vis-item-visible-frame{white-space:nowrap}.vis-item.vis-range .vis-item-content{position:relative;display:inline-block}.vis-item.vis-background .vis-item-content{position:absolute;display:inline-block}.vis-item.vis-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item .vis-item-content{white-space:nowrap;box-sizing:border-box;padding:5px}.vis-item .vis-onUpdateTime-tooltip{position:absolute;background:#4f81bd;color:#fff;width:200px;text-align:center;white-space:nowrap;padding:5px;border-radius:1px;transition:.4s;-o-transition:.4s;-moz-transition:.4s;-webkit-transition:.4s}.vis-item .vis-delete,.vis-item .vis-delete-rtl{position:absolute;top:0;width:24px;height:24px;box-sizing:border-box;padding:0 5px;cursor:pointer;transition:background .2s linear}.vis-item .vis-delete{right:-24px}.vis-item .vis-delete-rtl{left:-24px}.vis-item .vis-delete:after,.vis-item .vis-delete-rtl:after{content:"×";color:red;font-family:arial,sans-serif;font-size:22px;font-weight:700;transition:color .2s linear}.vis-item .vis-delete:hover,.vis-item .vis-delete-rtl:hover{background:red}.vis-item .vis-delete:hover:after,.vis-item .vis-delete-rtl:hover:after{color:#fff}.vis-item .vis-drag-center{position:absolute;width:100%;height:100%;top:0;left:0;cursor:move}.vis-item.vis-range .vis-drag-left{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;left:-4px;cursor:w-resize}.vis-item.vis-range .vis-drag-right{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;right:-4px;cursor:e-resize}.vis-range.vis-item.vis-readonly .vis-drag-left,.vis-range.vis-item.vis-readonly .vis-drag-right{cursor:auto}.vis-item.vis-cluster{vertical-align:center;text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-cluster-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item.vis-cluster-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}div.vis-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;color:#000;background-color:#f5f4ed;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px #0003;pointer-events:none;z-index:5}.vis-itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis-itemset .vis-background,.vis-itemset .vis-foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis-axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis-foreground .vis-group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-foreground .vis-group:last-child{border-bottom:none}.vis-nesting-group{cursor:pointer}.vis-label.vis-nested-group.vis-group-level-unknown-but-gte1{background:#f5f5f5}.vis-label.vis-nested-group.vis-group-level-0{background-color:#fff}.vis-ltr .vis-label.vis-nested-group.vis-group-level-0 .vis-inner{padding-left:0}.vis-rtl .vis-label.vis-nested-group.vis-group-level-0 .vis-inner{padding-right:0}.vis-label.vis-nested-group.vis-group-level-1{background-color:#0000000d}.vis-ltr .vis-label.vis-nested-group.vis-group-level-1 .vis-inner{padding-left:15px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-1 .vis-inner{padding-right:15px}.vis-label.vis-nested-group.vis-group-level-2{background-color:#0000001a}.vis-ltr .vis-label.vis-nested-group.vis-group-level-2 .vis-inner{padding-left:30px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-2 .vis-inner{padding-right:30px}.vis-label.vis-nested-group.vis-group-level-3{background-color:#00000026}.vis-ltr .vis-label.vis-nested-group.vis-group-level-3 .vis-inner{padding-left:45px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-3 .vis-inner{padding-right:45px}.vis-label.vis-nested-group.vis-group-level-4{background-color:#0003}.vis-ltr .vis-label.vis-nested-group.vis-group-level-4 .vis-inner{padding-left:60px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-4 .vis-inner{padding-right:60px}.vis-label.vis-nested-group.vis-group-level-5{background-color:#00000040}.vis-ltr .vis-label.vis-nested-group.vis-group-level-5 .vis-inner{padding-left:75px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-5 .vis-inner{padding-right:75px}.vis-label.vis-nested-group.vis-group-level-6{background-color:#0000004d}.vis-ltr .vis-label.vis-nested-group.vis-group-level-6 .vis-inner{padding-left:90px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-6 .vis-inner{padding-right:90px}.vis-label.vis-nested-group.vis-group-level-7{background-color:#00000059}.vis-ltr .vis-label.vis-nested-group.vis-group-level-7 .vis-inner{padding-left:105px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-7 .vis-inner{padding-right:105px}.vis-label.vis-nested-group.vis-group-level-8{background-color:#0006}.vis-ltr .vis-label.vis-nested-group.vis-group-level-8 .vis-inner{padding-left:120px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-8 .vis-inner{padding-right:120px}.vis-label.vis-nested-group.vis-group-level-9{background-color:#00000073}.vis-ltr .vis-label.vis-nested-group.vis-group-level-9 .vis-inner{padding-left:135px}.vis-rtl .vis-label.vis-nested-group.vis-group-level-9 .vis-inner{padding-right:135px}.vis-label.vis-nested-group{background-color:#00000080}.vis-ltr .vis-label.vis-nested-group .vis-inner{padding-left:150px}.vis-rtl .vis-label.vis-nested-group .vis-inner{padding-right:150px}.vis-group-level-unknown-but-gte1{border:1px solid red}.vis-label.vis-nesting-group:before{display:inline-block;width:15px}.vis-label.vis-nesting-group.expanded:before{content:"▼"}.vis-label.vis-nesting-group.collapsed:before{content:"▶"}.vis-rtl .vis-label.vis-nesting-group.collapsed:before{content:"◀"}.vis-ltr .vis-label:not(.vis-nesting-group):not(.vis-group-level-0){padding-left:15px}.vis-rtl .vis-label:not(.vis-nesting-group):not(.vis-group-level-0){padding-right:15px}.vis-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis-labelset .vis-label{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-labelset .vis-label.draggable{cursor:pointer}.vis-group-is-dragging{background:#0000001a}.vis-labelset .vis-label:last-child{border-bottom:none}.vis-labelset .vis-label .vis-inner{display:inline-block;padding:5px}.vis-labelset .vis-label .vis-inner.vis-hidden{padding:0}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper:after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-configuration.vis-config-button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-configuration.vis-config-item.vis-config-s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:700}div.vis-configuration.vis-config-label{width:120px;height:25px;line-height:25px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{top:1px;width:30px;height:19px;border:1px solid #444444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{position:relative;top:-5px;width:60px;padding:1px;margin:0;pointer-events:none}input.vis-configuration.vis-config-range{-webkit-appearance:none;border:0px solid white;background-color:#0000;width:300px;height:20px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:linear-gradient(to bottom,#dedede,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#dedede",endColorstr="#c8c8c8",GradientType=0);border:1px solid #999999;box-shadow:#aaa 0 0 3px;border-radius:3px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:linear-gradient(to bottom,#3876c2,#385380);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#3876c2",endColorstr="#385380",GradientType=0);box-shadow:#111927 0 0 1px;margin-top:-7px}input.vis-configuration.vis-config-range:focus{outline:none}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:linear-gradient(to bottom,#9d9d9d,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#9d9d9d",endColorstr="#c8c8c8",GradientType=0)}input.vis-configuration.vis-config-range::-moz-range-track{width:300px;height:10px;background:#dedede;background:linear-gradient(to bottom,#dedede,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#dedede",endColorstr="#c8c8c8",GradientType=0);border:1px solid #999999;box-shadow:#aaa 0 0 3px;border-radius:3px}input.vis-configuration.vis-config-range::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:-moz-focusring{outline:1px solid white;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{width:300px;height:5px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{position:absolute;background:#394c59d9;border:2px solid #f2faff;line-height:30px;height:30px;width:150px;text-align:center;color:#fff;font-size:14px;border-radius:4px;transition:opacity .3s ease-in-out}.vis-configuration-popup:after,.vis-configuration-popup:before{left:100%;top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.vis-configuration-popup:after{border-color:#88b7d500;border-left-color:#394c59d9;border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:#c2e1f500;border-left-color:#f2faff;border-width:12px;margin-top:-12px}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor{border-color:#e5e5e5}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major{border-color:#bfbfbf}.vis-data-axis .vis-y-axis.vis-major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-major.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-minor.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis-data-axis .vis-y-axis.vis-title.vis-measure{padding:0;margin:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title.vis-left{bottom:0;transform-origin:left bottom;transform:rotate(-90deg)}.vis-data-axis .vis-y-axis.vis-title.vis-right{bottom:0;transform-origin:right bottom;transform:rotate(90deg)}.vis-legend{background-color:#f7fcffa6;padding:5px;border:1px solid #b3b3b3;box-shadow:2px 2px 10px #9a9a9a8c}.vis-legend-text{white-space:nowrap;display:inline-block}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
|
2
|
+
Theme: GitHub Dark
|
|
3
|
+
Description: Dark theme as seen on github.com
|
|
4
|
+
Author: github.com
|
|
5
|
+
Maintainer: @Hirse
|
|
6
|
+
Updated: 2021-05-15
|
|
7
|
+
|
|
8
|
+
Outdated base version: https://github.com/primer/github-syntax-dark
|
|
9
|
+
Current colors taken from GitHub's CSS
|
|
10
|
+
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.left-0{left:0}.right-0{right:0}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\.5{top:.375rem}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.\!hidden{display:none!important}.hidden{display:none}.h-0{height:0px}.h-1{height:.25rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-full{height:100%}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-4{width:1rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-80{width:20rem}.w-96{width:24rem}.w-\[28rem\]{width:28rem}.w-\[34rem\]{width:34rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-\[14rem\]{max-width:14rem}.max-w-\[90vw\]{max-width:90vw}.max-w-\[92vw\]{max-width:92vw}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.gap-y-2{row-gap:.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-amber-400{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.border-amber-500\/40{border-color:#f59e0b66}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-400{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-300{--tw-border-opacity: 1;border-color:rgb(134 239 172 / var(--tw-border-opacity, 1))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-sky-300{--tw-border-opacity: 1;border-color:rgb(125 211 252 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-t-blue-500{--tw-border-opacity: 1;border-top-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.bg-\[\#8957e5\]\/15{background-color:#8957e526}.bg-amber-400\/5{background-color:#fbbf240d}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-black\/50{background-color:#00000080}.bg-blue-50\/50{background-color:#eff6ff80}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500\/10{background-color:#6b72801a}.bg-gray-500\/20{background-color:#6b728033}.bg-gray-900\/40{background-color:#11182766}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-orange-500\/10{background-color:#f973161a}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-500\/15{background-color:#0ea5e926}.bg-sky-500\/20{background-color:#0ea5e933}.bg-sky-500\/5{background-color:#0ea5e90d}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/95{background-color:#fffffff2}.bg-yellow-500\/10{background-color:#eab3081a}.p-2{padding:.5rem}.p-4{padding:1rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-3{padding-bottom:.75rem}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-28{padding-right:7rem}.pr-4{padding-right:1rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[9px\]{font-size:9px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[1\.45\]{line-height:1.45}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-wide{letter-spacing:.025em}.text-\[\#8957e5\]{--tw-text-opacity: 1;color:rgb(137 87 229 / var(--tw-text-opacity, 1))}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-700\/80{color:#15803dcc}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-sky-400\/80{color:#38bdf8cc}.text-sky-500{--tw-text-opacity: 1;color:rgb(14 165 233 / var(--tw-text-opacity, 1))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-blue-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}:root{color-scheme:light dark}html,body,#root{height:100%;margin:0}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}body:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}body{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.brand-title{font-family:Great Vibes,ui-serif,cursive;font-weight:400;font-size:1.75rem;line-height:1;letter-spacing:.3px;padding-bottom:2px}.focus-indicator{display:inline-flex;align-items:center;gap:7px;padding:2px 10px;border-radius:9999px;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:#0284c7;background:#38bdf81f;border:1px solid rgba(56,189,248,.4);white-space:nowrap}.dark .focus-indicator{color:#7dd3fc}.focus-indicator-dot{width:7px;height:7px;border-radius:9999px;background:#38bdf8;box-shadow:0 0 #38bdf899;animation:focus-dot-pulse 1.8s ease-in-out infinite}.focus-indicator-close{display:inline-flex;align-items:center;justify-content:center;margin-left:1px;margin-right:-4px;width:16px;height:16px;border-radius:9999px;font-size:10px;line-height:1;color:inherit;opacity:.7;cursor:pointer;transition:background .15s ease,opacity .15s ease}.focus-indicator-close:hover{opacity:1;background:#38bdf840}@keyframes focus-dot-pulse{0%,to{box-shadow:0 0 #38bdf88c}50%{box-shadow:0 0 0 5px #38bdf800}}@media(prefers-reduced-motion:reduce){.focus-indicator-dot{animation:none}}.focus-frame{position:relative}.focus-frame:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:20;pointer-events:none;border:1.5px solid rgba(56,189,248,.8);border-radius:8px;animation:focus-frame-pulse 2.4s ease-in-out infinite}@keyframes focus-frame-pulse{0%,to{box-shadow:inset 0 0 0 1px #38bdf81f,inset 0 0 10px #38bdf81a}50%{box-shadow:inset 0 0 0 1px #38bdf847,inset 0 0 18px 2px #38bdf833}}@media(prefers-reduced-motion:reduce){.focus-frame:after{animation:none}}.filters-disabled{opacity:.45;pointer-events:none}.md-body{font-size:13px;line-height:1.5;word-break:break-word}.md-body>*:first-child{margin-top:0}.md-body>*:last-child{margin-bottom:0}.md-body p{margin:.5em 0}.md-body h1,.md-body h2,.md-body h3{font-weight:600;margin:.6em 0 .3em}.md-body ul,.md-body ol{margin:.5em 0;padding-left:1.4em}.md-body ul{list-style:disc}.md-body ol{list-style:decimal}.md-body li{margin:.15em 0}.md-body a{color:#3b82f6;text-decoration:underline}.md-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;background:#7f7f7f2e;padding:.1em .3em;border-radius:4px}.md-body pre{margin:.5em 0;padding:.7em;border-radius:6px;overflow-x:auto;background:#0d1117}.md-body pre code{background:transparent;padding:0}.md-body blockquote{border-left:3px solid rgba(127,127,127,.4);padding-left:.8em;margin:.5em 0;color:#9ca3af}.md-body table{border-collapse:collapse;margin:.5em 0}.md-body th,.md-body td{border:1px solid rgba(127,127,127,.3);padding:.3em .6em}.md-body img{max-width:100%;max-height:24rem;height:auto}.md-body input[type=checkbox]{margin-right:.4em}.dark .vis-timeline{border-color:#1f2937}.dark .vis-panel .vis-content,.dark .vis-panel .vis-background,.dark .vis-labelset .vis-label,.dark .vis-foreground .vis-group{border-color:#1f2937;color:#e5e7eb}.dark .vis-time-axis .vis-text{color:#9ca3af}.dark .vis-time-axis .vis-grid.vis-minor{border-color:#1f2937}.dark .vis-time-axis .vis-grid.vis-major{border-color:#374151}.dark .vis-labelset .vis-label{color:#d1d5db}.dark .vis-current-time{background-color:#ef4444}.vis-labelset .vis-label.vis-nested-group{padding-left:.625rem;font-size:11px;opacity:.85}.vis-labelset .vis-label.tl-user-row .vis-inner{width:100%;max-width:264px}.tl-user{display:flex;align-items:flex-start;gap:5px;min-width:0;width:100%}.tl-user-main{display:flex;flex-direction:column;min-width:0;flex:1 1 auto;gap:1px}.tl-user-name-line{display:flex;align-items:center;gap:5px;min-width:0}.tl-collapse-caret{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:-1px;padding:0;border:0;border-radius:3px;background:transparent;color:#9ca3af;font-size:13px;line-height:1;cursor:pointer}.tl-collapse-caret:hover{background:#7878782e;color:#374151}.dark .tl-collapse-caret:hover{color:#e5e7eb}.tl-focus-active .tl-collapse-caret{display:none}.tl-user-avatar{flex:none;width:18px;height:18px;border-radius:9999px;-o-object-fit:cover;object-fit:cover;background:#e5e7eb}.dark .tl-user-avatar{background:#374151}.tl-user-avatar-fallback{display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#6b7280}.tl-user-name{font-size:12.5px;font-weight:600;flex:0 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tl-user-name-link{color:inherit;text-decoration:none;cursor:pointer}.tl-user-name-link:hover{text-decoration:underline}.tl-merger{flex:none;display:inline-flex;align-items:center}.tl-user-stats{display:flex;flex-wrap:wrap;align-items:center;gap:3px 8px;font-size:11px;color:#6b7280}.dark .tl-user-stats{color:#9ca3af}.tl-stat{display:inline-flex;align-items:center;gap:2px;white-space:nowrap}.tl-stat svg{display:block}.tl-prs{gap:5px}.tl-pr{display:inline-flex;align-items:center;gap:2px}.tl-pr-dot{display:inline-block;width:6px;height:6px;border-radius:9999px}.tl-modal-header{display:flex;align-items:center;gap:6px;padding:4px 8px;cursor:move;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;border-bottom:1px solid #e5e7eb;background:#f9fafb;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.dark .tl-modal-header{border-color:#374151;background:#11182799}.tl-modal-header:active{cursor:grabbing}.tl-grip{flex:none;color:#9ca3af}.tl-modal-title{font-size:11px;color:#9ca3af;margin-right:auto}.tl-modal-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:4px;font-size:12px;line-height:1;color:#9ca3af;cursor:pointer}.tl-modal-close:hover{background:#94a3b833;color:#374151}.dark .tl-modal-close:hover{color:#e5e7eb}.vis-labelset .vis-label.tl-user-row,.vis-foreground .vis-group.tl-user-row{transition:max-height .22s ease,opacity .22s ease}@media(prefers-reduced-motion:reduce){.vis-labelset .vis-label.tl-user-row,.vis-foreground .vis-group.tl-user-row{transition:none}}.vis-labelset .vis-label.tl-user-row:nth-child(odd),.vis-foreground .vis-group.tl-user-row:nth-child(odd){background-color:transparent}.vis-labelset .vis-label.tl-user-row:nth-child(2n),.vis-foreground .vis-group.tl-user-row:nth-child(2n){background-color:#0f172a0b}.dark .vis-labelset .vis-label.tl-user-row:nth-child(2n),.dark .vis-foreground .vis-group.tl-user-row:nth-child(2n){background-color:#ffffff0d}.vis-labelset .vis-label.tl-user-row,.vis-foreground .vis-group.tl-user-row{box-shadow:inset 0 -2px #0f172a33}.dark .vis-labelset .vis-label.tl-user-row,.dark .vis-foreground .vis-group.tl-user-row{box-shadow:inset 0 -2px #ffffff29}.vis-item.vis-range.pr-bar{border-radius:6px;border-width:1px;color:#fff;font-size:11px;cursor:pointer;z-index:2;min-width:4px}.vis-item.pr-emph{font-size:11px}.vis-item.pr-muted{opacity:.85;font-size:10px}.vis-item.pr-muted .pr-title{max-width:16ch}.pr-status{display:flex;align-items:center;gap:5px;padding:1px 4px 2px;font-size:9px;line-height:1.2}.pr-ci{display:inline-block;width:7px;height:7px;border-radius:50%}.pr-warn{color:#fdba74;font-weight:700}.pr-new{color:#e0f2fe;font-weight:700}.pr-comment-mark{display:inline-flex;align-items:center;color:#e0f2fe;opacity:.85}.pr-comment-mark svg{display:block}.vis-item.pr-muted .pr-comment-mark{margin-left:2px;opacity:.75}.vis-item.pr-bar.pr-open{background-color:#1d4ed8;border-color:#3b82f6}.vis-item.pr-bar.pr-merged{background-color:#15803d;border-color:#22c55e}.vis-item.pr-bar.pr-closed{background-color:#4b5563;border-color:#9ca3af}.vis-item.pr-draft{background-image:repeating-linear-gradient(45deg,rgba(255,255,255,.12),rgba(255,255,255,.12) 4px,transparent 4px,transparent 8px)}.vis-item.pr-stalled{box-shadow:0 0 0 2px #ef4444}.vis-item.vis-selected.pr-bar{overflow:visible;z-index:5;animation:ev-select-pulse 1.8s ease-in-out infinite}.vis-item.pr-bar.pr-focus-hidden{display:none}@media(prefers-reduced-motion:reduce){.vis-item.vis-selected.pr-bar{animation:none;box-shadow:0 0 0 3px #38bdf8d9,0 0 12px 3px #38bdf880}}.vis-item.pr-bar.pr-cross-linked,.vis-item.ev-cross-linked .ev-marker-inner,.vis-item.ev-cross-linked .ev-cluster-inner{animation:ev-select-pulse 1.8s ease-in-out infinite}.vis-item.pr-bar.pr-cross-linked{overflow:visible;z-index:5}.vis-item.ev-cross-linked .ev-marker-inner,.vis-item.ev-cross-linked .ev-cluster-inner{position:relative;z-index:5}.vis-item.ev-cross-linked .ev-marker-inner{border-radius:9999px}@media(prefers-reduced-motion:reduce){.vis-item.pr-bar.pr-cross-linked,.vis-item.ev-cross-linked .ev-marker-inner,.vis-item.ev-cross-linked .ev-cluster-inner{animation:none;box-shadow:0 0 0 3px #38bdf8d9,0 0 12px 3px #38bdf880}}.vis-item.ev-exit-glow .ev-marker-inner,.vis-item.ev-exit-glow .ev-cluster-inner{position:relative;z-index:5;animation:ev-select-pulse 1.8s ease-in-out infinite}.vis-item.ev-exit-glow .ev-marker-inner{border-radius:9999px}@media(prefers-reduced-motion:reduce){.vis-item.ev-exit-glow .ev-marker-inner,.vis-item.ev-exit-glow .ev-cluster-inner{animation:none;box-shadow:0 0 0 3px #38bdf8cc,0 0 12px 3px #38bdf880}}@keyframes ev-select-pulse{0%,to{box-shadow:0 0 0 3px #38bdf8d9,0 0 14px 5px #38bdf88c}50%{box-shadow:0 0 0 5px #38bdf866,0 0 8px 2px #38bdf840}}.vis-item.ev-selected:not(.ev-cross-linked) .ev-marker-inner,.vis-item.ev-selected:not(.ev-cross-linked) .ev-cluster-inner{position:relative;z-index:5;animation:ev-select-pulse 1.8s ease-in-out infinite}.vis-item.ev-selected:not(.ev-cross-linked) .ev-marker-inner{border-radius:9999px}@media(prefers-reduced-motion:reduce){.vis-item.ev-selected:not(.ev-cross-linked) .ev-marker-inner,.vis-item.ev-selected:not(.ev-cross-linked) .ev-cluster-inner{animation:none;box-shadow:0 0 0 3px #38bdf8d9,0 0 12px 3px #38bdf880}}.pr-bar-inner{display:flex;align-items:center;gap:4px;padding:0 2px}.pr-num{font-weight:700;opacity:.85}.pr-avatar{border-radius:9999px;flex-shrink:0;vertical-align:middle}.pr-author{font-size:10px;opacity:.8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:12ch}.vis-item.pr-muted .pr-author{max-width:9ch}.pr-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:22ch}.pr-draft-tag{font-size:9px;text-transform:uppercase;background:#00000040;border-radius:3px;padding:0 3px}.pr-stall{color:#fca5a5}.pr-dots{display:inline-flex;align-items:center;gap:2px;margin-left:2px}.pr-dot{display:inline-block;width:7px;height:7px;border-radius:50%}.pr-dot-n{font-size:9px;font-weight:700;margin-right:3px}.vis-item.ev-marker,.vis-item.ev-cluster{background:transparent;border:none;box-shadow:none;pointer-events:none}.vis-item.ev-marker .vis-dot,.vis-item.ev-cluster .vis-dot{display:none}.vis-item.ev-marker .vis-item-content,.vis-item.ev-cluster .vis-item-content{transform:translate(-50%);padding:0}.ev-marker-inner{display:flex;align-items:center;justify-content:center;cursor:pointer;position:relative;pointer-events:auto}.ev-marker-inner svg{display:block}.ev-cluster-inner{display:flex;align-items:center;justify-content:center;gap:2px;min-width:18px;height:16px;padding:0 4px;border-radius:9px;background:#475569;color:#fff;font-size:10px;font-weight:700;line-height:1;cursor:pointer;border:1px solid rgba(255,255,255,.25);position:relative;pointer-events:auto}.vis-item.ev-cluster.vis-selected,.vis-item.ev-marker.vis-selected{background:transparent;box-shadow:none}.vis-item.vis-background.cross-sep{border-top:1px solid rgba(99,102,241,.38);background:#6366f10f;pointer-events:none}.dark .vis-item.vis-background.cross-sep{border-top-color:#818cf86b;background:#818cf817}.vis-item.ev-own .ev-marker-inner:after,.vis-item.ev-own .ev-cluster-inner:after{content:"";position:absolute;bottom:100%;left:50%;width:0;height:14px;border-left:1.5px solid rgba(203,213,225,.85);transform:translate(-50%);pointer-events:none}.vis-item.ev-own .ev-marker-inner.ev-round:after{bottom:calc(100% - 3px);height:17px}.vis-item.ev-cross .ev-marker-inner{border-radius:9999px;background:#6366f11a}.vis-item.ev-cross:not(.ev-selected):not(.ev-cross-linked):not(.ev-exit-glow) .ev-marker-inner{box-shadow:inset 0 0 0 1px #6366f16b}.vis-item.ev-cross:not(.ev-selected):not(.ev-cross-linked):not(.ev-exit-glow) .ev-cluster-inner{box-shadow:0 0 0 2px #6366f140}.dark .vis-item.ev-cross .ev-marker-inner{background:#818cf829}.dark .vis-item.ev-cross:not(.ev-selected):not(.ev-cross-linked):not(.ev-exit-glow) .ev-marker-inner{box-shadow:inset 0 0 0 1px #818cf885}.dark .vis-item.ev-cross:not(.ev-selected):not(.ev-cross-linked):not(.ev-exit-glow) .ev-cluster-inner{box-shadow:0 0 0 2px #818cf852}.vis-item.vis-point .vis-dot{border-width:5px}.ev-pr_opened .vis-dot{border-color:#3b82f6}.ev-pr_merged .vis-dot{border-color:#8957e5}.ev-pr_closed .vis-dot{border-color:#9ca3af}.ev-review_submitted .vis-dot{border-color:#22c55e}.ev-review_comment .vis-dot{border-color:#f59e0b}.ev-pr_comment .vis-dot{border-color:#a78bfa}.ev-commit_pushed .vis-dot{border-color:#6b7280;border-width:4px}.ev-diamond .vis-dot{border-radius:0;transform:rotate(45deg)}.ev-square .vis-dot{border-radius:2px}.comment-new{border-left:3px solid #38bdf8;margin-left:-2px;border-radius:1px;background:#38bdf80d}@keyframes activity-flash{0%{background:#38bdf847}to{background:#38bdf800}}.activity-flash{animation:activity-flash 1.8s ease-out forwards}@keyframes myturn-pulse{0%,to{box-shadow:0 0 0 1px #3b82f6e6}50%{box-shadow:0 0 0 2px #3b82f659}}.my-turn-ring,.vis-item.pr-myturn{animation:myturn-pulse 2s ease-in-out infinite}@media(prefers-reduced-motion:reduce){.my-turn-ring,.vis-item.pr-myturn{animation:none;box-shadow:0 0 0 1px #3b82f6e6}}.first\:pt-0:first-child{padding-top:0}.last\:mb-0:last-child{margin-bottom:0}.last\:pb-0:last-child{padding-bottom:0}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:border-red-400:hover{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.hover\:border-sky-400:hover{--tw-border-opacity: 1;border-color:rgb(56 189 248 / var(--tw-border-opacity, 1))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-400:hover{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200\/60:hover{background-color:#e5e7eb99}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-sky-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 249 255 / var(--tw-bg-opacity, 1))}.hover\:bg-sky-500\/25:hover{background-color:#0ea5e940}.hover\:text-blue-500:hover{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-sky-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(56 189 248 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus\:ring-offset-gray-950:focus{--tw-ring-offset-color: #030712}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:opacity-100{opacity:1}@media(prefers-reduced-motion:reduce){.motion-reduce\:transition-none{transition-property:none}}.dark\:divide-gray-800:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(31 41 55 / var(--tw-divide-opacity, 1))}.dark\:border-amber-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(217 119 6 / var(--tw-border-opacity, 1))}.dark\:border-amber-700\/60:is(.dark *){border-color:#b4530999}.dark\:border-blue-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.dark\:border-blue-900\/50:is(.dark *){border-color:#1e3a8a80}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-gray-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\:border-green-700\/60:is(.dark *){border-color:#15803d99}.dark\:border-red-700\/60:is(.dark *){border-color:#b91c1c99}.dark\:border-red-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(127 29 29 / var(--tw-border-opacity, 1))}.dark\:border-sky-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(3 105 161 / var(--tw-border-opacity, 1))}.dark\:border-t-blue-400:is(.dark *){--tw-border-opacity: 1;border-top-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.dark\:bg-amber-900\/20:is(.dark *){background-color:#78350f33}.dark\:bg-blue-900\/10:is(.dark *){background-color:#1e3a8a1a}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800\/50:is(.dark *){background-color:#1f293780}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900\/50:is(.dark *){background-color:#11182780}.dark\:bg-gray-900\/60:is(.dark *){background-color:#11182799}.dark\:bg-gray-900\/95:is(.dark *){background-color:#111827f2}.dark\:bg-green-900\/20:is(.dark *){background-color:#14532d33}.dark\:bg-red-900\/20:is(.dark *){background-color:#7f1d1d33}.dark\:bg-sky-900\/50:is(.dark *){background-color:#0c4a6e80}.dark\:text-amber-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-green-300:is(.dark *){--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-green-400\/80:is(.dark *){color:#4ade80cc}.dark\:text-green-500:is(.dark *){--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.dark\:text-orange-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-red-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-sky-300:is(.dark *){--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.dark\:text-sky-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:text-yellow-500:is(.dark *){--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.dark\:hover\:border-gray-500:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-amber-900\/40:hover:is(.dark *){background-color:#78350f66}.dark\:hover\:bg-blue-500:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-blue-900\/30:hover:is(.dark *){background-color:#1e3a8a4d}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-700\/60:hover:is(.dark *){background-color:#37415199}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-900:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-red-950:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(69 10 10 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-sky-900\/30:hover:is(.dark *){background-color:#0c4a6e4d}.dark\:hover\:text-gray-100:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}
|
package/public/index.html
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
href="https://fonts.googleapis.com/css2?family=Great+Vibes&display=swap"
|
|
17
17
|
rel="stylesheet"
|
|
18
18
|
/>
|
|
19
|
-
<script type="module" crossorigin src="/app/assets/index-
|
|
20
|
-
<link rel="stylesheet" crossorigin href="/app/assets/index-
|
|
19
|
+
<script type="module" crossorigin src="/app/assets/index-C3UqK6P1.js"></script>
|
|
20
|
+
<link rel="stylesheet" crossorigin href="/app/assets/index-xfGfsqU7.css">
|
|
21
21
|
</head>
|
|
22
22
|
<body>
|
|
23
23
|
<div id="root"></div>
|