@dendelion/paper-camp 0.14.0 → 0.15.0
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/app/assets/index-2ahHj0hk.js +7 -0
- package/dist/app/assets/index-2ahHj0hk.js.map +1 -0
- package/dist/app/assets/{index-D2zDC3YW.js → index-BSp1FE97.js} +2 -2
- package/dist/app/assets/{index-D2zDC3YW.js.map → index-BSp1FE97.js.map} +1 -1
- package/dist/app/assets/{index-C5as2mi1.js → index-BTyua-6D.js} +3 -3
- package/dist/app/assets/{index-C5as2mi1.js.map → index-BTyua-6D.js.map} +1 -1
- package/dist/app/assets/{index-DrOhvDGC.js → index-Bi4fur5H.js} +2 -2
- package/dist/app/assets/{index-DrOhvDGC.js.map → index-Bi4fur5H.js.map} +1 -1
- package/dist/app/assets/index-Bo0V9-3F.js +2 -0
- package/dist/app/assets/index-Bo0V9-3F.js.map +1 -0
- package/dist/app/assets/index-Cz9HEIaO.js +2 -0
- package/dist/app/assets/{index-BTh66TxZ.js.map → index-Cz9HEIaO.js.map} +1 -1
- package/dist/app/assets/{index-SjRbcqaJ.js → index-DKjtMMrA.js} +2 -2
- package/dist/app/assets/{index-SjRbcqaJ.js.map → index-DKjtMMrA.js.map} +1 -1
- package/dist/app/assets/main-BW24wv9K.js +207 -0
- package/dist/app/assets/main-BW24wv9K.js.map +1 -0
- package/dist/app/assets/main-C-ynmROL.css +1 -0
- package/dist/app/assets/{sidebar-section-BlseNbG8.js → sidebar-section-BHLbvk_X.js} +2 -2
- package/dist/app/assets/{sidebar-section-BlseNbG8.js.map → sidebar-section-BHLbvk_X.js.map} +1 -1
- package/dist/app/index.html +6 -6
- package/dist/app/toolbar.js +11684 -0
- package/dist/app/toolbar.js.map +1 -0
- package/dist/chunks/{scaffold.BL48Net9.js → parked-questions.BoAnCnQA.js} +814 -730
- package/dist/chunks/parked-questions.BoAnCnQA.js.map +1 -0
- package/dist/cli/index.js +7479 -7384
- package/dist/cli/index.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +85 -78
- package/dist/core/parked-questions.d.ts +6 -0
- package/dist/core/parked-questions.d.ts.map +1 -0
- package/dist/core/parked-questions.test.d.ts +2 -0
- package/dist/core/parked-questions.test.d.ts.map +1 -0
- package/dist/core/parse/parser.d.ts.map +1 -1
- package/dist/core/parse/schemas.d.ts +1 -0
- package/dist/core/parse/schemas.d.ts.map +1 -1
- package/dist/core/readers.d.ts.map +1 -1
- package/dist/core/release-notes.d.ts +4 -0
- package/dist/core/release-notes.d.ts.map +1 -0
- package/dist/core/release-notes.test.d.ts +2 -0
- package/dist/core/release-notes.test.d.ts.map +1 -0
- package/dist/core/serialize/serializer.d.ts +1 -0
- package/dist/core/serialize/serializer.d.ts.map +1 -1
- package/dist/core/trail.d.ts +6 -0
- package/dist/core/trail.d.ts.map +1 -1
- package/dist/types/index.d.ts +24 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -4
- package/dist/types/index.js.map +1 -1
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +28 -27
- package/dist/vite/index.js.map +1 -1
- package/package.json +5 -3
- package/dist/app/assets/index-BTh66TxZ.js +0 -2
- package/dist/app/assets/index-CXl1uFWF.js +0 -2
- package/dist/app/assets/index-CXl1uFWF.js.map +0 -1
- package/dist/app/assets/main-BC7PxPmE.js +0 -207
- package/dist/app/assets/main-BC7PxPmE.js.map +0 -1
- package/dist/app/assets/main-uLU_O3GC.css +0 -1
- package/dist/chunks/helpers.CUQjsQwc.js +0 -9
- package/dist/chunks/helpers.CUQjsQwc.js.map +0 -1
- package/dist/chunks/scaffold.BL48Net9.js.map +0 -1
- package/dist/toolbar/focus-panel.d.ts +0 -7
- package/dist/toolbar/focus-panel.d.ts.map +0 -1
- package/dist/toolbar/index.d.ts +0 -2
- package/dist/toolbar/index.d.ts.map +0 -1
- package/dist/toolbar/runs-panel.d.ts +0 -12
- package/dist/toolbar/runs-panel.d.ts.map +0 -1
- package/dist/toolbar/scout-panel.d.ts +0 -10
- package/dist/toolbar/scout-panel.d.ts.map +0 -1
- package/dist/toolbar/ship-panel.d.ts +0 -6
- package/dist/toolbar/ship-panel.d.ts.map +0 -1
- package/dist/toolbar/toolbar-element.d.ts +0 -7
- package/dist/toolbar/toolbar-element.d.ts.map +0 -1
- package/dist/toolbar/toolbar-idle.d.ts +0 -4
- package/dist/toolbar/toolbar-idle.d.ts.map +0 -1
- package/dist/toolbar/toolbar-idle.test.d.ts +0 -2
- package/dist/toolbar/toolbar-idle.test.d.ts.map +0 -1
- package/dist/toolbar/toolbar-link.d.ts +0 -7
- package/dist/toolbar/toolbar-link.d.ts.map +0 -1
- package/dist/toolbar/toolbar-shell.d.ts +0 -15
- package/dist/toolbar/toolbar-shell.d.ts.map +0 -1
- package/dist/toolbar/toolbar-shell.test.d.ts +0 -2
- package/dist/toolbar/toolbar-shell.test.d.ts.map +0 -1
- package/dist/toolbar/toolbar.d.ts +0 -2
- package/dist/toolbar/toolbar.d.ts.map +0 -1
- package/dist/toolbar/use-toolbar-shell.d.ts +0 -8
- package/dist/toolbar/use-toolbar-shell.d.ts.map +0 -1
- package/dist/toolbar.d.ts +0 -1
- package/dist/toolbar.js +0 -27019
- package/dist/toolbar.js.map +0 -1
package/dist/vite/index.js
CHANGED
|
@@ -1,47 +1,48 @@
|
|
|
1
|
-
import { r as
|
|
2
|
-
import { request as
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { r as i, a as l } from "../chunks/dev-port.CEt1H9LA.js";
|
|
2
|
+
import { request as m } from "node:http";
|
|
3
|
+
const f = "paper-camp-toolbar-script", b = "data-route";
|
|
4
|
+
function C(p, r, { port: t, host: a = "127.0.0.1" }) {
|
|
5
|
+
const e = m(
|
|
5
6
|
{
|
|
6
|
-
host:
|
|
7
|
+
host: a,
|
|
7
8
|
port: t,
|
|
8
|
-
path:
|
|
9
|
-
method:
|
|
10
|
-
headers: { ...
|
|
9
|
+
path: p.url ?? "/",
|
|
10
|
+
method: p.method,
|
|
11
|
+
headers: { ...p.headers, host: `${a}:${t}` }
|
|
11
12
|
},
|
|
12
|
-
(
|
|
13
|
-
r.writeHead(
|
|
13
|
+
(o) => {
|
|
14
|
+
r.writeHead(o.statusCode ?? 502, o.headers), o.pipe(r);
|
|
14
15
|
}
|
|
15
16
|
);
|
|
16
|
-
|
|
17
|
+
e.on("error", () => {
|
|
17
18
|
r.statusCode = 502, r.end(`paper-camp server is not reachable on port ${t} — run \`paper-camp dev\`.`);
|
|
18
|
-
}),
|
|
19
|
+
}), p.pipe(e);
|
|
19
20
|
}
|
|
20
|
-
const
|
|
21
|
-
function h(
|
|
22
|
-
let r =
|
|
21
|
+
const c = "/__camp";
|
|
22
|
+
function h(p = {}) {
|
|
23
|
+
let r = p.port, t = !0, a = c;
|
|
23
24
|
return {
|
|
24
25
|
name: "paper-camp-toolbar",
|
|
25
26
|
apply: "serve",
|
|
26
|
-
async configureServer(
|
|
27
|
-
r ?? (r = await
|
|
28
|
-
const
|
|
29
|
-
if (t = ((
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
async configureServer(e) {
|
|
28
|
+
r ?? (r = await i(e.config.root) ?? 3333);
|
|
29
|
+
const o = await l(e.config.root), d = e.config.mode === "production";
|
|
30
|
+
if (t = ((o == null ? void 0 : o.enabled) ?? !0) && (!d || (o == null ? void 0 : o.allowProduction) === !0), a = (o == null ? void 0 : o.route) ?? c, !t) return;
|
|
31
|
+
const n = r;
|
|
32
|
+
e.middlewares.use(a, (s, u) => {
|
|
33
|
+
C(s, u, { port: n });
|
|
33
34
|
});
|
|
34
35
|
},
|
|
35
|
-
transformIndexHtml(
|
|
36
|
-
return t ?
|
|
36
|
+
transformIndexHtml(e) {
|
|
37
|
+
return t ? e.replace(
|
|
37
38
|
"</body>",
|
|
38
|
-
`<script type="module" src="${
|
|
39
|
-
) :
|
|
39
|
+
`<script type="module" id="${f}" ${b}="${a}" src="${a}/toolbar.js"><\/script></body>`
|
|
40
|
+
) : e;
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
44
|
export {
|
|
44
|
-
|
|
45
|
+
c as CAMP_ROUTE,
|
|
45
46
|
h as default,
|
|
46
47
|
h as paperCamp
|
|
47
48
|
};
|
package/dist/vite/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/vite/proxy.ts","../../src/vite/index.ts"],"sourcesContent":["import { type IncomingMessage, type ServerResponse, request as httpRequest } from 'node:http';\n\nexport interface ProxyToCampServerOptions {\n port: number;\n host?: string;\n}\n\nexport function proxyToCampServer(\n req: IncomingMessage,\n res: ServerResponse,\n { port, host = '127.0.0.1' }: ProxyToCampServerOptions,\n): void {\n const proxyReq = httpRequest(\n {\n host,\n port,\n path: req.url ?? '/',\n method: req.method,\n headers: { ...req.headers, host: `${host}:${port}` },\n },\n (proxyRes) => {\n res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);\n proxyRes.pipe(res);\n },\n );\n proxyReq.on('error', () => {\n res.statusCode = 502;\n res.end(`paper-camp server is not reachable on port ${port} — run \\`paper-camp dev\\`.`);\n });\n req.pipe(proxyReq);\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { readConfigIntegration, readConfigPort } from '../cli/dev-port';\nimport { proxyToCampServer } from './proxy';\n\nexport const CAMP_ROUTE = '/__camp';\n\nexport interface PaperCampToolbarOptions {\n port?: number;\n}\n\nexport function paperCamp(options: PaperCampToolbarOptions = {}): Plugin {\n let resolvedPort = options.port;\n let enabled = true;\n let route = CAMP_ROUTE;\n\n return {\n name: 'paper-camp-toolbar',\n apply: 'serve',\n async configureServer(server: ViteDevServer) {\n resolvedPort ??= (await readConfigPort(server.config.root)) ?? 3333;\n const integration = await readConfigIntegration(server.config.root);\n const isProduction = server.config.mode === 'production';\n enabled =\n (integration?.enabled ?? true) && (!isProduction || integration?.allowProduction === true);\n route = integration?.route ?? CAMP_ROUTE;\n if (!enabled) return;\n const port = resolvedPort;\n server.middlewares.use(route, (req: IncomingMessage, res: ServerResponse) => {\n proxyToCampServer(req, res, { port });\n });\n },\n transformIndexHtml(html: string) {\n if (!enabled) return html;\n return html.replace(\n '</body>',\n `<script type=\"module\" src=\"${route}/toolbar.js\"></script></body>`,\n );\n },\n };\n}\n\nexport default paperCamp;\n"],"names":["proxyToCampServer","req","res","port","host","proxyReq","httpRequest","proxyRes","CAMP_ROUTE","paperCamp","options","resolvedPort","enabled","route","server","readConfigPort","integration","readConfigIntegration","isProduction","html"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/toolbar/route-attribute.ts","../../src/vite/proxy.ts","../../src/vite/index.ts"],"sourcesContent":["export const TOOLBAR_SCRIPT_ID = 'paper-camp-toolbar-script';\nexport const ROUTE_ATTRIBUTE = 'data-route';\n","import { type IncomingMessage, type ServerResponse, request as httpRequest } from 'node:http';\n\nexport interface ProxyToCampServerOptions {\n port: number;\n host?: string;\n}\n\nexport function proxyToCampServer(\n req: IncomingMessage,\n res: ServerResponse,\n { port, host = '127.0.0.1' }: ProxyToCampServerOptions,\n): void {\n const proxyReq = httpRequest(\n {\n host,\n port,\n path: req.url ?? '/',\n method: req.method,\n headers: { ...req.headers, host: `${host}:${port}` },\n },\n (proxyRes) => {\n res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);\n proxyRes.pipe(res);\n },\n );\n proxyReq.on('error', () => {\n res.statusCode = 502;\n res.end(`paper-camp server is not reachable on port ${port} — run \\`paper-camp dev\\`.`);\n });\n req.pipe(proxyReq);\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { readConfigIntegration, readConfigPort } from '../cli/dev-port';\nimport { ROUTE_ATTRIBUTE, TOOLBAR_SCRIPT_ID } from '../toolbar/route-attribute';\nimport { proxyToCampServer } from './proxy';\n\nexport const CAMP_ROUTE = '/__camp';\n\nexport interface PaperCampToolbarOptions {\n port?: number;\n}\n\nexport function paperCamp(options: PaperCampToolbarOptions = {}): Plugin {\n let resolvedPort = options.port;\n let enabled = true;\n let route = CAMP_ROUTE;\n\n return {\n name: 'paper-camp-toolbar',\n apply: 'serve',\n async configureServer(server: ViteDevServer) {\n resolvedPort ??= (await readConfigPort(server.config.root)) ?? 3333;\n const integration = await readConfigIntegration(server.config.root);\n const isProduction = server.config.mode === 'production';\n enabled =\n (integration?.enabled ?? true) && (!isProduction || integration?.allowProduction === true);\n route = integration?.route ?? CAMP_ROUTE;\n if (!enabled) return;\n const port = resolvedPort;\n server.middlewares.use(route, (req: IncomingMessage, res: ServerResponse) => {\n proxyToCampServer(req, res, { port });\n });\n },\n transformIndexHtml(html: string) {\n if (!enabled) return html;\n return html.replace(\n '</body>',\n `<script type=\"module\" id=\"${TOOLBAR_SCRIPT_ID}\" ${ROUTE_ATTRIBUTE}=\"${route}\" src=\"${route}/toolbar.js\"></script></body>`,\n );\n },\n };\n}\n\nexport default paperCamp;\n"],"names":["TOOLBAR_SCRIPT_ID","ROUTE_ATTRIBUTE","proxyToCampServer","req","res","port","host","proxyReq","httpRequest","proxyRes","CAMP_ROUTE","paperCamp","options","resolvedPort","enabled","route","server","readConfigPort","integration","readConfigIntegration","isProduction","html"],"mappings":";;AAAO,MAAMA,IAAoB,6BACpBC,IAAkB;ACMxB,SAASC,EACdC,GACAC,GACA,EAAE,MAAAC,GAAM,MAAAC,IAAO,eACT;AACN,QAAMC,IAAWC;AAAAA,IACf;AAAA,MACE,MAAAF;AAAA,MACA,MAAAD;AAAA,MACA,MAAMF,EAAI,OAAO;AAAA,MACjB,QAAQA,EAAI;AAAA,MACZ,SAAS,EAAE,GAAGA,EAAI,SAAS,MAAM,GAAGG,CAAI,IAAID,CAAI,GAAA;AAAA,IAAG;AAAA,IAErD,CAACI,MAAa;AACZ,MAAAL,EAAI,UAAUK,EAAS,cAAc,KAAKA,EAAS,OAAO,GAC1DA,EAAS,KAAKL,CAAG;AAAA,IACnB;AAAA,EAAA;AAEF,EAAAG,EAAS,GAAG,SAAS,MAAM;AACzB,IAAAH,EAAI,aAAa,KACjBA,EAAI,IAAI,8CAA8CC,CAAI,4BAA4B;AAAA,EACxF,CAAC,GACDF,EAAI,KAAKI,CAAQ;AACnB;ACxBO,MAAMG,IAAa;AAMnB,SAASC,EAAUC,IAAmC,IAAY;AACvE,MAAIC,IAAeD,EAAQ,MACvBE,IAAU,IACVC,IAAQL;AAEZ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAgBM,GAAuB;AAC3C,MAAAH,UAAkB,MAAMI,EAAeD,EAAO,OAAO,IAAI,KAAM;AAC/D,YAAME,IAAc,MAAMC,EAAsBH,EAAO,OAAO,IAAI,GAC5DI,IAAeJ,EAAO,OAAO,SAAS;AAI5C,UAHAF,MACGI,KAAA,gBAAAA,EAAa,YAAW,QAAU,CAACE,MAAgBF,KAAA,gBAAAA,EAAa,qBAAoB,KACvFH,KAAQG,KAAA,gBAAAA,EAAa,UAASR,GAC1B,CAACI,EAAS;AACd,YAAMT,IAAOQ;AACb,MAAAG,EAAO,YAAY,IAAID,GAAO,CAACZ,GAAsBC,MAAwB;AAC3E,QAAAF,EAAkBC,GAAKC,GAAK,EAAE,MAAAC,EAAA,CAAM;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,IACA,mBAAmBgB,GAAc;AAC/B,aAAKP,IACEO,EAAK;AAAA,QACV;AAAA,QACA,6BAA6BrB,CAAiB,KAAKC,CAAe,KAAKc,CAAK,UAAUA,CAAK;AAAA,MAAA,IAHxEM;AAAA,IAKvB;AAAA,EAAA;AAEJ;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dendelion/paper-camp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Local-first, AI-native project management with retro aesthetics",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.12.1",
|
|
@@ -32,8 +32,9 @@
|
|
|
32
32
|
"LICENSE"
|
|
33
33
|
],
|
|
34
34
|
"scripts": {
|
|
35
|
-
"build": "tsc && vite build && vite build --config vite.app.config.ts",
|
|
35
|
+
"build": "tsc && vite build && vite build --config vite.app.config.ts && vite build --config vite.toolbar.config.ts",
|
|
36
36
|
"build:app": "vite build --config vite.app.config.ts",
|
|
37
|
+
"build:toolbar": "vite build --config vite.toolbar.config.ts",
|
|
37
38
|
"dev": "vite --config vite.app.config.ts --port 3333",
|
|
38
39
|
"dev:lib": "vite",
|
|
39
40
|
"cli": "bun src/cli/index.ts",
|
|
@@ -46,7 +47,8 @@
|
|
|
46
47
|
"depcruise": "depcruise src --config .dependency-cruiser.cjs",
|
|
47
48
|
"consistency": "knip --include files,dependencies && depcruise src --config .dependency-cruiser.cjs",
|
|
48
49
|
"prepare": "husky",
|
|
49
|
-
"comment-stats": "node scripts/comment-stats.mjs"
|
|
50
|
+
"comment-stats": "node scripts/comment-stats.mjs",
|
|
51
|
+
"smoke": "node scripts/pack-smoke-test.mjs"
|
|
50
52
|
},
|
|
51
53
|
"keywords": [
|
|
52
54
|
"project-management",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as d,k as _,j as e,l as M,U as P,w as F,J as f,p as v,f as V,c as K,g as se,e as te,s as z,u as T,V as X,h as ae,a as Q,m as Z,P as ne,n as le,o as G,D,q as ie,A as O,t as q,v as oe,x as re,i as L}from"./main-BC7PxPmE.js";import{c as ce}from"./tokens-C3C44lLs.js";import{S as W}from"./sidebar-section-BlseNbG8.js";const de=async()=>{try{const s=await fetch("/api/merge-policy");return s.ok?await s.json():null}catch{return null}},me=async()=>{try{const s=await fetch("/api/merge-policy/apply",{method:"POST"});return s.ok?await s.json():null}catch{return null}},ee={allowSquashMerge:!0,allowMergeCommit:!1,allowRebaseMerge:!1,squashMergeCommitTitle:"PR_TITLE",squashMergeCommitMessage:"PR_BODY"},B=[{key:"allowSquashMerge",label:"Allow squash merge"},{key:"allowMergeCommit",label:"Allow merge commit"},{key:"allowRebaseMerge",label:"Allow rebase merge"},{key:"squashMergeCommitTitle",label:"Squash commit title"},{key:"squashMergeCommitMessage",label:"Squash commit message"}];function $(s){return typeof s=="boolean"?s?"Yes":"No":s}function pe(s){return B.every(t=>s[t.key]===ee[t.key])}const he=({label:s,current:t,recommended:r,isLast:l})=>{const p=t===r;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3 pb-2 pt-2",children:[e.jsx("span",{className:"flex-1",children:s}),e.jsx("span",{className:p?"opacity-[0.65] font-normal":"font-semibold",children:$(t)}),!p&&e.jsxs("span",{className:"opacity-[0.45]",children:["→ ",$(r)]})]}),!l&&e.jsx(v,{})]})},ue=()=>{const[s,t]=d.useState(void 0),[r,l]=d.useState(!1),{toast:p}=_();d.useEffect(()=>{de().then(t)},[]);const u=async()=>{l(!0);const n=await me();l(!1),(n==null?void 0:n.status)==="ok"?(t(n),p({title:"Merge policy applied",variant:"success"})):p({title:"Failed to apply merge policy",description:(n==null?void 0:n.status)==="unavailable"?n.reason:void 0,variant:"error"})},h=(s==null?void 0:s.status)==="ok"&&pe(s.policy);return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"m-0",children:"Merge Policy"}),e.jsx("p",{className:"opacity-50 mt-1",children:"Paper Camp's canonical policy: squash-only merges, with the commit title and body taken from the PR."})]}),s===void 0&&e.jsx("p",{children:"Loading…"}),s===null&&e.jsx(M,{variant:"warning",children:"Failed to load merge policy."}),(s==null?void 0:s.status)==="unavailable"&&e.jsx(M,{variant:"warning",children:s.reason}),(s==null?void 0:s.status)==="ok"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx("span",{className:"font-medium",children:s.repo}),e.jsx(P,{size:"small",fillColor:h?"rgba(143, 185, 150, 0.25)":"rgba(212, 163, 115, 0.25)",textColor:h?"#5E8A66":"#A67B4F",children:h?"Matches recommended policy":"Differs from recommended policy"})]}),e.jsx(F,{size:"small",texture:"kraft",children:B.map((n,c)=>e.jsx(he,{label:n.label,current:s.policy[n.key],recommended:ee[n.key],isLast:c===B.length-1},n.key))}),e.jsx("div",{className:"mt-4",children:e.jsx(f,{size:"small",onClick:u,disabled:r||h,children:r?"Applying…":"Apply recommended policy"})})]})]})},xe=2e3,je="agent:claude-code",ge=["claude auth login","claude setup-token"],fe=()=>e.jsxs("div",{className:"mt-2 flex flex-col gap-2",children:[e.jsx("p",{className:"opacity-[0.65] text-sm m-0",children:"The in-app relay couldn't complete. Run one of these in a terminal instead:"}),ge.map(s=>e.jsx(X,{code:s},s)),e.jsxs("p",{className:"opacity-50 text-sm m-0",children:["Alternatively, set ",e.jsx("code",{children:"ANTHROPIC_API_KEY"})," in the server's environment — that bills as API usage rather than your Max subscription, so treat it as a fallback, not the default."]})]}),be=({onSignedIn:s})=>{const t=T(c=>c.loginRelay),r=T(c=>c.startLoginRelay),l=T(c=>c.loadLoginRelayStatus),p=T(c=>c.cancelLoginRelay),{toast:u}=_(),h=d.useRef(null),n=t==null?void 0:t.phase;return d.useEffect(()=>{if(n!=="starting"&&n!=="awaiting-authorization")return;const c=window.setInterval(()=>l(),xe);return()=>window.clearInterval(c)},[n,l]),d.useEffect(()=>{const c=t==null?void 0:t.authorizeUrl;n!=="awaiting-authorization"||!c||h.current===c||(h.current=c,window.open(c,"_blank","noopener,noreferrer"))},[n,t==null?void 0:t.authorizeUrl]),d.useEffect(()=>{n==="success"?(u({title:"Signed in",variant:"success"}),s()):n==="error"&&u({title:"Sign-in failed",description:t==null?void 0:t.error,variant:"error"})},[n]),n==="starting"?e.jsx(f,{size:"small",disabled:!0,children:"Starting…"}):n==="awaiting-authorization"?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(f,{size:"small",onClick:()=>(t==null?void 0:t.authorizeUrl)&&window.open(t.authorizeUrl,"_blank","noopener,noreferrer"),children:"Reopen sign-in tab"}),e.jsx(f,{size:"small",onClick:()=>p(),children:"Cancel"})]}):e.jsxs("div",{children:[e.jsx(f,{size:"small",onClick:()=>r(),children:"Sign in"}),n==="error"&&e.jsx(fe,{})]})},ve={ok:{fill:"rgba(143, 185, 150, 0.25)",text:"#5E8A66",label:"Ready"},warn:{fill:"rgba(212, 163, 115, 0.25)",text:"#A67B4F",label:"Needs attention"},missing:{fill:"rgba(201, 139, 139, 0.25)",text:"#6E3A3A",label:"Missing"}},ye=({connection:s,onConnect:t,connecting:r})=>{const{connect:l}=s;return l?l.kind==="command"&&l.runnable?e.jsx(f,{size:"small",onClick:()=>t(s.id),disabled:r,children:r?"Running…":`Run \`${l.command}\``}):l.kind==="command"?e.jsx("div",{className:"mt-2",children:e.jsx(X,{code:l.command})}):l.kind==="link"?e.jsx(f,{size:"small",onClick:()=>window.open(l.url,"_blank","noopener,noreferrer"),children:l.label}):e.jsx("p",{className:"opacity-[0.65] text-sm mt-2 mx-0 mb-0",children:l.message}):null},Ne=({connection:s,isLast:t,onRecheck:r,rechecking:l,onConnect:p,connecting:u})=>{const h=ve[s.status];return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"pb-3 pt-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"flex-1 font-medium",children:s.label}),s.authenticated===!1&&e.jsx(se,{content:"Installed, but not signed in",children:e.jsx(P,{size:"small",variant:"warning",children:"Not signed in"})}),e.jsx(P,{size:"small",fillColor:h.fill,textColor:h.text,children:h.label}),e.jsx(f,{size:"small",onClick:()=>r(s.id),disabled:l,children:l?"Checking…":"Recheck"})]}),e.jsxs("p",{className:"opacity-[0.65] text-sm mt-1 mx-0 mb-0",children:["Unlocks: ",s.unlocks]}),e.jsx("p",{className:"opacity-50 text-sm mt-1 mx-0 mb-0",children:s.detail}),e.jsx("div",{className:"mt-2",children:s.id===je&&s.authenticated===!1?e.jsx(be,{onSignedIn:()=>r(s.id)}):e.jsx(ye,{connection:s,onConnect:p,connecting:u})})]}),!t&&e.jsx(v,{})]})},Se=()=>{const[s,t]=d.useState(null),[r,l]=d.useState(!1),[p,u]=d.useState(null),[h,n]=d.useState(null),[c,S]=d.useState(!1),{toast:y}=_(),N=d.useCallback(i=>{if(i===null){l(!0);return}l(!1),t(i)},[]);d.useEffect(()=>{V().then(N),K().then(i=>S((i==null?void 0:i.setupDismissed)??!1))},[N]);const A=async i=>{u(i),N(await V()),u(null)},m=async i=>{n(i);const b=await te(i);b?t(C=>(C==null?void 0:C.map(R=>R.id===i?b:R))??C):y({title:"Failed to connect",variant:"error"}),n(null)},x=async()=>{const i=!c,{ok:b}=await z({setupDismissed:i});b?(S(i),y({title:"Saved",variant:"success"})):y({title:"Failed to save",variant:"error"})},k=(s==null?void 0:s.every(i=>i.status==="ok"))??!0;return e.jsxs("div",{children:[e.jsx("div",{className:"mb-6",children:e.jsx("h2",{className:"m-0",children:"Setup"})}),s===null&&!r&&e.jsx("p",{children:"Loading…"}),r&&e.jsx("div",{className:"mb-4",children:e.jsx(M,{variant:"warning",children:"Failed to load connections. Try refreshing."})}),s&&e.jsxs(e.Fragment,{children:[!k&&e.jsx("div",{className:"mb-4",children:e.jsx(M,{variant:"warning",children:"Some connections are incomplete — features that depend on them stay disabled until fixed. Run the connect command below, then recheck."})}),e.jsx(F,{size:"small",texture:"kraft",children:s.map((i,b)=>e.jsx(Ne,{connection:i,isLast:b===s.length-1,onRecheck:A,rechecking:p===i.id,onConnect:m,connecting:h===i.id},i.id))}),e.jsx("div",{className:"mt-4",children:e.jsx(f,{size:"small",onClick:x,children:c?"Show Setup on open again":"Don't show Setup on open"})})]})]})},ke=()=>{const{subjects:s,loading:t,available:r}=ae(),l=Q();return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h2",{className:"m-0",children:"Subjects"}),e.jsx("p",{className:"opacity-50 mt-1",children:"Subjects are the roadmap's bets and standing concerns. Edit the vocabulary on the Roadmap page."})]}),t&&e.jsx("p",{children:"Loading…"}),!t&&!r&&e.jsx("p",{className:"opacity-60 m-0",children:"Couldn't load subjects — check the server config."}),!t&&r&&e.jsxs(F,{size:"small",texture:"kraft",children:[s.length===0&&e.jsx("p",{className:"opacity-[0.45] m-0 pb-2",children:"No subjects yet."}),s.map((p,u)=>e.jsxs("div",{children:[e.jsx("div",{className:"pb-2 pt-2",children:p}),u<s.length-1&&e.jsx(v,{})]},p)),s.length>0&&e.jsx(v,{}),e.jsx("div",{className:"pt-3",children:e.jsx(f,{size:"small",onClick:()=>l({to:"/roadmap"}),children:"Go to Roadmap"})})]})]})},J=["phase","planDraft","ideaExtend","commitSuggest","feedback"],we={phase:"Phase run",planDraft:"Plan draft",ideaExtend:"Idea extend",commitSuggest:"Commit suggest",feedback:"Scout chat"},Ae=140,Ce=160,Ee=110,Ie=()=>e.jsxs("div",{className:"flex items-center gap-3 pb-1",children:[e.jsx("span",{className:"w-[110px] shrink-0 text-sm opacity-[0.45]",children:"Task"}),e.jsx("span",{className:"w-[140px] shrink-0 text-sm opacity-[0.45]",children:"Agent"}),e.jsx("span",{className:"w-[160px] shrink-0 text-sm opacity-[0.45]",children:"Model"}),e.jsx("span",{className:"w-[110px] shrink-0 text-sm opacity-[0.45]",children:"Effort"})]}),De=({taskKey:s,agentConfig:t,isLast:r,onSave:l})=>{const p=O[t.agent]??O["claude-code"],u=p.model,h=p.effort,[n,c]=d.useState(t.model??"");d.useEffect(()=>{c(t.model??"")},[t.model]);const S=m=>{var b;const x=m,k=O[x],i={agent:x};t.model&&(k.model===null||(b=k.model)!=null&&b.includes(t.model))&&(i.model=t.model),t.effort&&Array.isArray(k.effort)&&(i.effort=t.effort),l(s,i)},y=m=>{l(s,{...t,model:m||void 0})},N=()=>{l(s,{...t,model:n||void 0})},A=m=>{l(s,{...t,effort:m||void 0})};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-3 pb-2 pt-2",children:[e.jsx("span",{className:"w-[110px] shrink-0 text-sm opacity-[0.65]",children:we[s]}),e.jsx(q,{size:"small",width:Ae,value:t.agent,onChange:S,options:oe.map(m=>({value:m,label:re[m]}))}),Array.isArray(u)?e.jsx(q,{size:"small",width:Ce,value:t.model??"",onChange:y,options:[{value:"",label:"Default"},...u.map(m=>({value:m,label:m}))]}):u===null?e.jsx(G,{size:"small",className:"w-[160px]",value:n,placeholder:"Default model",onChange:m=>c(m.target.value),onBlur:N}):null,e.jsx("div",{className:Array.isArray(h)?"visible":"invisible",children:e.jsx(q,{size:"small",width:Ee,value:t.effort??"",onChange:A,options:[{value:"",label:"Default"},...(Array.isArray(h)?h:[]).map(m=>({value:m,label:m}))]})})]}),!r&&e.jsx(v,{})]})},ze=()=>{var Y,H;const s=d.useRef(null),[t,r]=d.useState(void 0),{iconDataUri:l,loading:p}=le(),[u,h]=d.useState(null),n=u??l,[c,S]=d.useState(!1),[y,N]=d.useState(""),[A,m]=d.useState(""),{toast:x}=_();d.useEffect(()=>{K().then(a=>{r(a),(a==null?void 0:a.port)!==void 0&&N(String(a.port)),(a==null?void 0:a.projectName)!==void 0&&m(a.projectName)})},[]);const k=async(a,g)=>{const o=t==null?void 0:t.defaultAgents,j={phase:(o==null?void 0:o.phase)??D.phase,planDraft:(o==null?void 0:o.planDraft)??D.planDraft,ideaExtend:(o==null?void 0:o.ideaExtend)??D.ideaExtend,commitSuggest:(o==null?void 0:o.commitSuggest)??D.commitSuggest,feedback:(o==null?void 0:o.feedback)??D.feedback,[a]:g},{ok:w,error:E}=await z({defaultAgents:j});w?(r(I=>I&&{...I,defaultAgents:j}),x({title:"Saved",variant:"success"})):x({title:"Failed to save",description:E,variant:"error"})},i=async()=>{const a=Number(y);if(!t||!Number.isInteger(a)||a<=0||a===t.port)return;const{ok:g,error:o}=await z({port:a});g?(r(j=>j&&{...j,port:a}),x({title:"Saved",description:"Restart `paper-camp dev` to apply the new port.",variant:"success"})):x({title:"Failed to save",description:o,variant:"error"})},b=async()=>{var w,E,I;if(!t)return;const a=!(((E=(w=t.integration)==null?void 0:w.toolbar)==null?void 0:E.enabled)??!0),g={...t.integration,toolbar:{...(I=t.integration)==null?void 0:I.toolbar,enabled:a}},{ok:o,error:j}=await z({integration:g});o?(r(U=>U&&{...U,integration:g}),x({title:"Saved",variant:"success"})):x({title:"Failed to save",description:j,variant:"error"})},C=async()=>{const a=A.trim();if(!t||!a||a===t.projectName)return;const{ok:g,error:o}=await z({projectName:a});g?(r(j=>j&&{...j,projectName:a}),m(a),x({title:"Saved",variant:"success"})):x({title:"Failed to save",description:o,variant:"error"})},R=async a=>{var j;const g=(j=a.target.files)==null?void 0:j[0];if(!g)return;S(!0);const o=new FileReader;o.onloadend=async()=>{const w=o.result,E=await ie(w);S(!1),E?(h(w),x({title:"Saved",variant:"success"})):x({title:"Failed to save",variant:"error"})},o.readAsDataURL(g)};return e.jsxs("div",{children:[e.jsx("div",{className:"mb-6",children:e.jsx("h2",{className:"m-0",children:"Project Info"})}),t===void 0&&e.jsx("p",{children:"Loading…"}),t===null&&e.jsxs(M,{variant:"warning",children:["No papercamp/config.json found — run ",e.jsx("code",{children:"paper-camp init"})," in this directory first."]}),t&&e.jsxs(F,{size:"small",texture:"kraft",children:[e.jsxs("div",{className:"flex items-end gap-3 pb-3",children:[e.jsx(G,{value:A,onChange:a=>m(a.target.value),onBlur:C,label:"Project Name"}),e.jsxs(P,{size:"small",fillColor:"rgba(143, 185, 150, 0.25)",textColor:ce.accentGreenDark,children:["v",t.version]})]}),e.jsx(v,{}),e.jsxs("div",{className:"flex items-center gap-3 pb-3 pt-3",children:[n&&e.jsx("img",{src:n,alt:"Project icon",className:"w-10 h-10 object-contain shrink-0 rounded"}),e.jsxs("div",{children:[e.jsx("input",{ref:s,type:"file",accept:".svg,.png,.jpg,.jpeg,.gif,.webp",onChange:R,className:"hidden"}),e.jsx(f,{size:"small",onClick:()=>{var a;return(a=s.current)==null?void 0:a.click()},disabled:c,children:c?"Uploading…":"Choose File"}),p&&e.jsx("p",{className:"text-sm opacity-50 mt-1 mx-0 mb-0",children:"Loading…"}),!p&&!n&&!c&&e.jsx("p",{className:"text-sm opacity-[0.45] mt-1 mx-0 mb-0",children:"No icon set."})]})]}),e.jsx(v,{}),e.jsx("div",{className:"flex items-end gap-3 pb-3 pt-3",children:e.jsx(G,{type:"number",value:y,onChange:a=>N(a.target.value),onBlur:i,label:"Port",helperText:"Default for `paper-camp dev`. Restart the server to apply a change."})}),e.jsx(v,{}),e.jsxs("div",{className:"flex items-center justify-between gap-3 pb-3 pt-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"m-0",children:"In-app dev toolbar"}),e.jsx("p",{className:"opacity-[0.45] text-sm mt-1 mx-0 mb-0",children:"Inject the paper-camp toolbar into this project's dev server via the Vite plugin."})]}),e.jsx(f,{size:"small",onClick:b,children:((H=(Y=t.integration)==null?void 0:Y.toolbar)==null?void 0:H.enabled)??!0?"Disable":"Enable"})]}),e.jsx(v,{}),e.jsx(Ie,{}),J.map((a,g)=>{var o;return e.jsx(De,{taskKey:a,agentConfig:((o=t.defaultAgents)==null?void 0:o[a])??D[a],isLast:g===J.length-1,onSave:k},a)})]}),e.jsxs("p",{className:"opacity-[0.45] text-sm mt-4",children:[e.jsx("strong",{children:"Initialized:"})," ",t?new Date(t.initializedAt).toLocaleString():"—"]})]})},Le=()=>{const s=Z();return e.jsxs("div",{children:[e.jsx(ne,{children:"Settings"}),s==="subjects"?e.jsx(ke,{}):s==="setup"?e.jsx(Se,{}):s==="merge-policy"?e.jsx(ue,{}):e.jsx(ze,{})]})},Pe=()=>{const s=Z(),t=Q();return e.jsxs(e.Fragment,{children:[e.jsxs(W,{label:"General",children:[e.jsx(L,{size:"small",active:s===null,onClick:()=>t({to:"/settings"}),children:"Project Info"}),e.jsx(L,{size:"small",active:s==="setup",onClick:()=>t({to:"/settings/$section",params:{section:"setup"}}),children:"Setup"}),e.jsx(L,{size:"small",active:s==="merge-policy",onClick:()=>t({to:"/settings/$section",params:{section:"merge-policy"}}),children:"Merge Policy"})]}),e.jsx(W,{label:"Ideas",children:e.jsx(L,{size:"small",active:s==="subjects",onClick:()=>t({to:"/settings/$section",params:{section:"subjects"}}),children:"Subjects"})})]})};export{Le as SettingsPage,Pe as SettingsSidebar};
|
|
2
|
-
//# sourceMappingURL=index-BTh66TxZ.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as i,a as p,j as e,J as D,d as j,M as v,b as x,y as f,P as g,r as S,o as b,i as N}from"./main-BC7PxPmE.js";import{S as y}from"./sidebar-section-BlseNbG8.js";const h=(s,r)=>s.toLowerCase().includes(r.toLowerCase()),w=(s,r,t=120)=>{const l=s.toLowerCase().indexOf(r.toLowerCase());if(l===-1)return s.slice(0,t);const a=Math.max(0,l-40),n=Math.min(s.length,l+r.length+40);let d=s.slice(a,n);return a>0&&(d=`…${d}`),n<s.length&&(d=`${d}…`),d},T=({query:s})=>{const r=i(o=>o.repoDocs),t=i(o=>o.setActiveDocTitle),l=i(o=>o.setDocSearchQuery),a=p(),n=[];for(const o of r)(h(o.name,s)||h(o.content,s))&&n.push({title:o.name,snippet:w(o.content,s)});const d=o=>{a({to:"/docs/$section",params:{section:"repo-docs"}}),t(o),l("")};return n.length===0?e.jsxs("p",{className:"opacity-50",children:['No results found for "',s,'".']}):e.jsxs("div",{children:[e.jsxs("p",{className:"mb-3 text-sm opacity-50",children:[n.length," result",n.length===1?"":"s",' for "',s,'"']}),e.jsx("div",{className:"flex flex-col gap-1",children:n.map(o=>e.jsx(D,{variant:"ghost",size:"small",fullWidth:!0,onClick:()=>d(o.title),className:"justify-start px-3 py-2",children:e.jsxs("span",{className:"text-left",children:[e.jsx("span",{className:"mb-[0.2rem] block font-display-luminari text-[0.95rem] font-semibold",children:o.title}),e.jsx("span",{className:"text-sm opacity-60",children:o.snippet})]})},o.title))})]})},k=()=>{const s=i(a=>a.repoDocs),r=i(a=>a.activeDocTitle),t=s.find(a=>a.name===r);if(!t)return null;const l=t.name.endsWith(".md");return e.jsxs("div",{children:[e.jsx("h2",{className:`${j} m-0 mb-4`,children:t.name}),l?e.jsx("div",{className:"text-base leading-[1.7] text-ink-900",children:e.jsx(v,{children:t.content})}):e.jsx("pre",{className:"overflow-x-auto whitespace-pre-wrap rounded-md bg-black/[4%] p-4 font-mono text-xs leading-normal",children:t.content})]})},A=()=>{const s=i(n=>n.docSearchQuery),r=i(n=>n.activeDocTitle),t=p(),l=x(),a=()=>t({to:"/docs"});return s.trim()?e.jsx("div",{children:e.jsx(T,{query:s})}):l==="repo-docs"&&r?e.jsxs("div",{children:[e.jsx("div",{className:"mb-4",children:e.jsx(f,{items:[{id:"docs",label:"Docs",onClick:a},{id:"repo-doc",label:r}]})}),e.jsx(k,{})]}):e.jsxs("div",{children:[e.jsx(g,{children:"Docs"}),e.jsx("p",{className:"opacity-50",children:"Pick a doc from the sidebar — start with a repo doc if you're new here."})]})},C=s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),m=({children:s})=>e.jsx("span",{className:"block px-3 py-1 text-sm italic opacity-[0.35]",children:s}),R=()=>{const s=i(c=>c.repoDocs),r=i(c=>c.repoDocsLoading),t=i(c=>c.loadRepoDocs),l=i(c=>c.activeDocTitle),a=i(c=>c.setActiveDocTitle),n=i(c=>c.docSearchQuery),d=i(c=>c.setDocSearchQuery),o=x(),u=p();return S.useEffect(()=>{t()},[t]),e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"mb-4",children:e.jsx(b,{size:"small","aria-label":"Search docs",placeholder:"Search docs…",value:n,onChange:c=>d(c.target.value)})}),e.jsx(y,{label:"Repo Docs",children:r&&s.length===0?e.jsx(m,{children:"Loading…"}):s.length>0?s.map(c=>e.jsx(N,{size:"small",active:o==="repo-docs"&&l===c.name,onClick:()=>{u({to:"/docs/$section",params:{section:"repo-docs"}}),a(c.name)},children:C(c.name)},c.name)):e.jsx(m,{children:"No repo docs found"})})]})};export{A as DocsPage,R as DocsSidebar};
|
|
2
|
-
//# sourceMappingURL=index-CXl1uFWF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CXl1uFWF.js","sources":["../../../src/app/features/docs/components/docs-search.tsx","../../../src/app/features/docs/components/repo-doc-detail.tsx","../../../src/app/features/docs/docs-page.tsx","../../../src/app/features/docs/components/docs-sidebar.tsx"],"sourcesContent":["import { useAppStore } from '@/app/stores/app-store';\nimport { Button } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\n\ninterface SearchMatch {\n title: string;\n snippet: string;\n}\n\ninterface DocsSearchProps {\n query: string;\n}\n\nconst searchIn = (text: string, query: string): boolean =>\n text.toLowerCase().includes(query.toLowerCase());\n\nconst snippet = (text: string, query: string, maxLen = 120): string => {\n const idx = text.toLowerCase().indexOf(query.toLowerCase());\n if (idx === -1) return text.slice(0, maxLen);\n const start = Math.max(0, idx - 40);\n const end = Math.min(text.length, idx + query.length + 40);\n let s = text.slice(start, end);\n if (start > 0) s = `…${s}`;\n if (end < text.length) s = `${s}…`;\n return s;\n};\n\nexport const DocsSearch = ({ query }: DocsSearchProps) => {\n const repoDocs = useAppStore((s) => s.repoDocs);\n const setActiveDocTitle = useAppStore((s) => s.setActiveDocTitle);\n const setDocSearchQuery = useAppStore((s) => s.setDocSearchQuery);\n const navigate = useNavigate();\n\n const results: SearchMatch[] = [];\n\n for (const f of repoDocs) {\n if (searchIn(f.name, query) || searchIn(f.content, query)) {\n results.push({\n title: f.name,\n snippet: snippet(f.content, query),\n });\n }\n }\n\n const handleSelect = (title: string) => {\n navigate({ to: '/docs/$section', params: { section: 'repo-docs' } });\n setActiveDocTitle(title);\n setDocSearchQuery('');\n };\n\n if (results.length === 0) {\n return <p className=\"opacity-50\">No results found for \"{query}\".</p>;\n }\n\n return (\n <div>\n <p className=\"mb-3 text-sm opacity-50\">\n {results.length} result{results.length === 1 ? '' : 's'} for \"{query}\"\n </p>\n <div className=\"flex flex-col gap-1\">\n {results.map((m) => (\n <Button\n key={m.title}\n variant=\"ghost\"\n size=\"small\"\n fullWidth\n onClick={() => handleSelect(m.title)}\n className=\"justify-start px-3 py-2\"\n >\n <span className=\"text-left\">\n <span className=\"mb-[0.2rem] block font-display-luminari text-[0.95rem] font-semibold\">\n {m.title}\n </span>\n <span className=\"text-sm opacity-60\">{m.snippet}</span>\n </span>\n </Button>\n ))}\n </div>\n </div>\n );\n};\n","import { detailHeadingClassName } from '@/app/components/detail-heading-style';\nimport { Markdown } from '@/app/components/markdown';\nimport { useAppStore } from '@/app/stores/app-store';\n\nexport const RepoDocDetail = () => {\n const repoDocs = useAppStore((s) => s.repoDocs);\n const activeDocTitle = useAppStore((s) => s.activeDocTitle);\n\n const file = repoDocs.find((f) => f.name === activeDocTitle);\n if (!file) return null;\n\n const isMarkdown = file.name.endsWith('.md');\n\n return (\n <div>\n <h2 className={`${detailHeadingClassName} m-0 mb-4`}>{file.name}</h2>\n\n {isMarkdown ? (\n <div className=\"text-base leading-[1.7] text-ink-900\">\n <Markdown>{file.content}</Markdown>\n </div>\n ) : (\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-md bg-black/[4%] p-4 font-mono text-xs leading-normal\">\n {file.content}\n </pre>\n )}\n </div>\n );\n};\n","import { PageTitle } from '@/app/components/page-title';\nimport { useResolvedDocSection } from '@/app/hooks';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { Breadcrumb } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\nimport { DocsSearch } from './components/docs-search';\nimport { RepoDocDetail } from './components/repo-doc-detail';\n\nexport const DocsPage = () => {\n const docSearchQuery = useAppStore((s) => s.docSearchQuery);\n const activeDocTitle = useAppStore((s) => s.activeDocTitle);\n const navigate = useNavigate();\n const activeDocSection = useResolvedDocSection();\n\n const handleBackToDocs = () => navigate({ to: '/docs' });\n\n if (docSearchQuery.trim()) {\n return (\n <div>\n <DocsSearch query={docSearchQuery} />\n </div>\n );\n }\n\n if (activeDocSection === 'repo-docs' && activeDocTitle) {\n return (\n <div>\n <div className=\"mb-4\">\n <Breadcrumb\n items={[\n { id: 'docs', label: 'Docs', onClick: handleBackToDocs },\n { id: 'repo-doc', label: activeDocTitle },\n ]}\n />\n </div>\n <RepoDocDetail />\n </div>\n );\n }\n\n return (\n <div>\n <PageTitle>Docs</PageTitle>\n <p className=\"opacity-50\">\n Pick a doc from the sidebar — start with a repo doc if you're new here.\n </p>\n </div>\n );\n};\n","import { useResolvedDocSection } from '@/app/hooks';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { Input, ListItem } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useEffect } from 'react';\nimport { SidebarSection } from '../../plans/components/sidebar-section';\n\nconst simplecaseLabel = (name: string) =>\n name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n\nconst EmptyState = ({ children }: { children: React.ReactNode }) => (\n <span className=\"block px-3 py-1 text-sm italic opacity-[0.35]\">{children}</span>\n);\n\nexport const DocsSidebar = () => {\n const repoDocs = useAppStore((s) => s.repoDocs);\n const repoDocsLoading = useAppStore((s) => s.repoDocsLoading);\n const loadRepoDocs = useAppStore((s) => s.loadRepoDocs);\n const activeDocTitle = useAppStore((s) => s.activeDocTitle);\n const setActiveDocTitle = useAppStore((s) => s.setActiveDocTitle);\n const docSearchQuery = useAppStore((s) => s.docSearchQuery);\n const setDocSearchQuery = useAppStore((s) => s.setDocSearchQuery);\n const activeDocSection = useResolvedDocSection();\n const navigate = useNavigate();\n\n useEffect(() => {\n loadRepoDocs();\n }, [loadRepoDocs]);\n\n return (\n <>\n <div className=\"mb-4\">\n <Input\n size=\"small\"\n aria-label=\"Search docs\"\n placeholder=\"Search docs…\"\n value={docSearchQuery}\n onChange={(e) => setDocSearchQuery(e.target.value)}\n />\n </div>\n\n <SidebarSection label=\"Repo Docs\">\n {repoDocsLoading && repoDocs.length === 0 ? (\n <EmptyState>Loading…</EmptyState>\n ) : repoDocs.length > 0 ? (\n repoDocs.map((f) => (\n <ListItem\n key={f.name}\n size=\"small\"\n active={activeDocSection === 'repo-docs' && activeDocTitle === f.name}\n onClick={() => {\n navigate({ to: '/docs/$section', params: { section: 'repo-docs' } });\n setActiveDocTitle(f.name);\n }}\n >\n {simplecaseLabel(f.name)}\n </ListItem>\n ))\n ) : (\n <EmptyState>No repo docs found</EmptyState>\n )}\n </SidebarSection>\n </>\n );\n};\n"],"names":["searchIn","text","query","snippet","maxLen","idx","start","end","s","DocsSearch","repoDocs","useAppStore","setActiveDocTitle","setDocSearchQuery","navigate","useNavigate","results","f","handleSelect","title","jsxs","m","jsx","Button","RepoDocDetail","activeDocTitle","file","isMarkdown","detailHeadingClassName","Markdown","DocsPage","docSearchQuery","activeDocSection","useResolvedDocSection","handleBackToDocs","Breadcrumb","PageTitle","simplecaseLabel","name","EmptyState","children","DocsSidebar","repoDocsLoading","loadRepoDocs","useEffect","Fragment","Input","e","SidebarSection","ListItem"],"mappings":"sKAaA,MAAMA,EAAW,CAACC,EAAcC,IAC9BD,EAAK,cAAc,SAASC,EAAM,aAAa,EAE3CC,EAAU,CAACF,EAAcC,EAAeE,EAAS,MAAgB,CACrE,MAAMC,EAAMJ,EAAK,YAAA,EAAc,QAAQC,EAAM,aAAa,EAC1D,GAAIG,IAAQ,GAAI,OAAOJ,EAAK,MAAM,EAAGG,CAAM,EAC3C,MAAME,EAAQ,KAAK,IAAI,EAAGD,EAAM,EAAE,EAC5BE,EAAM,KAAK,IAAIN,EAAK,OAAQI,EAAMH,EAAM,OAAS,EAAE,EACzD,IAAIM,EAAIP,EAAK,MAAMK,EAAOC,CAAG,EAC7B,OAAID,EAAQ,IAAGE,EAAI,IAAIA,CAAC,IACpBD,EAAMN,EAAK,SAAQO,EAAI,GAAGA,CAAC,KACxBA,CACT,EAEaC,EAAa,CAAC,CAAE,MAAAP,KAA6B,CACxD,MAAMQ,EAAWC,EAAaH,GAAMA,EAAE,QAAQ,EACxCI,EAAoBD,EAAaH,GAAMA,EAAE,iBAAiB,EAC1DK,EAAoBF,EAAaH,GAAMA,EAAE,iBAAiB,EAC1DM,EAAWC,EAAA,EAEXC,EAAyB,CAAA,EAE/B,UAAWC,KAAKP,GACVV,EAASiB,EAAE,KAAMf,CAAK,GAAKF,EAASiB,EAAE,QAASf,CAAK,IACtDc,EAAQ,KAAK,CACX,MAAOC,EAAE,KACT,QAASd,EAAQc,EAAE,QAASf,CAAK,CAAA,CAClC,EAIL,MAAMgB,EAAgBC,GAAkB,CACtCL,EAAS,CAAE,GAAI,iBAAkB,OAAQ,CAAE,QAAS,WAAA,EAAe,EACnEF,EAAkBO,CAAK,EACvBN,EAAkB,EAAE,CACtB,EAEA,OAAIG,EAAQ,SAAW,EACdI,EAAAA,KAAC,IAAA,CAAE,UAAU,aAAa,SAAA,CAAA,yBAAuBlB,EAAM,IAAA,EAAE,SAI/D,MAAA,CACC,SAAA,CAAAkB,EAAAA,KAAC,IAAA,CAAE,UAAU,0BACV,SAAA,CAAAJ,EAAQ,OAAO,UAAQA,EAAQ,SAAW,EAAI,GAAK,IAAI,SAAOd,EAAM,GAAA,EACvE,QACC,MAAA,CAAI,UAAU,sBACZ,SAAAc,EAAQ,IAAKK,GACZC,EAAAA,IAACC,EAAA,CAEC,QAAQ,QACR,KAAK,QACL,UAAS,GACT,QAAS,IAAML,EAAaG,EAAE,KAAK,EACnC,UAAU,0BAEV,SAAAD,EAAAA,KAAC,OAAA,CAAK,UAAU,YACd,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,uEACb,SAAAD,EAAE,MACL,EACAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAsB,WAAE,OAAA,CAAQ,CAAA,CAAA,CAClD,CAAA,EAZKD,EAAE,KAAA,CAcV,CAAA,CACH,CAAA,EACF,CAEJ,EC5EaG,EAAgB,IAAM,CACjC,MAAMd,EAAWC,EAAaH,GAAMA,EAAE,QAAQ,EACxCiB,EAAiBd,EAAaH,GAAMA,EAAE,cAAc,EAEpDkB,EAAOhB,EAAS,KAAMO,GAAMA,EAAE,OAASQ,CAAc,EAC3D,GAAI,CAACC,EAAM,OAAO,KAElB,MAAMC,EAAaD,EAAK,KAAK,SAAS,KAAK,EAE3C,cACG,MAAA,CACC,SAAA,CAAAJ,EAAAA,IAAC,MAAG,UAAW,GAAGM,CAAsB,YAAc,WAAK,KAAK,EAE/DD,EACCL,EAAAA,IAAC,MAAA,CAAI,UAAU,uCACb,eAACO,EAAA,CAAU,SAAAH,EAAK,QAAQ,CAAA,CAC1B,EAEAJ,EAAAA,IAAC,MAAA,CAAI,UAAU,oGACZ,WAAK,OAAA,CACR,CAAA,EAEJ,CAEJ,ECpBaQ,EAAW,IAAM,CAC5B,MAAMC,EAAiBpB,EAAaH,GAAMA,EAAE,cAAc,EACpDiB,EAAiBd,EAAaH,GAAMA,EAAE,cAAc,EACpDM,EAAWC,EAAA,EACXiB,EAAmBC,EAAA,EAEnBC,EAAmB,IAAMpB,EAAS,CAAE,GAAI,QAAS,EAEvD,OAAIiB,EAAe,aAEd,MAAA,CACC,SAAAT,EAAAA,IAACb,EAAA,CAAW,MAAOsB,EAAgB,EACrC,EAIAC,IAAqB,aAAeP,SAEnC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAACa,EAAA,CACC,MAAO,CACL,CAAE,GAAI,OAAQ,MAAO,OAAQ,QAASD,CAAA,EACtC,CAAE,GAAI,WAAY,MAAOT,CAAA,CAAe,CAC1C,CAAA,EAEJ,QACCD,EAAA,CAAA,CAAc,CAAA,EACjB,SAKD,MAAA,CACC,SAAA,CAAAF,EAAAA,IAACc,GAAU,SAAA,MAAA,CAAI,EACfd,EAAAA,IAAC,IAAA,CAAE,UAAU,aAAa,SAAA,yEAAA,CAE1B,CAAA,EACF,CAEJ,ECzCMe,EAAmBC,GACvBA,EAAK,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAK,MAAM,CAAC,EAAE,YAAA,EAEzCC,EAAa,CAAC,CAAE,SAAAC,CAAA,IACpBlB,EAAAA,IAAC,OAAA,CAAK,UAAU,gDAAiD,SAAAkB,EAAS,EAG/DC,EAAc,IAAM,CAC/B,MAAM/B,EAAWC,EAAaH,GAAMA,EAAE,QAAQ,EACxCkC,EAAkB/B,EAAaH,GAAMA,EAAE,eAAe,EACtDmC,EAAehC,EAAaH,GAAMA,EAAE,YAAY,EAChDiB,EAAiBd,EAAaH,GAAMA,EAAE,cAAc,EACpDI,EAAoBD,EAAaH,GAAMA,EAAE,iBAAiB,EAC1DuB,EAAiBpB,EAAaH,GAAMA,EAAE,cAAc,EACpDK,EAAoBF,EAAaH,GAAMA,EAAE,iBAAiB,EAC1DwB,EAAmBC,EAAA,EACnBnB,EAAWC,EAAA,EAEjB6B,OAAAA,EAAAA,UAAU,IAAM,CACdD,EAAA,CACF,EAAG,CAACA,CAAY,CAAC,EAGfvB,EAAAA,KAAAyB,WAAA,CACE,SAAA,CAAAvB,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAACwB,EAAA,CACC,KAAK,QACL,aAAW,cACX,YAAY,eACZ,MAAOf,EACP,SAAWgB,GAAMlC,EAAkBkC,EAAE,OAAO,KAAK,CAAA,CAAA,EAErD,QAECC,EAAA,CAAe,MAAM,YACnB,SAAAN,GAAmBhC,EAAS,SAAW,EACtCY,EAAAA,IAACiB,EAAA,CAAW,SAAA,WAAQ,EAClB7B,EAAS,OAAS,EACpBA,EAAS,IAAKO,GACZK,EAAAA,IAAC2B,EAAA,CAEC,KAAK,QACL,OAAQjB,IAAqB,aAAeP,IAAmBR,EAAE,KACjE,QAAS,IAAM,CACbH,EAAS,CAAE,GAAI,iBAAkB,OAAQ,CAAE,QAAS,WAAA,EAAe,EACnEF,EAAkBK,EAAE,IAAI,CAC1B,EAEC,SAAAoB,EAAgBpB,EAAE,IAAI,CAAA,EARlBA,EAAE,IAAA,CAUV,EAEDK,EAAAA,IAACiB,EAAA,CAAW,8BAAkB,CAAA,CAElC,CAAA,EACF,CAEJ"}
|